前言
无论是YGC或是FullGC,都会导致stop-the-world,即整个程序停止一些事务的处理,只有GC进程允许以进行垃圾回收,因此如果垃圾回收时间较长,部分web或socket程序,当终端连接的时候会报connetTimeOut或readTimeOut异常,
从JVM调优的角度来看,我们应该尽量避免发生YGC或FullGC,或者使得YGC和FullGC的时间足够的短。
所谓调优,就是找到适合自己程序的配置(jvm配置,比如,老年代大小,新生代大小,线程数,垃圾回收器等等)
原文链接:https://blog.csdn.net/Javazhoumou/article/details/99298624
GC日志
GC日志分类
- Minor GC/Young GC,表示新生代GC,指发生在新生代的垃圾收集动作,所有的Minor GC都会触发全世界的暂停(stop-the-world),停止应用程序的线程,不过这个过程非常短。
- Major GC/ Full GC:老年代GC,指发生在老年代的 GC,也称之为 Full GC。
日志分析
Young GC回收日志:
日志内容如下: [GC (Allocation Failure) [PSYoungGen: 637744K->43513K(620544K)] 714874K->144918K(730624K), 0.0652514 secs] [Times: user=0.20 sys=0.05, real=0.07 secs]
GC (Allocation Failure) : 表示发送了GC类型, 以及GC的原因, 此处是 内存分配失败
Full GC回收日志:
日志内容如下: [Full GC (Ergonomics) [PSYoungGen: 43513K->23126K(620544K)] [ParOldGen: 101404K->109897K(221184K)] 144918K->133024K(841728K), [Metaspace: 77276K->76763K(1120256K)], 0.3217926 secs] [Times: user=1.55 sys=0.06, real=0.32 secs]
GC原因类型
Allocation Failure
内存分配失败导致的GC,常见于年轻代当中。
GCLocker Initiated GC
使用JNI临界区的方式操作数组或者字符串时,为了防止GC过程中jarray或者jstring发生位移,而导致数组指针失效,需要保持它们在JVM Heap中的地址在JNI Critical过程中保持不变。于是JVM实现了GC_locker,用于JNI Critical内阻止其他GC的发生。
当GCLocker被激活且需要发生GC的时候(这里是否需要GC是各种GC发生时,调用GCLocker::check_active_before_gc()函数check并设置_needs_gc = true的),就会阻塞其他线程进入JNI临界区;并且在最后一个位于JNI临界区的线程退出临界区时,发起一次CGCause为_gc_locker的GC。这里解释了GCLocker Initiated GC发生的原委。
Ergonomics
在JVM中的垃圾收集器中的Ergonomics就是负责自动的调解gc暂停时间和吞吐量之间的平衡,使你的虚拟机性能更好的一种做法。
简单说就是内存在进行分配的时候,会通过一些算法,预估是否会出现无法分配的问题。如果符合无法分配预估值,会提前进行一次gc。
Metadata GC Threshold
这个gc主要发生的条件是元空间,也就是Metadata的参数设置问题。如果不设置元空间的大小,会有一个默认值是21M。此时可以适当加大元空间内存, -XX:MetaspaceSize=128M
工具篇
使用工具: (java 自带分析工具)
jmap:生成虚拟机的内存转储快照(heapdump文件),使用mat软件打开并分析
JConsole:JMX的可视化管理工具
这个工具相比较前面几个工具,使用率比较高,很重要。它是一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。用java写的GUI程序,用来监控VM,并可监控远程的VM
- VisualVM:多合一故障管理工具
这个工具也很牛bility。它同jconsole都是一个基于图形化界面的、可以查看本地及远程的JAVA GUI监控工具,Jvisualvm同jconsole的使用方式一样,直接在命令行打入jvisualvm即可启动,jvisualvm界面更美观一些
https://baijiahao.baidu.com/s?id=1639024706303844305&wfr=spider&for=pc
有时间就玩一下吧
- 服务启动后, 这里会自动检测到,并显示出来
- 此处各种监控, 其中较为重要的是监控tab页; 其次是抽样器和线程, 抽样器能看到对象内存大小的变化
- 监控tab中,分为cpu/内存/类/线程 的变化
- 导出堆进行分析, (当前软件就能分析, 可导出多次)
20.GC日志详解及日志分析工具 - 盛开的太阳 - 博客园 (cnblogs.com)
JVM系列(四)GC日志分析 - 知乎 (zhihu.com)