JVM-堆内存

2023-05-08  本文已影响0人  ssttIsme

堆空间在JVM中的位置属于中层。

一个Java程序运行起来后是一个进程,一个进程对应一个JVM实例,一个JVM实例中有一个运行时数据区,运行时数据区只有一个堆和一个方法区。一个进程可以有多个线程,一个进程中的多个线程共享同一个堆空间和共享一个方法区。每个线程各自拥有一套程序计数器、本地方法栈和虚拟机栈。

堆内存的大小是可以调节的。

堆并不是分配对象的唯一选择

堆内存细分

现代垃圾收集器大部分基于分代收集理论设计

存储在JVM中的Java对象可以被划分为两类:

Java堆内存进一步细分的话,可以划分为新生代(YongGen)和老年代(OldGen)
其中年轻代又可分为Eden空间(伊甸园)、Suvivor0空间(幸存者0区)和Suvivor1空间(幸存者1区)(有时也叫做from区、to区)

Java对象最先创建的位置是伊甸园,伊甸园死掉的对象直接回收,有的对象存活了就放在幸存者0区或1区,如果一定的时间(15GC cycles)对象还存活就放在老年代。


新生代与老年代的默认占比

新生代:老年代 1:2 新生代占整个堆1/3
Eden:幸存区1:幸存区2 8:1:1(实际上不一定 6:1:1)

测试阶段

jvisualvm.exe在JDK安装目录下,如C:\Program Files\Java\jdk1.8.0_122\bin





查看你自己安装的JDK版本,复制对应的链接

jdk1.7.0_79、jdk1.7.0_80、jdk1.8.0_40~jdk1.8.0_121:

请复制:https://visualvm.github.io/archive/uc/7u60/updates.xml.gz

jdk1.8.0_131~jdk1.8.0_271:

请复制:https://visualvm.github.io/uc/8u131/updates.xml.gz

https://visualvm.github.io/archive/uc/7u60/updates.xml.gz


package heap;

public class HeapDemo {

    public static void main(String[] args) {
        System.out.println("开始。。。");
        
        try {
            Thread.sleep(1000000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        System.out.println("结束。。。");
    }

}

-Xms10m -Xmx10m分配不同的堆空间,初始堆空间和最大堆空间


2.5m+0.5m+7m=10m

上一篇 下一篇

猜你喜欢

热点阅读