JVM——7.GC日志分析2(老年代GC)

本文详细探讨了JVM中老年代GC的执行流程和日志分析,通过实例展示了当新生代和老年代空间不足时,如何触发GC以及GC日志的关键信息。在分析中提到了'promotion failed'现象,解释了由于分配担保失败导致的老年代GC,以及Full GC如何清理新生代和老年代的垃圾对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 老年代GC

  • JVM参数:
-Xmx20m -Xms20m -Xmn10m -XX:SurvivorRatio=8  -XX:MaxTenuringThreshold=15 -XX:PretenureSizeThreshold=3m 
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:log/demo5.log
  • 示例代码:
public class Demo5 {
   

	public static void main(String[] args) {
   
		byte[] array1 = new byte[4 * 1024 * 1024];
		array1 = null;

		byte[] array2 = new byte[2 * 1024 * 1024];
		byte[] array3 = new byte[2 * 1024 * 1024];
		byte[] array4 = new byte[2 * 1024 * 1024];

		byte[] array5 = new byte[2 * 1024 * 1024];
	}
}

1.1 代码执行流程

JVM参数:

  • Xmx20m -Xms20m -Xmn10m -XX:SurvivorRatio=8:新生代10M,按比例Eden区8M,老年代10M;
  • -XX:PretenureSizeThreshold=3m,手动设置了大对象阈值为3M;

首先创建array1指向的4M的byte数组对象,它大于了大对象阈值,所以会直接进入老年代;
且把array1指向了null,即在老年代的这个4M对象是垃圾对象;

然后连续创建 array2、array3、array4指向的2M的byte数组对象,它们都一直被引用,且小于大对象阈值,所以它们都在新生代中;

在继续创建array5指向的2M对象的时候,由于Eden区大小为8M,此时放不下这个2M对象了,就会发生一次新生代GC(Young GC);
在发生这次GC的时候,array2、array3、array4的一共6M对象都是存活的,Survivor区肯定是放不下它们的,所以它们会通过分配担保原则进入老年代

在进入老年代的时候,此时老年代已经有了4M的对象;老年代大小为10M,可以放入array2,array3的4M对象,继续放入array4的2M对象时,老年代不够了,所以需要进行一次老年代GC来回收老年代,才能继续放入array4的2M对象;

1.2 GC日志分析

Java HotSpot(TM) 64-Bit Server VM (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值