GC定义
GC(Garbage Collection)是垃圾收集的意思,内存处理是程序员编码容易产生问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否需要进行垃圾回收。所以,Java的内存管理实际上就是对象的管理,其中包括对象的分配和释放。GC日志是分析GC相关问题的重要线索,即便是在生产服务器上,也建议开启,程序员应当学会通过相应工具理解和分析GC日志内容。
开启GC的方法
在JVM中设置参数 -verbose:gc 或-XX:+PrintGC,默认GC日志是关闭的。
GC命令其他重要的参数
-XX:+PrintGCDetails 创建更详细的GC日志,默认关闭;XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps 可用于分析GC之间的时间间隔,默认关闭,建议开启;
-Xloggc:filename 指定将GC日志输出到具体文件,默认为标准输出;
-XX:Number01GCLogtiles及-XX:UseGCLogfileRotation 控制日志文件循环,默认是0,即不作任何限制。
命令启动jar 生成gc日志
通过命令启动jar包,进行gc日志采集
java -Xms20m -Xmx20m -XX:+UseConcMarkSweepGC -XX:+PrintGC -verbose:gc -Xloggc:D:\gc.log
-XX:+PrintGCDetails -jar D:\lesson\new\idea\out\artifacts\memoryleak_jar\memoryleak.jar
上面的代码中d:\gc.log就是生成的gc日志,我们可以通过gc日志来查看Java程序的gc详情。
关于GC日志的分析讲解
以下面这段gc日志为例:
0.226: [GC (Allocation Failure) 0.226: [ParNew: 6144K->640K(6144K), 0.0167374 secs] 10568K->10863K(19840K), 0.0169029 secs] [Times: user=0.09 sys=0.02, real=0.02 secs]
ParNew(是新生代垃圾回收器)
6144K表示使用新生代GC前,占用的内存,->640k表示GC后占用的内存,(6144K)代表整个新生代总共大小,用时0.0167374 secs
10568K(GC前整个JVM Heap对内存的占用)->10863K(MinorGC后内存占用总量)(19840K)(整个堆的大小)0.0169029 secs(Minor GC消耗的时间)]
[Times: user=0.09 sys=0.02, real=0.02 secs] 用户空间,内核空间,real整个的时间消耗
[Full GC (Allocation Failure) 0.358: [CMS: 13695K->13346K(13696K), 0.0418278 secs] 19839K->18311K(19840K), [Metaspace: 3063K->3063K(1056768K)], 0.0419042 secs] [Times: user=0.05 sys=0.00, real=0.04 secs]
Full GC(表明是Full GC) CMS:(老年代GC)13695K(GC前多大)->13346K(GC后)(13696K)
老年代总容量 19839K(GC前整个Heap空间大小)->18311K(GC后整个Heap空间大小) (19840K) (整个Heap大小,JVM堆的大小),
[Metaspace: 3063K ->3063K (1056768K) (GC前后基本没变,空间很大)], 0.0419042 sec(GC的耗时,秒为单位)]
[Times: user=0.05 sys=0.00, real=0.04 secs](用户空间耗时,内核空间耗时,真正的耗时时间)
我的每一篇文章都希望帮助读者解决实际工作中遇到的问题!如果文章帮到了您,劳烦点赞、收藏、转发!您的鼓励是我不断更新文章最大的动力!