堆的核心概述

  1. 堆的核心概述

多个线程共享堆空间
堆的核心概述

堆的核心概述

95%的垃圾回收集中在堆中,5%在方法区中

堆的核心概述

局部变量表(栈帧中)保存了引用,真实的对象存放在堆中,类信息和具体的方法实现保存在方法区中

堆内存的细分(GC垃圾回收选择)

堆的核心概述
堆的核心概述

堆空间的细分 永久区或者元空间具体是由方法区来落地实现的

也就是说在设置堆区的大小就是新生区+老年区 不包括元空间

新生区:伊甸园区 幸存者1区 幸存者2区 1区和2区只能选择一个使用

  1. 设置堆内存大小与OOM

堆的核心概述
堆的核心概述

开发中建议把初始内存和最大内存保持一致

避免堆空间的频繁的扩容和减小

OOM 超出了堆可用的最大空间

  1. 堆的核心概述

    Eden -> servivor1 或 servivor1 -> old Gen

    默认新生代和老年代空间的大小为 1:2

    比如堆空间为600M 则新生代默认大小为200M 老年代为400M

    新生代中的空间分配 Eden:s1:s2=8:1:1

堆的核心概述

  1. 图解对象分配过程

    为每个对象提供了年龄计数器

    伊甸园区满的时候才会触发YGC

    每一次调用YGC就会对对象的位置进行改变

    一旦进行了YGC,伊甸园区就被清空,如果是垃圾,就被回收,如果不是垃圾,就被方法幸存者区

    YGC根据年龄和是否被引用,判断对象的存储位置
    (Eden–> form --> to --> Old)

堆的核心概述

堆的核心概述

如果有一个超大对象,伊甸园区放不下,调用YGC,再去看伊甸园区放不放的下,还是放不下,就存放在老年区,如果老年区还是放不下,那么就会报OOM:

堆的核心概述

  1. MinorGC MajorGC FullGC

    MinorGC 和 YGC是完全一样的 会新生代进行GC

堆的核心概述

年轻代的GC

堆的核心概述

Minor GC会引发STW 就是防止表明垃圾之后,用户线程继续产生垃圾

老年代的MajorGC(尽量避免)

堆的核心概述

全局的FullGC(尽量避免)
堆的核心概述