JVM原理之运行时数据区详解原理之运行时数据区详解
4. 运行时数据区运行时数据区
关于运行时数据官方解释:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5
4.1 堆堆 (heap)
堆在虚拟机中是一块共享区域, 存放 对象实例 和数组;
堆在虚拟机启动的时候创建。
可调整堆的大小
堆内存不够的时候会发生OOM
java.lang.OutOfMemoryError: Java heap space 代码演示
/**
* 演示堆溢出
* 设置堆 大小为:-Xms10m -Xmx10m
*/
public class HeapDemo {
private static byte[] arry = new byte[1024*1024*12];
public static void main(String[] args) {
System.out.println(HeapDemo.arry);
}
}
4.1.1 堆图解堆图解
由前面介绍我们了解到,一般对象和数组的创建会在堆中分配内存,但是具体存放在堆中的那个区域呢?
4.1.2 堆的组成部分堆的组成部分
Young区 (新生代)
Eden区 ,s0区,s1区大小比例默认为:8:1:1
Eden
新建对象会分配在Eden区,除非特别大的对象会直接分配在Old去
假如有 A B C三个对象要在Eden区分配内存空间,但其实Eden区是有具体大小的,比如Eden区大小为100M,此时还剩余1M,已经不够给对象分配内存空间了,这个时候Eden区就
会做一次 垃圾回收,我们称之为 Minor GC(也就是Yong Gc) 。 经过GC之后,有些对象就会被清理,有些对象还存活着,将存活着的对象复制到 Survivor区,然后将Eden区这些对
象再清理
Survivor区(S0+S1)
由图解可知,Survivor区分为 S0,S1,也称为 from , to 区;
同一个时间点,S0和S1 只能有一个有数据,另一个是空的;
接着上述GC逻辑,Young GC的时候,Yong区对象年龄会+1,Eden区区存活的对象会复制到 to区(空的区(空的Survivor区域)区域),from区的数据有两个去处:
对象年龄没到设置的阈值(默认是15,也可设置-XX:MaxTenuringThreshold=6),from区区中的对象会复制到 to区区;到了设置阈值,会复制到 Old区。
Minor GC 会一直重复这样的过程,直到 to 区被填满,然后将所有对象复制到Old区
Old 区(老年代)