这是一个非常烦人的问题,尽管它是一种有用的语言,但我认为许多人都反对Java。
您不信任“ System.gc”执行任何操作这一事实令人难以置信,并且可以轻松地对该语言调用“恐惧,不确定性,怀疑”感觉。
在许多情况下,最好在重要事件发生之前处理您有意引起的内存高峰,这会导致用户认为您的程序设计不良/无响应。
拥有控制垃圾收集的能力将是一个很好的教育工具,反过来可以提高人们对垃圾收集工作原理以及如何使程序利用其默认行为和受控行为的理解。
让我回顾一下该线程的参数。
- 它效率低下:
通常,该程序可能没有执行任何操作,并且您知道由于设计方式它没有执行任何操作。例如,它可能正在使用大型的等待消息框进行某种长时间的等待,并且最后还可能添加一个调用以收集垃圾,因为运行它所花费的时间仅占该时间的一小部分。漫长的等待时间,但可以避免gc在更重要的操作中起作用。
- 这始终是一种不良做法,并指出代码已损坏。
我不同意,您拥有什么垃圾收集器都没有关系。它的工作是跟踪垃圾并进行清理。
通过在不太重要的使用情况下调用gc,可以减少当您的生活依赖于所运行的特定代码而决定收集垃圾时运行它的几率。
当然,它可能无法按照您期望或期望的方式运行,但是当您确实要调用它时,您什么也没有发生,并且用户愿意忍受缓慢/停机时间。如果System.gc有效,那就太好了!如果没有,至少您尝试过。除非垃圾收集器具有固有的副作用,否则如果使用手动调用垃圾收集器会产生什么样的行为,这简直是不利的,这本身会引起不信任。
- 这不是常见的用例:
这是一个无法可靠实现的用例,但是如果系统是按这种方式设计的,则可能是这样。这就像制作一个交通信号灯并使它的某些/所有交通信号灯的按钮什么都不做,这使您质疑为什么按钮从一开始就没有,javascript没有垃圾收集功能,所以我们不这样做对此不多加审查。
- 规范说System.gc()暗示GC应该运行,而VM可以忽略它。
什么是“提示”?什么是“忽略”?计算机不能简单地获取提示或忽略某些内容,它所采取的严格的行为路径可能是动态的,并且受系统意图的引导。正确的答案应该包括垃圾收集器在实现级别实际正在做什么,这将导致它在您请求时不执行收集。该功能仅仅是点头吗?我必须满足一些条件吗?这些条件是什么?
就目前而言,Java的GC通常看起来就像是您不信任的怪物。您不知道它什么时候来或去,您不知道它会做什么,怎么做。我可以想象一些专家对垃圾收集如何按指令工作有更好的了解,但绝大多数人只是希望它“有效”,而不得不依靠一个看起来不透明的算法来为您工作是令人沮丧的。
在阅读或学习某些东西与实际看到它的实现,整个系统之间的差异以及无需查看源代码就可以使用它之间存在很大的差距。这会产生自信和掌握/理解/控制的感觉。
总而言之,答案存在一个固有的问题:“此功能可能无法执行任何操作,而我不会详细介绍如何分辨何时执行某项操作,何时不执行某项操作以及为什么它不会或不会做任何事情,常常暗示试图这样做是完全违背哲学的,即使其意图是合理的。”
Java GC可以按照其行为方式行事,也可以不行,但是要理解它,很难真正地沿着哪个方向去获得对您可以信任的GC所做的事情的全面概述,以及如果不这样做,那么简单地不信任该语言就太容易了,因为语言的目的是在哲学范围内控制行为(对于程序员,特别是新手来说,很容易因某些系统/语言行为而陷入生存危机)能够忍受(如果不能的话,除非有必要,否则您将不会使用该语言),而且由于未知原因无法控制而无法控制的其他事情本质上是有害的。