Java垃圾收集器

时间:2011-05-21 00:59:25

标签: java garbage-collection

  

可能重复:
  Java garbage collector - When does it collect?

当人们说Java中的垃圾收集器正在减慢整个应用程序的速度时,它们的真正含义是什么?只有在释放对象时才会触发垃圾收集器吗?请帮我理解。感谢的!

4 个答案:

答案 0 :(得分:0)

垃圾收集不会在特定时刻发生。它发生在VM决定这样做时(可能是在内存不足时)。

垃圾收集是您的流程应该执行的另一项工作,因此在总时间内,您的程序速度会变慢。 但是在执行过程中(用户)感觉到的滞后很小。

答案 1 :(得分:0)

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

  

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

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

答案 2 :(得分:0)

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

所以,回到你的问题,当人们说垃圾收集减慢他们的应用程序时,这意味着标记和扫描算法正在夺走他们机器的一些硅片时间。

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

答案 3 :(得分:0)

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

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