叫练手把手教你读JVM之GC信息

作者: 叫练

案例


众所周知,GC主要回收的是堆内存,堆内存中包含年轻代和老年代,年轻代分为Eden和Surivor,如下图所示。们用案例分析下堆的GC信息【版本:HotSpot JDK1.8】。

image.png

/**
 * @author :jiaolian
 * @date :Created in 2021-03-15 15:02
 * @description:新生代内存测试
 * @modified By:
 * 公众号:叫练
 */
public class NewGenTest {
    public static void main(String[] args) {
        //每次在Eden申请1M空间
        byte[] bytes = null;
        for (int i=0; i<5; i++) {
            bytes = new byte[1024*1024];
        }
    }
}

案例很简单,for循环运行5次,每次在Eden申请1M空间,假设们分配堆内存空间是20m,并打印GC详细信息,配置过程:-XX:+PrintGCDetails -Xmx20m。

  • -XX:+PrintGCDetails:打印GC详细信息。
  • -Xmx20m:分配最大堆内存空间是20m。

GC详细分析


运行程序,IDEA控制台打印结果如下:

  1. 第一句话:年轻代GC了一次,因为第五次循环,Eden满了,年轻代内存约6M(6144K),Eden回收前约5M(5057K),回收后是489K,年轻代内存回收前约是5M,回收后约是2M(1783K),总堆内存大小约是20M(19968K),GC耗时0.0016002 secs。
  2. 第二句话:年轻代总内存约6M,使用约5M。
  3. 第三句话:eden空间总内存约5M(5632K),使用率是94%。
  4. 第四句话:from是512K,使用率是95%。
  5. 第五句话:老年代总空间约14M(13824K),使用了1294K,这个使用空间是因为程序在Eden申请1M空间,判断空间不够,就申请from或者to空间,发现只有512K,就触发monitor GC,将1M内存申请在老年代。
  6. 第六句话:元空间内存。

image.png

  • -Xms 初始堆大小,不够时,会自动扩展,所以一般 Xms空间和 Xmx最大堆空间 设置成一样的。

上面程序不变,设置JVM参数,-XX:+PrintGCDetails -Xmx20m -Xms5m,运行程序,部分结果如下图所示。

image.png

如上图所示:初始化堆大小是5M,新生代内存一共发生了4次GC,从上图可以分析,Eden只有1M多内存可以被申请,所以第二次for循环申请1M空间就触发了GC,数据就被丢进老年代,连续3次后,GC堆的空间由5M变为了6M,说明初始化堆空间不够使,可以自动扩展堆内存。

当然们还可以通过-Xmn 设置年轻代大小。下面们看看年轻代中,Eden和from/to区域怎么划分。

上面程序不变,设置JVM参数,-XX:+PrintGCDetails -Xmx20m -Xmn10m -XX:SurvivorRatio=2 ,运行程序,部分结果如下图所示。

  • -Xmn10m :设置新生代内存为10m
  • -XX:SurvivorRatio=2:设置新生代中eden和 Survivor比例是2:1

image.png

们设置新生代是10M,这里显示新生代大小是7.5M(7680K),实际上from/to是有一块空间是每次GC做交换的区域(方便垃圾回收),所以实际上7680K=5120+2560。5120/2560=2,也就是新生代和 Survivor空间比例。

另外还有:-XX:NewRatio: 设置老年代和新生代比例,一般是1/3) 。比如设置-XX:NewRatio=2 -XX:+PrintGCDetails -Xmx30m 那么老年代空间是20M,新生代空间是10M。

总结


最后总结下:

  • -XX:+PrintGCDetails: 打印GC详细信息。
  • -Xmx20m: 分配最大堆内存空间是20m。
  • -Xmn10m :设置新生代内存为10m
  • -XX:SurvivorRatio=2:设置新生代中eden和 Survivor比例。
  • -XX:NewRatio: 设置老年代和新生代比例,一般是1/3)。

今天学习了JVM之GC信息参数配置,写的不全同时还有许多需要修正的地方,希望亲们加以指正和点评,喜欢的请点赞加关注哦。点关注,不迷路, 是【叫练公众号 ,微信号【jiaolian123abc】边叫边练。

[] ) [](top

原文创作:叫练

原文链接:https://www.cnblogs.com/jiaolian/p/14539923.html

文章列表

更多推荐

更多
  • Pulsar消息队列-一套高可用实时消息系统实现 实时消息【即时通信】系统,有群聊和单聊两种方式,其形态异于消息队列:1 大量的 group 信息变动,群聊形式的即时通信系统在正常服务形态下,瞬时可能有大量用户登入登出。2 ...
  • Pulsar消息队列-Pulsar对比Kafka笔记 很多人查看 Pulsar 之前可能对 Kafka 很熟悉,参照上图可见二者内部结构的区别,Pulsar 和 Kafka 都是以 Topic 描述一个基本的数据集合,Topic 数据又分为若干 Partition,即对数据进行逻辑上的 ...
  • Pulsar消息队列-对 2017 年一套 IM 系统的反思 信系统的开发,前前后后参与或者主导了六七个 IM 系统的研发。上一次开发的 IM 系统的时间点还是 2018 年,关于该系统的详细描述见 [一套高可用实时消息系统实现][1] ...
  • Apache InLong编译-如何编译 下载源码,编译二进制文件,编译Docker镜像,下载源码load/main/)下载源码. 编译二进制文件mvn clean install -DskipTests,编译Docker镜像 mvn clean package -...
  • Apache InLong编译-入库 Hive 示例 安装 Hive,安装 InLong,新建接入,审批接入,配置 Agent 采集文件, 本节用一个简单的示例,帮助您快速体验 InLong 的完整流程。 安装 Hivee,这里推荐使用 Docker 进行快速安装,在开始之前,我们需要安装 ...
  • Apache InLong编译-使用 Pulsar 示例 安装 Pulsar,安装 Hive,安装 InLong,创建数据接入,数据接入审批,配置 Agent 采集文件,数据落地检查,问题排查,配置数据流 Group 信息,配置数据流,配置文件 Agent,配置数据格式,配置 Hive ...
  • Apache InLong文档-Sort 插件 总览,扩展 Extract Node,扩展 Load Node,集成 Extract 和 Load Node 到 InLong Sort 主流程,总览 InLong Sort 是一个基于 Apache Flink SQL 的 ETL ...
  • Apache InLong文档-Dashboard 插件 总览,集成新的 Load Node 到 InLong Dashboard 的主流程,总览 本文面向 InLong新增一个 Load Node,让插件开发变得简单。 InLong Dashboard 本身作为前端控制台,Inlong ...
  • Apache InLong文档-Manager 插件 总览,扩展读取节点,扩展写入节点,总览 -, **Apache Kafka** , **ClickHouse** 等, 详细内容可参考 [数据节点] 扩展读取节点 -
  • Apache InLong文档-Agent 插件 总览,概念和模型,流程图示,开发流程,接口,任务配置,Message,Reader,Sink,Source,总览 在 Standard Architecture 支持以插件的方式扩展新的采集类型,本文将指导开发者如何自定义新的 ...
  • 近期文章

    更多
    文章目录

      推荐作者

      更多