【发布时间】:2011-05-21 00:59:24
【问题描述】:
当人们说 Java 中的垃圾收集器会降低整个应用程序的速度时,他们的真正意思是什么?垃圾收集器不是只有在解除对象时才会触发吗?请帮我理解。谢谢!
【问题讨论】:
-
松了一口气?抱歉,我想不通。
当人们说 Java 中的垃圾收集器会降低整个应用程序的速度时,他们的真正意思是什么?垃圾收集器不是只有在解除对象时才会触发吗?请帮我理解。谢谢!
【问题讨论】:
看看http://developers.sun.com/mobility/midp/articles/garbage/
随着 Java 技术在电信 (telco) 行业中变得越来越普遍,了解垃圾收集器的行为变得越来越重要。通常,电信应用程序是近乎实时的应用程序。以毫秒为单位测量的延迟通常不是问题,但数百毫秒的延迟,更不用说秒,可能会给这类应用程序带来麻烦。很简单,次优性能会直接导致收入损失。
基本上,如果垃圾收集器压缩一个小堆,那么延迟就会很短,但是如果你已经生成了大量垃圾,并且有一个大的可达对象图,你会看到大的延迟。新的垃圾收集算法(分代/增量 GC)在一定程度上缓解了这种情况,但调整 GC 仍然是一种黑魔法。
【讨论】:
垃圾收集不会在特定时刻发生。它发生在 VM 决定这样做时(可能是内存不足时)。
垃圾收集是您的进程应该做的另一项工作,因此在总时间上,您的程序速度较慢。 但是在执行过程中,(用户)感觉到的滞后是最小的。
【讨论】:
当 Java 虚拟机内存不足(或出于其他原因决定开始垃圾收集)时,垃圾收集器将确定是否有任何对象不再使用。这很昂贵(特别是如果您有很多对象),并且可能发生在不可预测的时间。
相比之下,像 C 这样没有垃圾收集器的语言允许对编程进行更精细的控制。这可以避免昂贵且不可预测的垃圾收集运行,或者至少确保它们不会在不合时宜的时刻发生。
【讨论】:
在 Java 中,对象生命是自动管理的。 Java 垃圾收集器将执行标记和清除算法(O(N) 算法)来遍历对象图并清理未被引用的对象。用户没有可靠的方法来触发垃圾回收(用户可以调用 System.gc(),但不能保证立即运行)。垃圾收集何时发生很大程度上依赖于 JVM 实现。
所以,回到你的问题,当人们说垃圾收集正在减慢他们的应用程序时,这意味着标记和清除算法正在占用他们机器的一些硅时间。
在 iOS 世界中,您说的没错,对象在释放时会被垃圾收集。这里的relieved是指对象的引用计数变为0,程序员负责增加或减少引用计数。在这种情况下,垃圾回收的运行时间是 O(1)。
【讨论】: