zoukankan      html  css  js  c++  java
  • 叫练手把手教你读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】边叫边练。

  • 相关阅读:
    CCF-CSP-201803-3 URL映射
    CCF-CSP-201803-2 碰撞的小球
    CCF-CSP-201803-1 跳一跳
    SSH协议基础学习
    关于Kali-linux2019.4系统安装后乱码问题
    git版本控制工具学习--修改分支名字
    Git版本控制工具操作学习系列-克隆项目
    python函数int()转型报错
    Centos关机与重启命令收集学习
    Git commit 提交规范 & 规范校验
  • 原文地址:https://www.cnblogs.com/jiaolian/p/14539923.html
Copyright © 2011-2022 走看看