Java性能优化的策略与常见方法.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java性能优化的策略与常见方法

Java性能优化的策略和常见方法 Java性能优化的策略和常见方法 2011年11月17日   概述   随着Java的广泛应用,越来越多的关键企业系统也使用Java构建。作为Java核心运行环境的Java虚拟机JVM被广泛地部署在各种系统平台上。对Java应用的性能优化也越来越受到关注;谈到Java应用的性能问题就不得不涉及到两个方面:一是Java应用的构造是否是最优化的;二是对JVM的微调。本文将从一般意义上对Java性能的优化做一些总结。   Java性能优化的策略   一谈到性能优化,往往会被认为是应用开发和部署过程中或之后的事情,其实不然。如果想要构建一个最优化的系统,我们必须从该系统的需求分析和业务模型设计之初就要考虑到性能的最优化问题;当然对于一个已经构造好的系统来讲,我们能做的只是在不改变系统代码的前提下,尽量地在该系统的部署方案和运行环境上下功夫。由此,我们得出一个结论就是:所谓最优化是一个相对的概念,一个系统是否是最优化的,必须基于某个大前提来进行评判。因此,在进行优化分析之前一定要把握好前提条件是什么。      如上图所示,可以看出,对系统性能提高贡献最大、最明显的是从业务层面和架构层面所作的分析和优化;最不明显的是对系统平台和硬件层面以及网络层面的优化。因此在着手对目标系统进行优化分析之前,我们一定要从优化最明显、贡献最大的方面着手。这样有助于我们在最大程度上去提高系统性能。   以下我们将针对Java系统的性能优化,从代码编写和JVM两个角度着手,总结一下常见的方法和思路。   编写性能高效的Java代码   根据GC的工作原理,我们可以通过一些技巧和方式,让GC运行更加有效率,更加符合应用程序的要求。以下就是一些程序设计的几点建议:   1)避免对象创建和GC   只要有可能,应该避免创建对象,防止调用构造函数带来的相关性能成本,以及在对象结束其生命周期时进行垃圾收集所带来的成本。考虑以下这些准则: 只要有可能,就使用基本变量类型,而不使用对象类型。例如,使用 int,而不使用 Integer;   缓存那些频繁使用的寿命短的对象,避免一遍又一遍地重复创建相同的对象,并因此加重垃圾收集的负担;   在处理字符串时,使用 StringBuffer 而不使用字符串String进行连接操作,因为字符串对象具有不可变的特性,并且需要创建额外的字符串对象以完成相应的操作,而这些对象最终必须经历 GC;   避免过度地进行 Java 控制台的写操作,降低字符串对象处理、文本格式化和输出带来的成本;   实现数据库连接池,重用连接对象,而不是重复地打开和关闭连接;   使用线程池(thread pooling),避免不停地创建和删除线程对象,特别是在大量使用线程的时候;   避免在代码中调用GC。GC是一个“停止所有处理(stop the world)”的事件,它意味着除了 GC 线程自身外,其他所有执行线程都将处于挂起状态。如果必须调用 GC,那么可以在非紧急阶段或空闲阶段实现它;   避免在循环内分配对象。   尽早释放无用对象的引用。大多数程序员在使用临时变量的时候,都是让引用变量在退出活动域(scope)后,自动设置为null。我们在使用这种方式时候,必须特别注意一些复杂的对象,例如数组,队列,树,图等,这些对象之间的相互引用关系较为复杂。对于这类对象,GC回收它们一般效率较低。如果程序允许,尽早将不再使用的引用对象赋为null。这样可以加速GC的工作。   如果有经常使用的图片,可以使用soft引用类型。它可以尽可能将图片保存在内存中,供程序调用,而不引起Out Of Memory。   注意一些全局的变量,以及一些静态变量。这些变量往往容易引起悬挂对象(dangling reference),造成内存浪费。   2)Java Native Interface(JNI)   使用本机代码编写应用程序的一部分,特别是频繁使用的部分,并将之与 Java 链接,这样做通常是为了提高性能。不过,JVM 与本机代码之间的通信通常很慢,因此,太多的 JNI 调用可能会降低性能。只要有可能就应该将本机操作集合在一起,以减少 JNI 调用的数量。使用 JNI 代码本地处理异常,尽管有时不可避免,但会导致性能下降。在这种情况下,应该使用 ExceptionCheck() 函数,因为与 ExceptionOccurred() 相比较,它带来的计算开销更少一些。后者必须创建一个将引用的对象,以及一个本地引用。   3)同步   为了减少 JVM 和操作系统中的争用,应该只在可行的情况下才使用同步方法。不要将同步方法放到循环结构中。   4)数据结构   作为一条通用规则,

文档评论(0)

bokegood + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档