欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JVM 模拟Young GC及日志分析

程序员文章站 2022-05-06 08:50:12
...

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