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

时间:2022-12-28 11:53:35
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.吞吐量优先的应用:一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。尽可能回收掉大部分短期对象,较少中期的对象,而年老代存放长期存活对象