从原理聊 JVM(一):染色标记和垃圾回收算法

💡 原文中文,约4800字,阅读约需12分钟。
📝

内容提要

本文介绍了JVM内存划分和垃圾回收算法,包括标记-清除、标记-复制和标记-整理。同时介绍了分代模型、空间分配担保、记忆集和卡表的作用。标记-复制算法可使用eden和survivior区进行优化。后续将深入介绍CMS、G1、ZGC等垃圾收集器。

🎯

关键要点

  • JVM内存划分包括方法区、堆、虚拟机栈、本地方法栈和程序计数器。

  • 方法区存储类信息、常量和静态变量,JDK1.8之前为永久代,之后为元空间。

  • 堆用于存放对象实例和数组,线程共享,内存不足时抛出OutOfMemoryError。

  • 虚拟机栈和本地方法栈是线程私有的,存储方法执行信息和Native方法。

  • 对象的内存布局包括对象头、实例数据和对齐填充。

  • 判断对象是否需要回收的方法有引用计数法和可达性算法。

  • GC Root包括虚拟机栈中的本地变量、方法区中的静态变量和常量等。

  • OopMap用于快速找到GC Root,更新时在安全点进行。

  • 三色标记法用于可达性分析,标记过程可能出现不一致问题。

  • 分代模型假设对象生命周期,年轻代存放短命对象,年老代存放长命对象。

  • 空间分配担保确保年老代有足够空间容纳晋升对象。

  • 记忆集和卡表用于优化垃圾收集,减少扫描范围。

  • 垃圾回收算法包括标记-清除、标记-复制和标记-整理。

  • 标记-清除算法会产生内存碎片,标记-复制算法需要双倍内存。

  • 标记-整理算法避免碎片问题,适用于年老代的回收。

  • 后续将深入介绍CMS、G1、ZGC等垃圾收集器的运作流程和原理。

➡️

继续阅读