在前两个CHAT中,我们JVM内存的划分、JVM如何确定一个对象是否为垃圾、垃圾回收算法、STOP THE WORLD问题和三色标记法,并盘点了各类JVM垃圾收集器,如果对以上内容还不太熟悉的读者建议翻看小编的前两篇作品。
本CHAT中,我们将结合前面两篇的知识,将理论用于实践,分析和优化JVM垃圾回收,侧重点在于分析流程、手段和解决办法。
调优目标确定目标是行动的第一步,我们在上一个CHAT中讲到,评价JVM垃圾回收器有三个指标:内存占用、吞吐量、延迟,并且是一个不可能三角在实际开展中,内存一定是有限的,不可能做到无限大,所以只能是在高吞吐量和低延迟上做取舍了。
那么,什么场景下我们会更在意高吞吐量,什么情况下我们又更在意低延迟呢?一般来讲,不直接面向客户的、异步的、批量的我们倾向于偏重高吞吐量,因为这是结果最优的方式;而直接面向客户的、联机的我们倾向于低延迟,这是客户体验和节点防超时的要求。
经典垃圾回收器的搭配使用垃圾回收器根据回收的堆区域不同,分为青年代垃圾回收器和老年代垃圾回收器,他们的组合使用不是任意的,组合关系见下图:
(垃圾回收器组合)考虑到,Serial回收器的性能问题,实际上我们通常选择是这样的,如果是追求高吞吐量,则选择Parallel Scavenge+Parallel Old组合;如果是追求低延迟,在1.8以后选择G1,在1.8之前选择ParNew+CMS组合
调优都可以调什么JVM调优我们究竟可以做些什么呢?第一个就是选择合适的垃圾回收器(硬件配置常常受限于通用规格和预算,这里不表);第二个就是设置升级年龄大小;第三个就是堆具体参数设置,包括日志、各区块大小等。
前面我们已经讲解了根据场景选择合适的垃圾回收器即回答了第一个调优点第二个调节点比较考究和复杂,其调整效果取决于青年代和老年代大小、程序对象存活特征,需要反复调试才能找到舒适点就直接效果来说,数字小一点,会尽早进入老年代,可能青年代导致清理不彻底引发fullGC,数字大一点,可能因为存储了大量长期消耗不掉的对象,引发OOM。
下面我们介绍一下第三个调优点也就是JVM调优常见参数和基本的监控工具JVM常见调优参数通用GC参数-Xmn:年轻代大小 -Xms:堆初始大小 -Xmx:堆最大大小 -Xss:栈大小-XX:+UseTlab:使用tlab,默认打开,涉及到对象分配问题。
-XX:+PrintTlab:打印tlab使用情况-XX:+TlabSize:设置Tlab大小-XX:+DisabledExplictGC:java代码中的System.gc()不再生效,防止代码中误写,导致频繁触动GC,默认不起用。
的堆信息-XX:+
PrintGCApplicationConcurrentTime 打印应用程序的时间-XX:+PrintGCApplicationStopedTime 打印应用程序暂停时间-XX:+PrintReferenceGC 打印回收多少种引用类型的引用
-verboss:class 类加载详细过程-XX:+PrintVMOptions 打印JVM运行参数-XX:+PrintFlagsFinal(+PrintFlagsInitial) -version | grep 查找想要了解的命令,很重要
-X:loggc:/opt/gc/log/path 输出gc信息到文件-XX:MaxTenuringThreshold 设置gc升到年龄,最大值为15parallel常用参数-XX:PreTenureSizeThreshold 多大的对象判定为大对象,直接晋升老年代
-XX:+ParallelGCThreads 用于并发垃圾回收的线程-XX:+UseAdaptiveSizePolicy 自动选择各区比CMS常用参数-XX:+UseConcMarkSweepGC 使用CMS垃圾回收器
-XX:parallelCMSThreads CMS线程数量-XX:CMSInitiatingOccupancyFraction 占用多少比例的老年代时开始CMS回收,默认值68%,如果频繁发生serial old,适当调小该比例,降低FGC频率
整理-XX:+CMSClassUnloadingEnabled 回收永久代
-XX:+CMSInitiatingPermOccupancyFraction 达到什么比例时进行永久代回收GCTimeTatio 设置GC时间占用程序运行时间的百分比,该参数只能是尽量达到该百分比,不是肯定达到
-XX:MaxGCPauseMills GCt停顿时间,该参数也是尽量达到,而不是肯定达到G1常用参数-XX:+UseG1 使用G1垃圾回收器-XX:MaxGCPauseMills GCt停顿时间,该参数也是尽量达到,G1会调整yong区的块数来达到这个值
-XX:+G1HeapRegionSize 分区大小,范围为1M~32M,必须是2的n次幂,size越大,GC回收间隔越大,但是GC所用时间越长G1NewSizePercent 新生代所占最小比例,默认5%
G1MaxNewSizePercent 新生代所占最大比例,默认60%GCTimeRatio GC时间比例,此值为建议值,G1会调整堆大小来尽量达到这个值ConcGCThreads GC线程数量InitiatingHeapOccupancyPercent 启动G1的堆空间占用比例
JVM分析基础工具jinfo pid,可以查看当前进行虚拟机的相关信息列举出来
(jinfo 命令)jstat -gc pid ms,多长毫秒打印一次gc信息,打印信息如下,里面包含gc测试,年轻代/老年代gc信息等:
(jstat 命令)jmap -histo pid | head -20,查找当前进程堆中的对象信息,加上管道符后面的信息以后,代表查询对象数量最多的20个:
(jmap 命令)以上就是本CHAT的内容,关注小编,更多精彩举报/反馈