深入JVM内核---JVM性能优化

Posted 陈晓婵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入JVM内核---JVM性能优化相关的知识,希望对你有一定的参考价值。

持久代用来防止类、类的一些常量操作

     1.类和接口的全限定名

     2、字段的名称和描述符

     3、方法和名称和描述符

     两个原则

     1.一个是将转移到老年代的对象数量降到最少

     因为老年代空间上的GC处理会花费更多的时间,减少被转移到老年代对象的数据可以显著地减少Full GC的频率。可以通过调整新生代空间的大小。

     2、另一个是减少full GC的执行时间

     FULL GC的执行时间要比Minor GC要长的多,因此如果full gc花费了太多的时间的话,一些连接可能会发生超时的错误。如果视图通过减少老年代空间来减少full GC执行的时间,可能会导致OutofMemoryError或者full gc执行的次数会增加。

 

     是否需要进行gc优化

     一般情况下,如果GC执行的时间只有0.1--0.3秒的话,就没必要浪费时间去进行GC优化,但是如果GC执行的时间在1秒或者2秒以上的话,GC将势在必行。一般下面情况下就不需要进行GC优化了

     1.Minor GC执行的很快(小于50ms)

     2.Minor GC执行的并不频繁(大概10秒一次吧)

     3.Full GC执行的很快(小于1秒)

     4.FULL GC执行的并不频繁(10分钟一次)

 

     3.调整GC类型/内存空间

      选择调整合适的GC类型和设定内存空间,针对性的优化

     4.分析结果

     调整了GC参数后,持续收集24小时日志,进行结果分析。如果幸运的话,就找到最适合系统的GC参数,反之就需要分析日志来检查内存是如何来分配的。然后需要不断的调整GC类型和内存空间大小找到最佳的参数

     5.如何设定空间大小

     一般老年代我建议设置为500M,也就是一次fullgc后,如果老年代剩余300M的话,这就是300M(程序占用)+500(老年代最小空间)+200M(空闲内存)

     至于新生代和老年代之间的比例呢一般设置为1比1

 

     代码优化

     1、尽量在合适的地方使用单例

     2、尽量避免随意使用静态变量

     例如 A类里面有一个静态变量B,此时静态变量B的声明周期与类A同步,如果A不卸载的话,对象会常驻在内存,直到程序终止

     3、尽力避免过多的创建java对象

     例如在循环中new 对象,因为系统不仅需要花费时间来创建对象,而且还需要花费时间来进行垃圾回收

     4、尽量使用final修饰符

     首先final修饰符的类是不可派生的,并且java编译器会寻找机会内联所有的final方法,能够提高性能一半

     5、尽量使用局部变量

     调用方法时,参数传递的都是临时变量,保存在栈中,其他变量入静态变量实例变量都在Heap中创建。速度较慢

     6、慎用synchronized方法

     7、尽量使用stringbuilder和stringbuffer

     8、尽量不要使用finalize方法

     9、尽量使用基本类型代替对象

     10、单线程尽量使用hashmap、arraylist

     11、尽量合理的创建hashmap,避免进行hash重构

     12、尽量使用位移来代替A/B的操作。

以上是关于深入JVM内核---JVM性能优化的主要内容,如果未能解决你的问题,请参考以下文章

深入理解JVM - 系统性能优化

耗时一周深入理解JVM虚拟机异常处理字节码性能优化,全网最全面的JVM原理通俗易懂(强烈建议收藏)

火遍GitHub的这份JVM性能优化实践手册,首发下载量就已过百万

JVM中锁优化简介

深入理解JVM-性能监控工具

Tomcat与JVM性能优化