JVM 模拟Young GC及日志分析

本篇文章主要是模拟一次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

 

你可能感兴趣的:(Java,Java,JVM)