2010-02-04 87 views
1

我们知道垃圾回收器是Java中的Thread。并且每个线程都将执行其逻辑。所以我想知道这个垃圾收集器使用哪个逻辑来维护内存。java中垃圾回收器的逻辑

谢谢

+6

说垃圾收集器“是主题”是非常误导的(更不用说语法不正确)。它可以使用线程 - 可能是多个线程 - 或者它可以在甚至不支持线程的硬件上运行。我认为你的意思更多的是它是一个独立的过程,你的代码不直接与之交互,这是绝对正确的。 – 2010-02-04 19:02:04

+0

这是一个非常棒的文档,阅读这个主题:http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html(有几种策略可以使用) – tovare 2010-02-04 18:51:32

回答

0

此线程经常醒来并回收未使用的内存。你可以看看Mark-and-Sweep算法。它也是一个守护线程。

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

+3

您应该注意到JVM现在还没有长时间使用MS收集器。 – 2010-02-04 18:51:56

1

当运行程序中的任何指针无法再达到该对象时,该对象被视为垃圾。最直接的垃圾收集算法只是遍历每个可到达的对象。任何遗留的物体都被认为是垃圾。这种方法需要的时间与活动对象的数量成正比,这对于大量应用程序保持大量活动数据而言是禁止的。

Tuning Garbage Collection with the 5.0 Java[tm] Virtual Machine

0

两者在COM基于体系结构的存储器管理是引用计数。但在.NET的情况下,它完全不同。它是参考跟踪。

引用计数: 每当在堆中创建对象时,引用计数会增加,并且在删除引用计数时,对象的引用计数会减少。开发者的责任是确保分配资源的正确释放。

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

让我们在堆对象分配先来看看:

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

当一个对象在堆中分配得到,下面规则必须遵循。

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

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

GC检查每个对象是否“可到达”。 为了确定覆盖能力,GC从所有根对象(基本上都是静态的(在VB.NET中共享)成员和所有范围内的局部变量)开始,并遍历完整的对象参考图。 GC在其途中遇到的每个对象都被标记为活动。在堆

的对象将是任何两种状态: LIVE DEAD

在第二遍中,所有的非标记的对象被破坏,它们的资源被释放,最后堆被再次压缩以防止内存碎片。

+1

这是他正在谈论的Java。 – 2010-02-05 06:55:28

0

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

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

的深入一篇关于垃圾收集器可以在这里找到:Tuning Garbage Collection with the 5.0 Java Virtual Machine