从原理聊JVM(一):染色标记和垃圾回收算法
内容提要
本文介绍了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,帮助垃圾收集器在回收时定位对象引用。