JVM_05 运行时数据区2-堆_1

1.堆的细分内存结构

  • JDK 7以前: 新生区+养老区+永久区

    • Young Generation Space:又被分为Eden区和Survior区 Young/New
    • Tenure generation Space: Old/Tenure
    • Permanent Space: Perm

在这里插入图片描述

  • JDK 8以后: 新生区+养老区+元空间

    • Young Generation Space:又被分为Eden区和Survior区 Young/New
    • Tenure generation Space: Old/Tenure
    • Meta Space: Meta

在这里插入图片描述

2.设置堆内存大小与OOM

在这里插入图片描述

public class HeapSpaceInitial {
    public static void main(String[] args) {

        //返回Java虚拟机中的堆内存总量
        long initialMemory = Runtime.getRuntime().totalMemory() / 1024 / 1024;
        //返回Java虚拟机试图使用的最大堆内存量
        long maxMemory = Runtime.getRuntime().maxMemory() / 1024 / 1024;

        System.out.println("-Xms : " + initialMemory + "M");//-Xms : 245M
        System.out.println("-Xmx : " + maxMemory + "M");//-Xmx : 3641M

        System.out.println("系统内存大小为:" + initialMemory * 64.0 / 1024 + "G");//系统内存大小为:15.3125G
        System.out.println("系统内存大小为:" + maxMemory * 4.0 / 1024 + "G");//系统内存大小为:14.22265625G

        try {
            Thread.sleep(1000000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

设置堆大小为600m,打印出的结果为575m,这是因为幸存者区S0和S1各占据了25m,但是他们始终有一个是空的,存放对象的是伊甸园区和一个幸存者区
在这里插入图片描述

3.年轻代与老年代

在这里插入图片描述

配置新生代与老年代在堆结构的占比

  • 默认-XX:NewRatio=2,表示新生代占1,老年代占2,新生代占整个堆的1/3

  • 可以修改-XX:NewRatio=4,表示新生代占1,老年代占4,新生代占整个堆的1/5

  • 在hotSpot中,Eden空间和另外两个Survivor空间缺省所占的比例是8:1:1(测试的时候是6:1:1),开发人员可以通过选项 -XX:SurvivorRatio 调整空间比例,如-XX:SurvivorRatio=8

  • 几乎所有的Java对象都是在Eden区被new出来的

  • 绝大部分的Java对象都销毁在新生代了(IBM公司的专门研究表明,新生代80%的对象都是“朝生夕死”的)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43141726/article/details/114803872