- Throughput GC指定方式: -XX:+UseParallelOldGC 或 -XX:+UseParallelGC,两者的区别是,-XX:+UseParallelOldGC同时激活新生代并行垃圾回收和老年代的并行垃圾回收,亦即,Minor GC和Full GC都是多线程的;-XX:+UseParallelGC只会激活新生代的并行垃圾回收。也就是使用了-XX:+UseParallelOldGC会自动激活-XX:+UseParallelGC。
- 在生产系统中,推荐打印出垃圾收集日志,开销很小,但能提供很多信息。推荐的命令行选项的最小集:-XX:+PrintGCTimestamps -XX:+PrintGCDetails -Xloggc:<fileName>
-XX:+PrintGCDateStamps打印出的是日期,要求Java 6 Update 4及以上版本;-XX:+PrintGCTimeStamps打印出的是相对于JVM启动的时间偏移量。 - 老年代使用CMS(-XX:+UseConcMarkSweepGC),配合其使用的新生代垃圾收集器为多线程的ParNew;老年代使用Serial GC,配合其使用的新生代为单线程的DefNew。
- 为低等待时间(STW停顿)调优时,可以使用这两个选项:
- -XX:+PrintGCApplicationStoppedTime
- -XX:+PrintGCApplicationConcurrentTime
- 重视吞吐量和延迟的应用,应将-Xms和-Xmx设为一样,因为增加和缩小堆内存(包括老年代和新生代),需要Full GC。
- 几个内存设置选项:
- -XX:NewSize=<n>[g|m|k] —— 新生代的初始和最小内存。设置该选项时应该同时设置-XX:MaxNewSize=<n>[g|m|k].
- -XX:MaxNewSize=<n>[g|m|k] —— 新生代的最大内存。设置该选项时应该同时设置-XX:NewSize=<n>[g|m|k].
- -Xmn<n>[g|m|k] —— 将新生代的初始值、最小值、最大值设为同一个值。
- 如果-Xmx和-Xms设的值不同,此时使用了-Xmn,则Java堆的增加和缩小都不会影响新生代的大小。因此,使用-Xmn的时候,-Xmx和-Xms的值应该是一致的。
- -XX:PermSize=<n>[g|m|k] —— 永久代的初始和最小值。
- -XX:MaxPermSize=<n>[g|m|k] —— 永久代的最大值。
- 重视性能的应用应该将-XX:MaxPermSize和-XX:PermSize设成一样,因为永久代的增加和缩小需要Full GC。
- 新生代的对象promote进老年代时空间不足,以及永久代空间不足会触发Full GC。
- 老年代空间不足触发了Full GC,不管永久代空间是否足够,都会对永久代进行回收;永久代不足触发的Full GC,即使老年代空间足,也会回收老年代。
- 老年代Full GC之前,会进行Minor GC,除非设置了-XX:-ScavengeBeforeFullGC。
- 可通过这种方式触发Full GC:jmap -histo:live <pid>,pid可以通过jps命令获得。
- 如果Minor GC太长,则应减小新生代的空间;若太频繁,则应增加新生代的空间。
- 调优改变新生代的大小时,尽量保持老年代的大小不变;调整老年代时,新生代保持不变。
[读书笔记]《Java Performance》GC(1)
最新推荐文章于 2021-11-06 16:35:26 发布