Java开发人员应该了解垃圾收集算法吗?[关闭]


11

最近有人在采访中问我是否知道任何垃圾收集算法。

我知道什么是垃圾回收,但是我从未真正考虑过学习垃圾回收算法,因为作为开发人员,我不必担心它,垃圾回收器为我完成了所有艰苦的工作。

你们认为Java开发人员应该了解垃圾收集器算法吗?如果是,您能告诉我应该看哪个?


看到这个,chaoticjava.com
posts /

1
是的,他们应该。否则,他们冒着编写软件的风险,该软件在高负载下会损坏。
quant_dev

Answers:


9

我认为,如果您开发的是“标准软件”而不是软件平台,那么了解垃圾收集算法根本不重要。您应该对垃圾收集器的工作原理有基本的了解,仅此而已。除非您遇到由于垃圾回收导致的​​软件严重延迟,否则您需要优化内存使用率。

如果您对这些算法感兴趣,请参阅我的这篇文章:低暂停GC背后的算法是什么?


7

垃圾收集是一个有趣的,非常重要的计算机科学问题。

知道并了解一种算法,表明您对这些算法有浓厚的兴趣和理解。即使您没有研究过Java的GC算法,如果有人能够对使用的数据结构和算法做出合理的描述,它也会给我留下深刻的印象。

对于Java程序员而言,如果开发人员可以描述GC的优缺点,那将是一件好事,其中包括对GC如何实现的一些了解。这表明您对使用的工具的工作方式感兴趣,而不仅仅是被动地使用它们。了解成本也将帮助您以最小化成本的方式进行编程。

我不会说这是以Java开发人员为生的“必修知识”,而是一种加技能,表明您能够并且愿意比完成今天的工作所需要知道的要深入。


2
了解了我会同意的基本知识(了解事物会使您成为更好的编码器)。问题是,如果您知道复杂的细节,然后再use that information设计代码。随着GC的改进以及您对GC不再有效且代码变得非最佳的假设(这在最坏的情况下可能会阻止GC),这可能会导致问题。众所周知,但是您应该使用最佳实践来设计代码,而不要着眼于特定的实现。编译器和GC一直在不断改进,而宏优化最终将最终无济于事。
马丁·约克

我一直在想更多的事情,如果您对String实现方法有所了解,那么就不会+在循环中使用字符串将其串联起来。
JohnMcG 2012年

4

我看到两个为什么人们应该知道垃圾收集器(或任何算法/技术)如何工作的原因。它们是:
1.您可以更好地了解编写的代码下正在发生的事情。这通常可以帮助您编写更有效的代码,从而保证更好的性能。在某些情况下,这可能至关重要。(当GWT依赖于浏览器的垃圾收集器时,我经历了令人不愉快的经历,而我们在Chrome中发生了巨大的内存泄漏。因此,我们必须确切地了解导致泄漏的原因。)
2.这样的算法总是(或几乎总是,不,始终)信任聪明,熟练,合格和经验丰富的开发人员。因此,研究他们的方法可能非常有用。

我看到在面试中被问到这样的问题的另一个原因。一些开发人员(尤其是我的前同事)认为,如果开发人员不了解,那么他们将不够聪明或工作努力。我不同意这个说法。但是无论如何,知道这些事情是打动面试官的好方法。


1
我同意(2)和(1)的一半(有助于调试)。但是(1)中存在危险,将代码设计为可与特定的GC实现配合使用,因为改进GC或使用其他类型的GC实现时,它将不再是最优的。
马丁·约克

@Loki Astari,对于特定的实现这很危险,您是对的。但是,另一方面,.NET的垃圾回收原理(至少很长一段时间)还是没有改变。
superM 2012年

@superM:实际上,Mono的GC与Microsoft的GC有很大不同,并且正在被另一种完全不同的GC取代。
约尔格W¯¯米塔格

@superM:在我看来,Java的发展速度并不慢:en.wikipedia.org/wiki/Java_version_history(看起来每年有一次新补丁或更新)。明年将发布新版本。现在,这并不意味着GC每次都会更新,而是显示了它的潜力。
马丁·约克

@Loki Astari,是的。许多软件开发都在迅速变化,我们的工作就是跟上它。此外,所有更改都基于已经存在的更改,因此我不希望在1或2个版本内发生任何根本性的更改。
2012年

4

您应该了解世代垃圾收集,以及有关Java垃圾收集的详细信息(PermGen,Eden和Tenured空间)。您还应该总体上熟悉垃圾回收(例如,为什么引用计数通常不是一个好主意,以及为什么标记和清除更好)。我还建议您阅读一些替代实现(例如Azul的Zing JVM中的“无暂停” GC和IBM的实时Metronome项目)。


3

您应该对Java垃圾收集的工作方式有一些了解,这有两个原因:

首先,如果您不知道它是如何工作的,那么您可能会意外地做出一些设计决策,从而导致实际应用中的最坏情况。随着GC的改进,这种可能性越来越小,但是,如果您在应用中选择了算法,那么了解GC的知识就意味着您可以选择一个知道它将要做什么的人,而不是找出导致它的原因。不良行为。

其次,如果您不知道它是如何工作的,则不可能为给定的应用程序调整GC。大多数Java程序员不需要调整GC,因为默认参数在大多数情况下都可以正常工作。如果您做的大部分时间都不做,那么您可能会发现自己正在调整GC参数。在不了解GC的情况下这样做只是随机转动旋钮-您可能会从中得到一些有用的信息,但是更有可能使事情变得更糟。

因此,尽管我不希望一个好的Java程序员了解有关GC的所有知识,但我希望该程序员在某种程度上知道他们在JVM中使用函数的GC以及如何权衡取舍。 GC算法。


1

是的,每个Java开发人员绝对应该知道虚拟机幕后发生的事情,其中​​包括垃圾收集的工作。

知识水平是另一个问题。我不希望普通的开发人员来解释实际实现的区别(我必须自己做一些研究),但是GC的基本原理以及反对自己管理内存的利弊应该是明确。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.