本文共 2835 字,大约阅读时间需要 9 分钟。
本篇文章主要是模拟一次JVM发生一次Young GC的情况后对日志进行分析,为后面的模拟Full GC做准备。
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 1056768Kused:元数据空间当前使用的大小2645K。capacity:元数据空间当前分配的大小4486K。committed:元数据空间提交的大小4864K。reserved:元数据空间大小1056768K。class space used 282K, capacity 386K, committed 512K, reserved 1048576Kused:类空间当前使用的大小282Kcapacity:类空间当前分配的大小386Kcommitted:类空间提交的大小512Kreserved:类空间大小1048576K
转载地址:http://hgtnn.baihongyu.com/