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

💡 原文中文,约5200字,阅读约需13分钟。
📝

内容提要

本文介绍了JVM的内存分配、GC、编译等知识,并详细解释了JVM的运行时内存划分、对象的内存布局、标记的方法和流程、分代模型、垃圾回收算法等内容。

🎯

关键要点

  • JAVA的易用性使得开发者可以在不理解JVM的情况下编写代码,但对JVM的理解是程序员水平的分水岭。

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

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

  • 堆是线程共享的,主要存放对象实例和数组,内存不足时会抛出OutOfMemoryError。

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

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

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

  • GC Root包括本地变量引用、静态变量引用、常量引用和JNI引用。

  • OopMap用于快速找到GC Root,更新OopMap的时机称为安全点。

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

  • 增量更新和原始快照是解决标记过程中不一致问题的两种方式。

  • 分代模型基于对象的生命周期,将对象分为年轻代和年老代。

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

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

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

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

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

  • 后续文章将深入介绍不同垃圾收集器的运作流程和原理。

延伸问答

JVM的运行时内存划分包括哪些区域?

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

什么是三色标记法,它的作用是什么?

三色标记法用于可达性分析,通过将对象标记为白色、灰色和黑色来判断对象的存活状态。

JVM中如何判断对象是否需要被回收?

可以通过引用计数法和可达性算法来判断对象是否需要被回收。

什么是分代模型,它的基本假设是什么?

分代模型将对象分为年轻代和年老代,基本假设是大多数对象是短命的,存活时间越长的对象越难以被回收。

标记-清除算法的缺点是什么?

标记-清除算法的缺点是会产生内存碎片,可能导致后续无法找到足够的连续内存。

JVM中OopMap的作用是什么?

OopMap用于快速找到GC Root,帮助垃圾收集器在回收时定位对象引用。

➡️

继续阅读