Java是一种伟大的语言。它管理内存,传授面向对象的编程(思想),使我们更好地用它来编码。另外,它确实是一种“编写一次,到处运行“的语言。然而,Java应用程会遇到一些常见的开发者和应用者独耳熟能详的性能挑战。
内存泄露
Java的最大的好处之一是它能够管理内存模型。当对象不再使用时,Java会做清理工作。较旧的语言需要人工来管理内存,但开发者宁愿花时间专注于核心语言逻辑而不愿为内存分配而忧心。
话虽如此,却不能保证Java的内存管理没有问题,提供管理内存模型,或创建/销毁未使用的对象,(这些对象)都放在Java的“堆(Heap)“中,内存泄露通常是不正确编程的结果–通常,开发者没有消除某一对象的所有引用,因此,堆(空间)逐步耗尽,应用程序也将死机。
大多数人使用堆转储和/或事件探查器(profiler)来诊断内存泄漏。堆转储使你可看到哪个对象持有对集合的引用。它告诉你集合何处,但不能告诉你谁在存取该集合或其它能让你探究根源的特性。堆转储通常占用的空间也相当大,在千兆字节,分析并打开一个堆转储需要大量资源,然后读取它,并找出问题所在。
第二种方法,是组合堆转储和事件探查器,使你能接近点问题本质,但并不多。内存分析器尽力帮助您分析您的堆转储。他们有实时数据,现在可知道是谁创建的对象,但仍不知造成泄漏的真正根由。
堆转储和分析器都有益于开发和预生产,然而,一旦应用程序失控,分析器也不可用。隔离并解决内存泄漏最有效的方法来之一是通过事务(transaction)(管理)和代码路径分析。通过采取事务快照,可以获得问题所在及其原因,这通常会导致更少的停机时间和更好的MTTR。
缓慢的SQL
几乎每一应用程序都会使用JDBC数据库。应用中一个非常普遍的问题是糟糕的SQL的性能,这可有时由于字段未创建索引、获取的数据量太多或者其他原因所致。这会不利于应用的性能,因为大多数应用程序在每一应用请求中涉及很多SQL调用。
可能有很多造成SQL执行缓慢的原因,但是其中之一特别突出:对象-关系映射(ORM)。
ORM以成为将当今两大业务应用基础技术(面向对象的应用(Java,.NET)和关系数据库(Oracle、MySQL和PostgreSQL等))整合在一起的首选方法。今天的大多数应用采用关系数据库,对于许多开发人员而言,(ORM)这项技术可以消除需要升入探讨着两种技术如何相互作用的复杂度。然而,ORM使得应用需承受额外的负担,并极大地影响应用的性能,而一切表面上看起来很好。
在大多数情况下,检索数据所消耗的时间和占用资源的数量级远大于数据处理所需的时间及资源,因此,性能方面的考虑常包含访问和存储数据的工具和方法就不足为奇了。
虽然开发人员直观地使用(隐藏复杂性),但ORM在应用性能方面应占据很大的比重,以确保(开发人员)明白问题的实质。
线程/同步
由同步所产生的问题往往很难辨认,但是其对性能的影响却非常显著。
对同步的最根本的需要在于Java对并发的支持,这通过在相同的过程中执行不同的线程(thread)代码来实现。单独的线程之间可以共享相同的资源,以及内存中的对象。虽然是一种完成更多工作的有效方法(当以线程在等待I/O操作完成期间,另一线程可利用CPU来进行计算),但是也曝露出应用的干扰和一致性问题。
为防止这种情况,程序员在程序中引入“synchronized”关键字来强制并发线程的执行顺序。利用“synchronized”来防止线程在同一时间获得同一资源,并防止数据不一致。
然而在实践中,这个简单的机制却带来很大的副作用。现代企业的应用常采用多线程的实现模式,同时执行多个线程,对“共享”对象的争夺也随之加剧,同步将有效地强制并发处理转而为顺序执行。
目前,对于线程和同步问题没有银弹(silver bullet)。某些开发者依赖“防御”性编程方法,诸如加锁;而另一些开发者,则依赖STM(Software Transactional Memory Systems)来缓解这个问题。最好的开发组织是那些可以平衡代码审查/重写负担和性能问题的团队。
这些只是Java开发人员每天必须面对的应用性能问题,有许多有用的性能工作可以大大减少此类问题。
原文链接:http://java.dzone.com/articles/three-common-application
分享到:
相关推荐
### Java应用性能内存调优 #### 一、背景介绍 随着淘宝等大型电商平台的发展,每日的访问量达到了惊人的数量级。例如,Taobao每天的IPV(itemDetail)访问量超过1亿次,Detail机器每天的访问量达到了60万次。面对...
在构建高性能的大型分布式Java应用时,我们面临的是复杂的技术挑战和优化目标。要实现这样的系统,我们需要深入了解Java平台的特点,以及如何利用其优势来处理大规模数据和高并发请求。以下是一些关键的知识点: 1....
以下是几种常见的J2EE应用性能问题及其解决策略: 1. **数据库连接池太小**: - **症状**:在高负载下,应用组件的响应时间显著增加。 - **定位**:通过监测`getConnection()`调用来定位问题。 - **建议**:若`...
- Java是一种静态类型的、面向对象的语言,而JavaScript是动态类型的、基于原型的。这意味着Java在编译时需要确定变量类型,而JavaScript在运行时才确定。 - JavaScript主要用作浏览器中的脚本语言,而Java可以...
模块三主要讲解多线程性能调优,包括多线程编程的应用、线程安全性、多线程高并发带来的性能问题等。 模块四:JVM 性能监测及调优 模块四主要讲解 JVM 性能监测及调优,包括 Java 对象的创建和回收、内存分配等。 ...
这个过程可能涉及到一些挑战,比如C++的模板、指针和运算符重载在Java中的映射,以及Java特有的垃圾回收机制与C++手动内存管理的差异。工具需要确保转换后的代码不仅语法正确,而且能保持原有的功能和性能。 安装...
### 实现分布式Java应用的挑战与解决方案 尽管Java提供了丰富的库和技术栈来支持分布式应用的开发,但在实际应用中仍面临许多挑战,例如: - **一致性问题**:在分布式系统中保持数据的一致性是一项复杂任务,需要...
本文将详细介绍10种Java性能优化策略,并重点解析文档中提到的几个关键点。 #### 二、hashCode() 方法优化 1. **背景**:`hashCode()` 方法在Java中用于快速查找对象。当对象存储在哈希表中时,例如`HashMap`,其...
在Java编程领域,"高级应用"通常涵盖了许多复杂且深入的主题,这些主题对于初学者来说可能是挑战性的,但同时也是提升技能的关键。本教程将带你深入理解Java语言的核心特性,并探讨如何在实际项目中有效地利用它们。...
在IT行业中,编程语言的选择和迁移是常见的挑战。Delphi,一种基于Pascal语言的集成开发环境(IDE),以其高效性和快速应用开发能力而受到欢迎。然而,随着业务和技术的发展,有时需要将Delphi(Pas)代码迁移到Java...
在IT行业中,Java作为一种强大的编程语言,被广泛用于开发各种应用程序,包括自动化测试工具和文件转换工具。在“java测试工具html转pdf”这个主题中,我们主要关注的是如何使用Java来实现HTML文档向PDF格式的转换。...
例如,Pentium III处理器上的Windows 2000操作系统搭配Sun HotSpot Client VM可以运行Java应用程序。虽然JVM架构层级较多,导致效率相对较低,但随着技术的发展,其性能已经得到显著提升,成为个人电脑上的主流Java...
下面将详细讨论它们之间的互转及其在Java中的实现。 1. **Word文档(.docx)与OOXML** - **OOXML(Open Office XML)**是微软制定的一种开放文档标准,用于存储Word、Excel和PowerPoint等文档。Word文档的现代版本...
Java作为一种广泛使用的面向对象编程语言,其强大的功能和跨平台特性使其成为企业和开发者的首选。 1. Java基础:教程首先会介绍Java的基础知识,包括语法、变量、数据类型、运算符、控制结构(如if语句、for循环、...
分布式Java应用是现代企业级软件开发中的重要组成部分,它涉及到多台计算机...通过学习和掌握这些知识,开发者将能够设计和实现复杂的企业级分布式Java应用,应对各种挑战,如高并发、大数据处理和系统间的协同工作。
在当今这个信息化飞速发展的时代,Java作为一门应用广泛的编程语言,支撑着无数的互联网应用和系统。...通过这本实战手册的学习,Java开发者们将能够更加自信地面对性能挑战,使自己的项目运行更加高效稳定。
在编程领域,C#和Java都是广泛应用的面向对象的编程语言,分别由微软和Sun Microsystems(现为Oracle)开发。由于两种语言各有优势,开发者有时需要在项目中将C#代码转换为Java,或者反之。针对这种需求,出现了专门...
分布式JAVA应用基础与实战是Java开发领域中的一个重要话题,它涉及到如何通过网络将多个独立的计算机节点连接起来,协同处理任务,以实现系统的高可用性、高性能和可伸缩性。这一主题通常涵盖多个关键知识点,包括但...
总结来说,"java游戏之GIF转字符GIF"项目展示了Java在图形处理和动画制作方面的潜力,同时也是一种对传统控制台输出的创新应用。它融合了图像处理、字符映射和动画原理,为开发者提供了一次独特而富有挑战性的编程...
Java转AS3.0工具是一种专门用于将Java编程语言编写的代码转换成ActionScript 3.0(AS3.0)代码的软件。这个工具对于那些希望在Adobe Flash平台上使用Java逻辑或者想要将已有的Java项目迁移到Flex或Flash开发环境的...