JVM 中的手动垃圾收集器

Manual Garbage Collector in JVM

我正在做一个与 JVM GC 相关的项目,我打算用我的手动 GC 替换 JVM 自动 GC。

我知道 JAVA 有一个自动垃圾收集器。如果我们集成一个新的手动垃圾收集器,开发人员需要在对象上显式调用 new 和 delete(就像在 C++ 中一样)会怎么样。

让我们假设程序员在没有内存泄漏的情况下编写 free。

使用手动垃圾收集器而不是自动垃圾收集器会更有效吗?。

工业界普遍使用手动GC吗?还是程序员到处使用自动垃圾收集器?

我认为您的项目过于雄心勃勃。例如,用分配/释放内存管理替换现有的 JVM GC 框架可能需要大量重写 JVM 本机代码代码库和重新设计 Java class 库。

(您知道 Java 11 OpenJDK 源代码库的签出是 2.5 GB 吗?那里有很多代码。跳之前先看看。)


您问过:

Would it be efficient to use manual garbage collector instead of automatic garbage collection?

在我看来,否:

  • 正如很久以前证明的那样(参见 classic Zorn 论文),对于大型应用程序,自动 GC 与使用 malloc/free 和智能指针。

  • 整个Javaclass库都是在GC自动高效的假设下设计的。如果你改变它,那么当前的很多 API 设计都是有问题的;即它会泄漏堆对象。

但是,如果您将 10 左右 man-years 熟练的开发人员投入到项目中,您最终可能会得到不同的答案。 (而且可能是一种非常不同的编程语言!)

Is it common to use manual GC in industry?

Java 闻所未闻。

在 C/C++ 等未考虑自动 GC 编写的语言中,使用手动存储管理仍然很常见。 (但不是通用的。阅读有关 Boehm conservative collector 的内容。)

Or do programmers use automatic garbage collector everywhere?

与Java,是的。

在许多其他编程语言中是的。但不是所有语言。


参考:

  • "The measured cost of conservative garbage collection" 作者:Benjamin G. Zorn,发表于 Softw., Pract.专家。 1993. DOI: 10.1002/spe.4380230704