Answers:
我认为,如果您开发的是“标准软件”而不是软件平台,那么了解垃圾收集算法根本不重要。您应该对垃圾收集器的工作原理有基本的了解,仅此而已。除非您遇到由于垃圾回收导致的软件严重延迟,否则您需要优化内存使用率。
如果您对这些算法感兴趣,请参阅我的这篇文章:低暂停GC背后的算法是什么?
垃圾收集是一个有趣的,非常重要的计算机科学问题。
知道并了解一种算法,表明您对这些算法有浓厚的兴趣和理解。即使您没有研究过Java的GC算法,如果有人能够对使用的数据结构和算法做出合理的描述,它也会给我留下深刻的印象。
对于Java程序员而言,如果开发人员可以描述GC的优缺点,那将是一件好事,其中包括对GC如何实现的一些了解。这表明您对使用的工具的工作方式感兴趣,而不仅仅是被动地使用它们。了解成本也将帮助您以最小化成本的方式进行编程。
我不会说这是以Java开发人员为生的“必修知识”,而是一种加技能,表明您能够并且愿意比完成今天的工作所需要知道的要深入。
use that information
设计代码。随着GC的改进以及您对GC不再有效且代码变得非最佳的假设(这在最坏的情况下可能会阻止GC),这可能会导致问题。众所周知,但是您应该使用最佳实践来设计代码,而不要着眼于特定的实现。编译器和GC一直在不断改进,而宏优化最终将最终无济于事。
String
实现方法有所了解,那么就不会+
在循环中使用字符串将其串联起来。
我看到两个为什么人们应该知道垃圾收集器(或任何算法/技术)如何工作的原因。它们是:
1.您可以更好地了解编写的代码下正在发生的事情。这通常可以帮助您编写更有效的代码,从而保证更好的性能。在某些情况下,这可能至关重要。(当GWT依赖于浏览器的垃圾收集器时,我经历了令人不愉快的经历,而我们在Chrome中发生了巨大的内存泄漏。因此,我们必须确切地了解导致泄漏的原因。)
2.这样的算法总是(或几乎总是,不,始终)信任聪明,熟练,合格和经验丰富的开发人员。因此,研究他们的方法可能非常有用。
我看到在面试中被问到这样的问题的另一个原因。一些开发人员(尤其是我的前同事)认为,如果开发人员不了解,那么他们将不够聪明或工作努力。我不同意这个说法。但是无论如何,知道这些事情是打动面试官的好方法。
您应该了解世代垃圾收集,以及有关Java垃圾收集的详细信息(PermGen,Eden和Tenured空间)。您还应该总体上熟悉垃圾回收(例如,为什么引用计数通常不是一个好主意,以及为什么标记和清除更好)。我还建议您阅读一些替代实现(例如Azul的Zing JVM中的“无暂停” GC和IBM的实时Metronome项目)。
您应该对Java垃圾收集的工作方式有一些了解,这有两个原因:
首先,如果您不知道它是如何工作的,那么您可能会意外地做出一些设计决策,从而导致实际应用中的最坏情况。随着GC的改进,这种可能性越来越小,但是,如果您在应用中选择了算法,那么了解GC的知识就意味着您可以选择一个知道它将要做什么的人,而不是找出导致它的原因。不良行为。
其次,如果您不知道它是如何工作的,则不可能为给定的应用程序调整GC。大多数Java程序员不需要调整GC,因为默认参数在大多数情况下都可以正常工作。如果您做的大部分时间都不做,那么您可能会发现自己正在调整GC参数。在不了解GC的情况下这样做只是随机转动旋钮-您可能会从中得到一些有用的信息,但是更有可能使事情变得更糟。
因此,尽管我不希望一个好的Java程序员了解有关GC的所有知识,但我希望该程序员在某种程度上知道他们在JVM中使用函数的GC以及如何权衡取舍。 GC算法。