-
1.控制GC的行为:
GC是一个后台处理,但是它也是会消耗系统性能的,因此经常会根据系统运行的程序的特性来更改GC行为。 -
2.控制JVM堆栈大小:
JVM在内存分配上不需要你修改,但是当你的程序新生代对象在某个时间段产生的比较多的时候,就需要控制新生代的堆大小,同时,还要需要控制总的JVM大小避免内存溢出。 -
3.控制JVM线程的内存分配:
如果是多线程程序,产生线程和线程运行所消耗的内存也是可以控制的,需要通过一定时间的观测后,配置最优结果。
根据垃圾收集回收的区域不同,垃圾收集主要分为:
-
2.1 Young GC(又称Minor GC、YGC)
新生代内存的垃圾收集事件称为 Young GC(又称 Minor GC),当 JVM 无法为新对象分配在新生代内存空间时总会触发 Young GC。比如 Eden 区占满时,新对象分配频率越高,Young GC 的频率就越高。
Young GC 每次都会引起全线停顿(Stop-The-World),暂停所有的应用线程,停顿时间相对老年代 GC 造成的停顿,几乎可以忽略不计。
-
2.2 Old GC(又称Major GC)
只清理老年代空间的 GC 事件,只有 CMS 的并发收集是这个模式。 -
2.3 Full GC
清理整个堆的GC事件,包括新生代、老年代、元空间等 。 -
2.4 Mixed GC
清理整个新生代以及部分老年代的 GC,只有 G1 有这个模式。
3.1 堆设置
-Xms:初始堆大小-Xmx:最大堆大小-Xmn:新生代大小 -Xss:线程堆栈大小,默认为1M-XX:NewRatio=n:设置新生代和年老代的比值,默认为1:2。如为3,表示新生代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。默认为8:2 如:6,表示Eden:Survivor=6:4,一个Survivor区占整个年轻代的2/10-XX:MaxPermSize=n:设置持久代大小
3.2 收集器设置
-XX:+UseParallelGC:设置并行收集器-XX:+UseParalledlOldGC:设置并行年老代收集器-XX:+UseG1GC:使用G1做为GC收集器-XX:+UseConcMarkSweepGC:设置并发收集器CMS
3.3 垃圾回收统计信息
-XX:+PrintGC:输出形式: [GC 118250K->113543K(130112K), 0.0094143 secs] [Full GC 121376K->10414K(130112K), 0.0650971 secs]-XX:+PrintGCDetails:输出形式: [GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs] [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]-XX:+PrintGCTimeStamps:打印GC停顿耗时-XX:+PrintGCApplicationStoppedTime:打印垃圾回收期间程序暂停的时间.-XX:+PrintHeapAtGC:打印GC前后的详细堆栈信息-Xloggc:filename:把相关日志信息记录到文件以便分析.
3.4 并行收集器参数设置
-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。STW期间,并行GC线程数-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
3.5 并发收集器设置
-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数
4、实例
A/B-Test jvm调试,默认情况下,系统压测800qps,优化后能达到1000
优化参数:
-XX:NewRatio=1:设置新生代和年老代的比值为2:1
-Xss:线程堆栈大小,默认为1M,调整为512K
-XX:+UseG1GC:使用G1做为GC收集器
-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间为20ms