这是一个非常令人烦恼的问题,我认为它使许多人反对Java,尽管Java是一种非常有用的语言。
"System.gc"不可靠的事实是令人难以置信的,它很容易给该语言带来“恐惧、不确定性、怀疑”的感觉。
在许多情况下,在重要事件发生之前,有能力处理您故意引起的内存消耗峰值是件好事,否则用户会认为您的程序设计不良/无响应。
控制垃圾收集将成为非常好的教育工具,进而提高人们对垃圾收集机制的理解,并学会如何利用其默认行为和受控行为来编写程序。
让我回顾一下这个线程的论点。
- 它效率低:
通常,程序可能什么都没做,因为它是按照设计方式运行的。例如,它可能正在进行某种长时间等待,并且在结束时可能会添加一个调用以收集垃圾,因为运行时间将占长时间等待的极小部分时间,但它可以避免gc在更重要的操作中出现问题。
- 它总是一种糟糕的做法,并且表示代码有问题。
我不同意,无论您使用什么垃圾收集器,它的工作都是跟踪垃圾并清除它。
通过在使用较不关键的时间调用gc,您可以减少它在您的生命取决于特定代码运行时运行但决定收集垃圾的可能性。
当然,它可能不会按照您想要或期望的方式运行,但当您想要调用它时,您知道没有任何事情正在发生,用户愿意容忍缓慢/停机时间。如果System.gc有效,太好了!如果不行,至少你尝试过。除非垃圾收集器具有固有的副作用,这些副作用会对手动调用垃圾收集器的行为产生可怕而意外的影响,否则就没有任何负面影响,这本身引起了不信任。
- 它不是常见用例:
这是一个无法可靠实现的用例,但如果系统被设计成那样,就可以实现。就像制造交通信号灯并使其中一些或全部的按钮不起作用一样,这会让您怀疑为什么会有这个按钮,Javascript没有垃圾回收功能,因此我们对它不会过分挑剔。
- 规范说明System.gc()是提示GC运行的指令,虚拟机可以忽略它。
"提示"是什么?"忽略"是什么?计算机不能简单地接受提示或忽略某些东西,它们采取的行为路径可能是动态的,并由系统意图指导。一个正确的答案应该包括垃圾收集器在实现层面上实际执行的操作,导致请求时不能进行垃圾回收。这个特征只是一个nop吗?是否要满足某些条件?这些条件是什么?
就目前而言,Java的GC经常看起来像是一个你不能信任的怪物。你不知道它何时出现或消失,不知道它会做什么,以及它如何做到这一点。我可以想象一些专家对每个指令如何工作有更好的了解,但绝大多数人只是希望它“正常工作”,不得不依赖一个看起来不透明的算法来为你做事是令人沮丧的。
阅读或学习某些东西与实际看到其实现之间存在很大的差距、在不同系统之间的差异以及能够玩弄它而不必查看源代码。这会产生信心和掌握/理解/控制感。
总之,答案中存在固有的问题:“这个功能可能什么也不做,我不会详细说明何时会发生什么以及为什么会发生,通常意味着试图这样做是不合理的哲学。”
Java垃圾回收机制可能表现得还可以,也可能不行,但要理解它,真正跟进它运作的方向,以获得全面的概述并信任GC能够做什么和不能做什么是困难的。所以很容易就不信任这门语言,因为语言的目的是在哲学层面上拥有可控行为(尤其是对于程序员,特别是新手,从某些系统/语言行为中会陷入存在危机),只有你具备能够容忍的程度(如果你无法容忍,就不会使用该语言,直到必须使用),还有更多的事情,因为没有明显的原因而无法控制,这本质上是有害的。