2011-05-21 115 views

回答

0

看看http://developers.sun.com/mobility/midp/articles/garbage/

随着Java技术变得越来越电信(电信)行业更普遍,了解垃圾收集器的行为变得更加重要。通常,电信应用程序是接近实时的应用程序。以毫秒为单位测量的延迟通常不是问题,但延迟数百毫秒(更不用说秒)会给这类应用带来麻烦。很简单,次优绩效直接导致收入损失。

基本上,如果垃圾收集器压缩一个小堆,那么延迟很短,但是如果您已经产生了大量垃圾,并且有很大的可达对象图,则可以看到很大的延迟。新的垃圾收集算法(分代/增量式GC)已经在一定程度上缓解了这个问题,但是调整GC仍然是一种黑色艺术。

+0

@Stephen C.我假定堆的大小与非垃圾对象的数量成正比。单个GC传递的成本的确与在没有ephemeron表的标记和清除收集器中的那些对象的数量成正比,但执行的GC传递的数量与生成的垃圾对象占用的组合大小成比例。将编辑使用术语“增量”而不是“并发”GC。 – 2011-05-21 02:21:37

+0

@Stephen C.我编辑了一些。我认为你说得对,我的语言很混乱。 – 2011-05-21 02:23:50

0

垃圾收集不会在特定时刻发生。它发生在虚拟机决定这么做时(可能在内存不足时)。

垃圾收集是你的程序应该做的另一项工作,所以在总时间,你的程序是比较慢。但在执行过程中,用户感觉到的滞后很小。

0

在Java中,对象寿命自动管理。 Java垃圾收集器将执行标记和扫描算法(O(N)算法)来遍历对象图并清理未被引用的对象。用户没有可靠的方法来触发垃圾收集(用户可以调用System.gc(),但不能保证立即运行)。当垃圾收集发生的时候,很大程度上取决于JVM的实现。

所以,回到你的问题,当人们说垃圾收集拖慢他们的应用程序,这意味着标记和清除算法带走他们的一些机器的硅时间。

在iOS中的世界里,你说的是对的,对象获得时,他们放心了垃圾收集。这里释放意味着对象的引用计数变为0,程序员负责增加或减少引用计数。在这种情况下,垃圾收集的运行时间为O(1)。

0

当Java虚拟机运行的内存(或者决定启动垃圾收集某些其他原因),垃圾收集器将确定是否存在一些可以不再使用任何对象。这很昂贵(特别是如果你有很多对象),并且可能发生在不可预知的时间。

相比之下,像C语言不具有垃圾收集器允许编程更好的控制水平。这可以避免垃圾收集的昂贵和不可预测的运行,或至少确保它们不会发生在不合时宜的时刻。