当前位置: 首页 > 知识库问答 >
问题:

JVM中的手动垃圾收集器

席弘图
2023-03-14

我正在做一个与JVM GC相关的项目,我计划用我的手动GC取代JVM自动GC。

我知道JAVA有一个自动垃圾收集器。如果我们集成一个新的手动垃圾收集器,其中开发人员需要显式地调用new并删除对象(如在C中)。

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

使用手动垃圾回收机制代替自动垃圾回收机制是否有效?

在工业中使用手动GC是否常见?还是程序员到处使用自动垃圾回收器?

共有1个答案

公孙令秋
2023-03-14

我认为你的项目太雄心勃勃了。例如,用alloc / free内存管理替换现有的JVM GC框架可能需要大量重写JVM本地代码代码库和重新设计Java类库。

(您是否知道Java 11 OpenJDK源代码存储库的签出是2.5 GB?那里有很多代码。在你跳跃之前先看看。

你问:

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

在我看来,没有:

> < li>

正如很久以前所证明的(参见经典的左恩论文),对于大型应用程序,自动垃圾收集与使用带有智能指针的malloc/free的存储管理一样快(如果不是更快的话)。

整个Java类库的设计是基于GC是自动和高效的假设。如果您改变这一点,那么当前的大部分API设计都是有问题的;即它会泄漏堆对象。

然而,如果你在项目中投入大约10个人年的熟练开发工作,你可能会得到不同的答案。(可能是一种非常不同的编程语言!)

工业上普遍使用手动GC吗?

在Java中,这是闻所未闻的。

在像C/C这样的语言中,编写时没有考虑到自动GC,使用手动存储管理仍然很常见。(但并不普遍。请阅读博姆保守派收藏家。)

还是程序员到处使用自动垃圾回收器?

对于Java,是的。

在许多其他编程语言中是的。但并非所有语言都是如此。

参考:

  • Benjamin G.Zorn的“保守垃圾收集的测量成本”,发表在Softw。,实践。Exper。1993.DOI:10.1002/spe.4380230704
 类似资料:
  • 一、垃圾收集算法 1.标记-清除算法 最基础的收集算法是“标记-清除”(Mark-Sweep)算法,如同它的名字一样,算法分为“标记”和“清除”两个阶段。 ①首先标记出所有需要回收的对象 ②在标记完成后统一回收所有被标记的对象。 不足: 效率问题:标记和清除两个过程的效率都不高 空间问题:标记清除之后产生大量不连续的内存碎片,空间碎片太多可能会导致以后程序运行过程中需要分配较大对象时,无法找到足够

  • 问题内容: 我有一个奇怪的疑问。我知道垃圾收集器有其自身的局限性。如果分配不正确,则可能导致应用程序以异常方式响应。 所以我的问题是,在每个活动结束时强制调用垃圾回收器()是良好的编程习惯吗? 更新资料 每个人都说调用system.gc()根本没有好处。然后,我想知道为什么它出现在这里。DVM将决定何时运行垃圾收集器。那么,该方法需要什么? 更新2 感谢社区的帮助。但老实说,我从此链接中获得了有关

  • 好的,今天我接受了一次采访,多年来我一直在Java编码。采访说“Java垃圾回收机制是一个棘手的问题,我有几个朋友一直在努力弄清楚。你在这方面做得怎么样?”。她是想欺骗我吗?还是我的一生都是谎言,java没有自动垃圾回收机制? 因为据我所知,java有自动垃圾回收机制,你可以调用System.gc()来收集一些资源,但这并不强制对象被销毁。它仍然由JVM决定。 我说错了吗?

  • 每个java开发人员都知道,java对象不再使用时将被垃圾收集。我想知道JVM如何识别必须为垃圾收集选择的对象。(例如,如果我有10个对象。如果对10个对象中的2个进行垃圾收集,jvm将如何找到这两个对象)。 JVM使用标记和扫描算法(如果我是对的)。 1)例如我在下面提供字符串对象场景 //现在s1

  • 主要内容:垃圾回收算法,1、垃圾回收器的分类,2、串行垃圾回收器,3、吞吐量优先,4、响应时间优先,5、G1(Garbage First,jdk9默认),6、Full GC垃圾回收算法 1.标记清除 2.标记复制 3.标记整理 内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度) 内存整齐度:复制算法=标记清除算法>标记压缩算法 内存利用率:复制算法<标记清除算法=标记压缩算法 年轻代: 存活率低 复制算法 老年代: 区域大,存活率高 标记清除(内存碎片不是太多)+标记压缩共同实现 1、

  • 主要内容:垃圾回收算法,1、垃圾回收器的分类,2、串行垃圾回收器,3、吞吐量优先,4、响应时间优先,5、G1(Garbage First,jdk9默认),6、Full GC垃圾回收算法 1.标记清除 2.标记复制 3.标记整理 内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度) 内存整齐度:复制算法=标记清除算法>标记压缩算法 内存利用率:复制算法<标记清除算法=标记压缩算法 年轻代: 存活率低 复制算法 老年代: 区域大,存活率高 标记清除(内存碎片不是太多)+标记压缩共同实现 1、