jvm-gc分代模型

372 阅读3分钟

这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战

分代模型

基于分代价说

1.弱分代:绝大多数对象朝生夕灭;

2.强分代:熬过越多次垃圾回收过程的对象越难以消灭。

3.跨代引用:跨代引用相对与同代引用来说是极少数。即存在引用关系的两个对象倾向于同时生存或同时消亡。由于老年代的难以消亡,导致被引用的新生代难以被回收,进而容易晋升成老年代而使跨代引用消除。

以此分成两个区域:

新生代

弱分代假说,绝大多数对象都朝生夕灭,活不多垃圾收集过程,每次回收只关注少量存活对象而不是去标记要被回收的对象

存活的对象将逐步晋升到老年代

如果新生代被老年代引用怎么办

如果去老年代中遍历所有对象来确保可达性分析的正确,会为内存增加极大负担。

根据跨代引用假说:不要为了少量引用去扫描整个老年代。只需要在新生代上建立一个全局的数据结构(记忆集)。这个结构把老年代划分成若干个小块,标识出老年代哪一块内存会存在跨代引用。当发生GC时,才会去这一小块内存中加入GC Roots中进行扫描

老年代

强分代假说,大多数对象难以消亡,以较低的频率进行垃圾回收

永久代-元空间

类加载器将Class 加载到永久代(1.7)或者元空间(1.8)

1.永久代必须制定大小限制,可能会发生内存溢出

2.元数据可以不设置,无上限(上限为物理内存)

3.字符串常量 在 1.7中存放在永久代 ,1.8中存放在堆中

堆中的逻辑分区

image.png

Appel式回收将新生代分成三个区域

新生区百分之90多的对象都会被回收,因此使用Copying算法

  • 新生代存放区域
  • Eden

    • 这个空间较大Eden和Survivor 和 的比例 为 8:1
  • Survivor1

  • Survivor2

  • 流程

每次分配内存时 使用Eden和一块Survivor区另一个Survivor用于存放垃圾回收YGC时存活的对象

当垃圾回收时,将Eden和Survivor0的存活的对象全部复制到Survivor1区域中,然后将Eden和Survivor0的区域全部清空。

  • 放不下怎么办

即10%的空间存储 存活对象。 如果不够,那么依赖其他内存区域(老年代)进行分配担保

  • 晋升

当一个对象经历过多次垃圾回收还是没有被消灭(年龄足够),就会进入老年区

如果老年代也满了,就会触发一次Full Gc ,全部垃圾回收。

FGC 会对全部堆内存进行垃圾回收,十分消耗资源,并且会STW 停止所有用户活动,尽量减少FGC 。


\