一个简单案例,带你看懂GC日志!

本文通过一个简单的Java程序案例,详细解释了GC日志的含义,包括Young GC和Full GC的发生条件与过程。在案例中,由于内存分配导致的promotion failed问题触发了GC,展示了ParNew和CMS垃圾收集器的工作机制。文章还介绍了JVM内存管理和GC触发条件,并推荐了GC分析工具gceasy.io。
摘要由CSDN通过智能技术生成

环境准备

这样一个案例程序:

public class Main {

  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[128 * 1024];

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

我们采用如下参数来运行上述程序:

-XX:NewSize=10M -XX:MaxNewSize=10M -XX:InitialHeapSize=20M -XX:MaxHeapSize=20M -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=15 -XX:PretenureSizeThreshold=3M -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log

参数介绍:

-XX:NewSize:初始年轻代大小
-XX:MaxNewSize:最大年轻代大小
-XX:InitialHeapSize:定义堆的初始化大小,默认值是物理内存的1/64,其实就是:-Xms
-XX:MaxHeapSize:定义最大堆的大小,默认为物理内存的1/4,其实就是:-Xmx
-XX:SurvivorRatio:Eden区与Survivor区的大小比值
-XX:MaxTenuringThreshold:年轻代对象转换为老年代对象最大年龄值
-XX:PretenureSizeThreshold=3M:对象大小超过3M时直接在老年代分配内存
-XX:+UseParNewGC:使用ParNew收集器
-XX:+UseConcMarkSweepGC:使用CMS收集器
-XX:+PrintGCDetails:GC时打印详细信息
-Xloggc:输出GC日志信息到文件中

打印的GC日志情况:

0.118: [GC (Allocation Failure) 0.118: [ParNew (promotion failed): 8143K->8713K(9216K), 0.0043061 secs]0.122: [CMS: 8194K->6675K(10240K), 0.0038347 secs] 12239K->6675K(19456K), [Metaspace: 3042K->3042K(1056768K)], 0.0082981 secs] [Times: user=0.03 sys=0.01, rea
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值