代码之家  ›  专栏  ›  技术社区  ›  Pieter van Niekerk

机制

  •  5
  • Pieter van Niekerk  · 技术社区  · 15 年前

    我想知道在爪哇发生的垃圾收集。它真的能够处理所有未使用的对象并释放尽可能多的内存吗?

    我还想知道Java垃圾收集是如何与另一种语言进行比较的,比如说C?然后,自动垃圾收集如何与C等语言的手动收集相比呢?

    6 回复  |  直到 15 年前
        1
  •  5
  •   Yann Ramin    15 年前

    是的,这就是垃圾收集的重点。

    垃圾收集有许多不同的形式。最简单的形式是引用计数,如果不增强算法,就无法处理某些类型的垃圾(循环引用)。

    Java(Sun JVM)使用代标记和扫描收集器,虽然这不是标准化的,不同的JVM确实使用不同的收集器。我不知道.NET CLR使用的确切收集器。

    垃圾收集器喜欢减少程序员的开销,并且可以使某些算法性能更好。但是,它们的内存占用通常比严格的手动分配系统要大。

    关于这个话题的诽谤性引用是 book Garbage Collection 这本书写得很好,很全面。

        2
  •  4
  •   Oak    15 年前

    它真的能够处理所有不使用的对象吗

    不,它不能。但是,它可以收集所有 不能再使用了 它做得很好。差别很小,见下文。


    解释

    例如,假设您有以下代码:

    class A {
        public static Date d = new Date(); // d will never be collected
    }
    

    让我们说 知道一段时间后 d 将不再访问。但是,运行时系统没有这些信息,并且 D 将被无限期地保存,而在C++中,您可以显式删除它。

    相反,垃圾收集器收集所有对象 无法再访问 . 例如:

    void f() {
        Date d = new Date();
        System.out.println(d.toString());
    } // d is no longer accessible at this point
    

    垃圾收集器检测到没有任何方法 D 将再次访问引用,如 D 是它唯一的引用,在方法的末尾它超出了范围。收集不可访问的对象是 估计不足 关于“可以收集哪些对象”的问题,但它是安全的,因为它保证不会收集任何活动对象。

    这种差异是微妙的,实际上,在大多数健全的代码中,您不再使用的所有对象都将被收集起来。 集合本身是完整的,能够正确地识别和收集每个不可访问的对象 ,其中包括无法访问的对象,因为它们的所有引用都驻留在其他不可访问的对象中。

        3
  •  2
  •   Chris    15 年前

    GarabageCollectors搜索对象并检查它们是否被有效指针引用。否则,它们将被完全移除。这就消除了一些潜在的问题,比如让活动指针引用死的对象,从而使内存中的任何东西都不做。

    使用一种要求您自己分配、释放和重新分配空间的语言(如C)开始时可能非常困难,因为您需要完全控制为任何需要的对象分配空间,并在不忘记任何不需要的对象坐在某个地方耗尽空间的情况下取消分配任何对象。虽然可能很棘手,但它确实具有性能优势。

    垃圾收集器倾向于在低级别上取消分配空间,这可能会损害性能。不过,对于大多数应用程序,性能下降不会很大,因此不明显。

        4
  •  1
  •   In silico    15 年前

    垃圾收集器是实现定义的。存在着不同类型的地面军事系统;使用哪一种并不需要程序担心。

    我不能说C,但是在C++中,我们很少使用一个完整的垃圾收集器,因为C++程序员有一些技术,比如RAII和引用计数智能指针,这有助于简化内存管理。

        5
  •  1
  •   Sid    15 年前

    垃圾收集器(GC)不时运行以查找对象的引用。不带任何引用的方法首先被标记,然后调用finalize()方法。下次从内存中删除对象时。GC使程序有点慢。您可以影响GC行为,但不能保证。

        6
  •  1
  •   Daniel Rose    15 年前

    对于.NET,请看一下 Garbage Collector Basics and Performance Hints 在这里,您还可以找到一些性能提示。

    对于Java,请看 Java theory and practice: Garbage collection and performance . 在那里你也会发现一些提示和“反提示”,也就是让GC更糟的方法。