java中垃圾收集器的逻辑

我们知道垃圾收集器是java中的Thread。 每个线程都有自己的逻辑来执行。 所以我想知道这个垃圾收集器使用什么逻辑来维护内存。

谢谢

当一个对象无法再从正在运行的程序中的任何指针到达时,它被认为是垃圾。 最直接的垃圾收集算法简单地遍历每个可到达的对象。 剩下的任何对象都被认为是垃圾。 这种方法所花费的时间与活动对象的数量成正比,这对于维护大量实时数据的大型应用程序来说是不可行的。

使用5.0 Java [tm]虚拟机Tuning Garbage Collection中获取

基于COM的体系结构中的内存管理是引用计数。 但在.NET的情况下,它完全不同。 这是参考追踪。

引用计数:每当在堆中创建对象时,引用计数就会增加,当它被删除时,对象的引用计数会减少。 开发人员有责任确保正确释放分配的资源。

参考跟踪:在.NET中,自动内存管理通过参考跟踪进行,垃圾收集器负责处理此问题。

让我们首先看一下Heap中的对象分配:

堆的存储分类如下:1。自由空间2.预留空间

每当在堆中分配Object时,必须遵循以下规则。

  1. 内存分配发生在可用空间的连续范围内。
  2. 内存中对象的顺序仍然是它们的创建顺序,以获得良好的局部性。
  3. 堆中的对象之间永远不会有任何间隙。
  4. 最旧的对象位于最低地址。

GC算法:一旦对象超出范围,就不会发生参考跟踪。 当堆中的内存已满时,GC开始工作。

如果“可达”,则GC会检查每个对象。 为了确定到达能力,GC从所有根对象开始 – 这些对象基本上都是静态的(在VB.NET中共享)成员和所有范围内的局部变量 – 并遍历完整的对象引用图。 GC在途中遇到的每个对象都标记为活动。

堆中的对象将处于以下两种状态中的任何一种:LIVE DEAD

在第二次传递中,所有未标记的对象都被销毁,其资源被释放,最后再次压缩堆以防止内存碎片。

这个线程经常被唤醒并回收未使用的内存。 你可能会研究Mark-and-Sweep算法。 它也是一个守护程序线程。

编辑:垃圾收集器查找并删除主线程无法访问的对象。

JVM会自动重新收集不再使用的内存。 垃圾收集器将自动释放不再引用的对象的内存。

要查看垃圾收集器开始工作,请将命令行参数“-verbose:gc”添加到虚拟机。

有关垃圾收集器的深入文章可以在这里找到: 使用5.0 Java虚拟机调整垃圾收集