JVM调优总结(参考深入理解Java虚拟机书籍)

1.堆大小设置:

最大的堆大小限制:操作系统的数据,虚拟机内存限制,物理内存限制

典型设置:-Xmx3550m -Xms3550m -Xmn2g -Xss128K

-Xmx3550m :设置JVM最大可用的内存3550M

-Xms3550M :设置JVM促使内存3550m。此值可以设置与-Xmx相同,以避免垃圾回收完成后JVM重新分配内存。

-Xmn2g
 :设置年轻代大小为2G。整个JVM内存大小 = 年轻代大小 + 年老代大小  + 持久代大小。持久代一般固定为64。增加年轻代,将会减少年老代。此值对系统的性能影响加大。

-Xss128K  :设置每个线程的堆栈大小为:128K

典型设置二:-Xms3550m -Xms3550 -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize = 16M -XX:MaxTenuringThreshold = 0

-XX:NewRatio = 4 : 设置年轻代(包括一个Eden和俩个Survivor区)与年老代的比值。年轻代与年老代所占的比值为1:4,年轻代占整个堆栈的1/5

-XX:SurvivorRation = 4 : 设置年轻代中Eden区与Survivor区的大小比值。设置为4,则俩个Survivor区与一个Eden区的比值为2:4,则一个Survivor占整个年轻代的1/6;

-XX:MaxPermSize = 16M:设置持久代大小为16M

-XX:MaxTenuringThreshold = 0:设置垃圾的最大的年龄。

 在实际的实战中,需要根据实际的机器的内存的大小进行配置

2.回收器选择:

JVM给了三种选择:串行收集器、并行收集器、并发收集器。串行收集器只适用于小数据量的情况。

1.吞吐量优先的并行收集器。

 典型配置:

 1.-Xms3g -Xmx3g -Xmn2g -Xss128K -XX:+UseParallelGC -XX:ParallelGCThreads=20

 -XX:+UseParallelGC:选择垃圾收集器为并行收集器,此配置仅对年轻代有效。此配置年轻代使用并发收集,而年老代仍然使用串行收集器

 -XX:ParallelGCThreads=20 :配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收,此值建议配置和处理器数目相等

 2.-Xmx3550m -Xms3550m -Xmn2g -Xss128K -XX:+useParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC

 -XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。

 3.-Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100

 -XX:MaxGCPauseMillis=100:设置年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻大大小,以满足此值

 4.-Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC  -XX:MaxGCPauseMillis=100 -XX:+UseAdaptiveSizePolicy:设置此选择后,并行收集器会自动选择年轻代去大小和响应的Survivor区比例,以达到目标系统规定的最低相应时间或者手机频率等,此值建议使用并行收集器,一直打开

2.响应时间优先的并发收集器

典型配置:

1.-Xmx3550m -Xms3550m -Xmn2g -Xss128K -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC 

-XX:+UseConcMarkSweepGC : 设置年老代为并发收集。

-XX:+UseParNewGC :设置年轻代为并行收集。可与CMS收集同时使用,JDK5以上,JVM会根据系统配置自行设置,所以无需再设置此值

2.-Xmx3550m -Xmn3550m -Xmn2g -Xss128K -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection

-XX:CMSFullGCsBeforeCompaction : 由于并发收集器不对内存空间进行压缩、整理所以运行一段时间后会产生碎片,使得运行效率降低。此值设置允许多少次GC以后对内存空间进行压缩、整理。

-XX:+UseCMSCompactAtFullCollection:打开对年老代的压缩。可能会影响性能,但是可以消除碎片

3.JVM 提供了很多的命令行参数,打印信息,供调试使用:

1.—XX:+PrintGC : 

2.-XX:+PrintGCDetails:

3.-XX:PrintGCTimeStamps:

4.-XX:PrintGCApplicationConcurrentTime:打印每次垃圾回收前,程序未中断的执行时间。

5.-XX:PrintHeapAtGC:打印GC前后的详细堆栈信息

4.常见的JVM的一些信息配置概念:

1.堆的设置:

-Xms : 初始化堆代销

-Xmx : 最大堆代销

-XX:NewSize = n : 设置年轻代大小

-XX:NewRatio = n : 设置年轻代和年老代的比值

-XX:SurvivorRatio = n : 设置年轻代中Eden区和俩个Survivor区的比值。如:Eden :Survivor = 3 :2 ,那么一个Survivor区占整个年轻代的1/5

-XX:MaxPermSize=n : 设置持久代大小

2.收集器设置:

-XX:+UseSerialGC : 设置串行收集器

-XX:+UseParallelGC:设置并行收集器

-XX:+UseParallelOldGC:设置并行年老代收集器

-XX:+UseConcMarkSweepGC:设置并发收集器

3.并行收集器设置:

-XX:ParallelGCThreads = n : 设置并行收集器收集时使用的CPU数。并行收集线程数

-XX:MaxGCPauseMillis = n :设置并行收集最大暂停时间

-XX:GCTimeRatio = n : 设置垃圾回收时间占程序运行时间的百分比。

4.并发收集器设置:

-XX:+CMSIncrementalMode : 设置为增量模式。使用于单CPU情况

-XX:ParallelGCThreads = n : 设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数

4.调优总结:

1.年轻代大小选择:

1.响应时间优先的应用:尽可能设置大,直接接近系统的最低响应时间限制。在这种情况下,年轻代收集发生的频率也是最小的。同时减少达到年老代的对象。

2.吞吐量优先的应用:尽可能的设置大。

2.年老代大小选择:

1.响应时间优先的应用:年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话频率和会话持续时间等一些参数。如果堆设置小了,可以会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大,则需要较长的收集时间。最优的方案:并发垃圾收集信息 持久代并发收集次数 传统GC信息  花在年轻代和年老代回收上的时间比例

2.吞吐量优先的应用:一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。尽可能回收掉大部分短期对象,较少中期的对象,而年老代存放长期存活对象

    原文作者:java虚拟机
    原文地址: https://blog.csdn.net/allenfancy/article/details/52776644
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞