当前位置: 首页 > 网络应用技术

Java JVM的参考计数和可访问性分析垃圾收集算法

时间:2023-03-07 20:07:58 网络应用技术

  在C/C ++语言中,没有自动垃圾回收机制。它通过新的关键字应用内存资源,并通过删除关键字释放内存资源。如果程序员不编写以在某些位置发布的删除,则应用程序对象将始终占据内存资源并最终导致内存溢出。

  为了使程序员更多地专注于代码的实施,而无需考虑记忆发行的问题而没有太多的Java语言,就有一种自动垃圾恢复机制,这是我们熟悉的GC。机制,程序员只需要关心内存的应用,并且系统会自动识别内存的释放。换句话说,自动垃圾回收的算法将变得非常重要。如果算法是不合理的,则尚未发布内存资源,也可能导致内存溢出。当然,除了Java语言外,C#,Python和其他语言还具有自动垃圾回收机制。

  不可能以任何方式使用它,可以称为垃圾并可以回收。有两种常见的垃圾分析算法,一种是参考计数方法,另一种是可访问的分析算法。

  引用计数是最简单,最直接的方法。向对象添加参考计数器。每当有一个地点参考时,添加了计数器值;当引用无效时,计数器值将减少1;在任何时候,计数器在任何时候都是0到0。无法再次使用该对象,因此可以将该对象收集为垃圾收集器的目标对象。

  以下情况:

  目前,在主流商业计划的主流实施中(Java,C#,甚至是前面提到的古代LISP,都被要求确定该物体是否通过可及性分析得以生存。

  该算法的基本思想是从一系列称为“ GC根”作为起点的对象开始。从这些节点开始,向下搜索。根部没有任何参考链连接(在地图理论的情况下,当它是从GC根到该对象的),它证明该对象是不可用的,并且可以回收,也可以回收。正如GC根牵引算法的那样,如下图所示,尽管Object5,Object6,Object7彼此相关,但GC根无法访问它们,因此它们将被判断为可回收的对象。

  在Java语言中,GC根的对象可以包括以下内容:

  为了提高垃圾收集的灵活性。实际上,在一定条件下没有任何参考链的对象可以“复活”自己。对象的状态可以简单地分为三类:

  即使在可接受的分析算法中不可接受的对象中,也不是“死亡”。目前,他们暂时处于“缓刑”阶段。为了真正宣布死亡对象,至少有两个标记:

  关于两个标记的Java代码源代码,您可以阅读本文:Java中的最终器类和GC第二标签期间的Java源代码分析。

  案例演示:

  代码中有两个完全相同的代码片段,但是执行结果是成功的逃脱和失败。这是因为任何对象的finalize()方法仅一次由系统自动调用。最终确定方法将不会再次执行,因此第二代码的自我响应操作失败。

  Java中只有一个构造函数,构造函数没有说结构函数。在这里,finalize()方法看起来像是一种破坏性功能,但这仅仅是当Java出生时,C/C ++程序员更容易接受它所做的。

  现在,可以使用最终方法或更及时地完成finalize()可以执行的所有任务(例如关闭外部资源),因此不建议使用finalize()方法。

  驱动器:与构造函数相反,当对象结束其生命周期时,如果调用对象的函数,则系统会自动执行击振函数。

  永久垃圾收集主要恢复两个部分:废弃的常数和无用的类别。

  回收常数与Java桩回收的对象非常相似。以常数池中的表面回收为例。ABC“系统将通过系统清理。

  但是,判断班级是否是“无用的班级”,需要同时执行以下三个条件:

  虚拟机可以回收符合上述三个条件的无用类。这里说的只是“是”,与对象不同。如果不使用它,它将不可避免地被回收。无论哪种类都是回收的,热点虚拟机提供了-XnoclassGC参数来控制它。您还可以使用-verbose:类和-xx:+traceclassloading,-xx:+traceclassunloading查看类加载和卸载信息。xx:+traceclassloading可以在虚拟机的产品版本中使用。-XX:+TraceClassunloading参数需要虚拟机支持的FastDebug版本。

  在大量反射,动态剂,CGLIB和其他BYT ODE框架中,动态生成JSP和OSG。这样的频繁(自定义的类负载器场景需要使用卸载机的功能来确保永久生成不会溢出。