python一句做网站,制作网站需要哪些成本,网络营销的七种方法,成都网站开发建设公司在Java虚拟机#xff08;JVM#xff09;中#xff0c;可达性分析算法#xff08;Reachability Analysis#xff09;用于垃圾收集#xff0c;以确定哪些对象是“可达”的#xff0c;即哪些对象仍然有用#xff0c;哪些对象可以被回收。下面是对可达性分析算法及其底层实…在Java虚拟机JVM中可达性分析算法Reachability Analysis用于垃圾收集以确定哪些对象是“可达”的即哪些对象仍然有用哪些对象可以被回收。下面是对可达性分析算法及其底层实现的详细描述。
可达性分析算法概述
可达性分析算法通过从一组称为根对象GC Roots的对象开始遍历对象引用图确定哪些对象是可达的。那些无法从根对象访问到的对象被视为不可达的可以被垃圾收集器回收。
根对象GC Roots
在JVM中根对象包括以下几类
虚拟机栈中的引用包括各个线程的栈帧中的本地变量表中引用的对象。方法区中的类静态属性引用的对象即静态字段引用的对象。方法区中的常量引用的对象如字符串常量池中的引用。本地方法栈中的引用即JNIJava Native Interface引用的对象。所有被同步锁synchronized持有的对象
所以GC Roots是很多很多个的而不要看到Roots就认为只有一个
可达性分析过程
可达性分析的过程可以概括为以下几个步骤
标记阶段 从GC Roots开始将所有可达对象标记为活跃。使用一种图遍历算法如深度优先搜索DFS或广度优先搜索BFS遍历对象引用图找到所有可达对象。 清除阶段 在标记阶段之后所有未被标记的对象被视为不可达可以被垃圾收集器回收。 如果要使用可达性分析算法来判断内存是否可回收那么分析工作必须在一个能保障一致性的快照中进行。否则分析结果的准确性就无法保证这也是导致GC时必须“Stop the World” 的一个重要原因 底层实现 对象引用图 JVM内部使用一种称为“对象图”的数据结构来表示对象及其相互引用关系。对象图中的每个节点表示一个对象每条边表示一个对象对另一个对象的引用。 标记-清除算法Mark-Sweep Algorithm 标记阶段Collector从GC Roots开始遍历对象图对所有访问到的对象进行标记。标记通常通过在对象头部设置标志位来实现。清除阶段Collector遍历堆中的所有对象回收那些未被标记的对象。缺点 效率不高GC的时候需要stop整个应用程序清理出来的内存不连续即不会整合内存而是复用垃圾对象的内存。会存在大量内存碎片 并发标记-清除算法 在现代JVM中为了减少垃圾收集带来的暂停时间stop-the-world通常会采用并发标记-清除算法。这些算法允许应用线程和垃圾收集线程同时工作。三色标记法是并发标记的一种实现方式通过将对象标记为白色、灰色和黑色来实现。 白色尚未访问的对象。灰色已访问但未处理完引用的对象。黑色已访问且引用已处理完的对象。 并发标记阶段 初始标记标记从根对象直接可达的对象通常会短暂暂停所有应用线程。并发标记与应用线程并发运行标记所有可达对象。最终标记处理并发标记期间产生的引用变化通常会有短暂停顿。 清除阶段回收未被标记的对象。 分代垃圾回收 JVM通常采用分代垃圾回收策略将堆分为年轻代和老年代。不同代使用不同的回收算法以优化性能。年轻代使用复制算法复制存活对象到新的区域回收旧区域的所有对象。老年代使用标记-清除或标记-整理算法将存活对象压缩到一侧回收剩余空间。
根对象和其他对象的连接 引用链 根对象通过引用链Reference Chain连接到其他对象。每个对象都有字段指向其他对象这些字段形成了对象图中的边。在标记阶段算法通过引用链从根对象递归或迭代地访问其他对象。 栈和静态变量的引用 虚拟机栈中的本地变量表和方法区中的静态变量表保存着对对象的直接引用。这些引用成为可达性分析的起点。
通过以上步骤和机制JVM能够有效地识别和回收不可达的对象从而管理堆内存并保证应用程序的正常运行和性能。