堆的核心概述
堆
- 堆的核心概述
多个线程共享堆空间
95%的垃圾回收集中在堆中,5%在方法区中
局部变量表(栈帧中)保存了引用,真实的对象存放在堆中,类信息和具体的方法实现保存在方法区中
堆内存的细分(GC垃圾回收选择)
堆空间的细分 永久区或者元空间具体是由方法区来落地实现的
也就是说在设置堆区的大小就是新生区+老年区 不包括元空间
新生区:伊甸园区 幸存者1区 幸存者2区 1区和2区只能选择一个使用
- 设置堆内存大小与OOM
开发中建议把初始内存和最大内存保持一致
避免堆空间的频繁的扩容和减小
OOM 超出了堆可用的最大空间
-
Eden -> servivor1 或 servivor1 -> old Gen
默认新生代和老年代空间的大小为 1:2
比如堆空间为600M 则新生代默认大小为200M 老年代为400M
新生代中的空间分配 Eden:s1:s2=8:1:1
-
图解对象分配过程
为每个对象提供了年龄计数器
伊甸园区满的时候才会触发YGC
每一次调用YGC就会对对象的位置进行改变
一旦进行了YGC,伊甸园区就被清空,如果是垃圾,就被回收,如果不是垃圾,就被方法幸存者区
YGC根据年龄和是否被引用,判断对象的存储位置
(Eden–> form --> to --> Old)
如果有一个超大对象,伊甸园区放不下,调用YGC,再去看伊甸园区放不放的下,还是放不下,就存放在老年区,如果老年区还是放不下,那么就会报OOM:
-
MinorGC MajorGC FullGC
MinorGC 和 YGC是完全一样的 会新生代进行GC
年轻代的GC
Minor GC会引发STW 就是防止表明垃圾之后,用户线程继续产生垃圾
老年代的MajorGC(尽量避免)
全局的FullGC(尽量避免)