本篇文章主要是模拟一次JVM发生一次Young GC的情况后对日志进行分析,为后面的模拟Full GC做准备。
github地址
1、JVM的参数设置
JDK1.8
-XX:InitialHeapSize=10485760 初始化堆大小10M
-XX:MaxHeapSize=10485760 最大堆大小10M
-XX:NewSize=5242880 初始化新生代大小5M
-XX:MaxNewSize=5242880 最大新生代大小5M
-XX:SurvivorRatio=8 新生代Eden和Survivor比例
-XX:MaxTenuringThreshold=15 动态年龄判定阈值
-XX:PretenureSizeThreshold=10486750 大对象阈值/对象大于10M直接进入老年代
-XX:+UseParNewGC 新生代使用ParNew垃圾收集器
-XX:+UseConcMarkSweepGC 老年代使用CMS垃圾收集器
-XX:+PrintGCDetails 打印详细的GC日志
-XX:+PrintGCTimeStamps 打印每次GC发生的时间
-Xloggc:gc.log 将GC日志写入一个磁盘文件
2、Java 代码
public class GCDemo_01 {
public static void main(String[] args) {
/**
* 创建三个1M大小的数组
* 将array_1设置为null
*/
byte[] array_1 = new byte[1024 * 1024];
array_1 = new byte[1024 * 1024];
array_1 = new byte[1024 * 1024];
array_1 = null;
/**
* 创建1M大小的数组
* Eden区域内存不够发生GC
*/
byte[] array_2 = new byte[1024 * 1024];
}
}
3、过程分析
1.新生代大小5M,Eden大小4M,from大小512K,to大小512K,JVM系统使用内存大小1M(测试得出)。
2.创建三个1M的数据,然后将其设置为null,表示其可以被GC回收。
3.此时Eden区域4M大小全部被使用,新建一个1M的数据,Eden区域内存不够触发YoungGC。
4、GC 日志
0.292: [GC (Allocation Failure) 0.293: [ParNew: 3964K->512K(4608K), 0.0359199 secs] 3964K->557K(9728K), 0.0359742 secs] [Times: user=0.00 sys=0.00, real=0.04 secs]
Heap
par new generation total 4608K, used 1577K [0x00000000ff600000, 0x00000000ffb00000, 0x00000000ffb00000)
eden space 4096K, 26% used [0x00000000ff600000, 0x00000000ff70a558, 0x00000000ffa00000)
from space 512K, 100% used [0x00000000ffa80000, 0x00000000ffb00000, 0x00000000ffb00000)
to space 512K, 0% used [0x00000000ffa00000, 0x00000000ffa00000, 0x00000000ffa80000)
concurrent mark-sweep generation total 5120K, used 45K [0x00000000ffb00000, 0x0000000100000000, 0x0000000100000000)
Metaspace used 2645K, capacity 4486K, committed 4864K, reserved 1056768K
class space used 282K, capacity 386K, committed 512K, reserved 1048576K
5、GC日志分析
1、GC发生的情况
0.292 表示系统运行多久后发生了本次GC,这里表示系统运行292毫秒后发生了此次GC。
GC(Allocation Failure) 表示GC发生的原因,内存不够对象分配失败了。
ParNew 表示垃圾收集器是ParNew。
3964K->512K 表示这次GC将年轻代的内存使用大小从3964K清理到512K,清理了3452K。
4608K 表示年轻代可以使用的大小 eden区域加上一个Survivor区域。
0.0359199 secs 表示这次GC使用的时间。
[Times: user=0.00 sys=0.00, real=0.04 secs] 表示这次GC消耗的时间。
2、GC过后堆内存使用情况
par new generation total 4608K, used 1577K 表示ParNew垃圾收集器管理4608K内存,现在适应了1577K内存。
eden space 4096K, 26% used 表示新生代eden区域4096K内存,使用了26%
from space 512K, 100% used 表示新生代fron区域512K内存,使用了100%
to space 512K, 0% used 表示新生代to区域512K内存,使用了0%
concurrent mark-sweep generation total 5120K, used 45K 表示老年代CMS垃圾收集器管理5120K内存,现在使用了45K内存。
Metaspace used 2645K, capacity 4486K, committed 4864K, reserved 1056768K
used:元数据空间当前使用的大小2645K。
capacity:元数据空间当前分配的大小4486K。
committed:元数据空间提交的大小4864K。
reserved:元数据空间大小1056768K。
class space used 282K, capacity 386K, committed 512K, reserved 1048576K
used:类空间当前使用的大小282K
capacity:类空间当前分配的大小386K
committed:类空间提交的大小512K
reserved:类空间大小1048576K