2013-03-23 145 views
-2

为什么方法调用System.gc()不能保证垃圾回收算法会在那一刻运行?为什么它无法回收所有未使用的对象的内存,只要它被调用?java - 垃圾回收

+2

http://stackoverflow.com/q/66540/139010和http://stackoverflow.com/q/2414105/139010 – 2013-03-23 16:45:27

回答

5
  1. 强制对象销毁是错误编码的标志,因此Java可能希望避免开发人员沉迷于其中。
  2. 如果Java允许您自由强制破坏对象,则不当使用它可能会对应用程序性能产生不利影响。
  3. 这个限制允许你(强迫你)把更多的精力到业务逻辑比内存managemnt
  4. JVM是当需要的内存管理,以及如何做决定的最佳人选。
  5. 您可以(应该)信任JVM,让它以比我们更好的方式处理事情。
  6. 你还真的想强迫物体破坏吗?如果是,为什么?
+0

想象一下,能够将动态分配的内存参数传递给该方法。等一下。 – 2013-03-23 16:48:04

1

为了确保方案在JVM中运行平稳,JVM本身管理垃圾收集。 垃圾收集已变得相当复杂。当您询问系统进行GC运行时,您期望使用哪种算法?一个“完整的GC”?还有很多堆,哪一个是你关心的垃圾?你不知道,这种方法不表示。

假设调用System.gc()总是触发完整的GC。一个错误的程序可能会轻易将JVM性能瘫痪。在防御方面,JVM希望限制它响应这种调用的频率。

如果您正在非嵌入式系统(例如服务器或台式计算机)上的JVM中运行,除了监视它和代码之外,没有理由关心内存管理的任何方面有效率的。

0

不能肯定回收所有未使用对象的内存时,它被调用

你的这种假设是错误的。在大多数情况下,垃圾收集器可能会在任何时间点收回所有未使用的对象。但是,如果标准Java库提供了一种保证的方法,那么它将给GC子系统带来完全不合理的负担,以提供大部分时间无用甚至可能造成破坏的服务。

1

但是也有一些用来评估垃圾收集器性能的几个指标,其中一些是:

  • 吞吐量的垃圾收集没有花总时间的百分比-The,认为在很长一段时间。
  • 垃圾收集开销 - 吞吐量的倒数,即在垃圾回收中花费的总时间的百分比。
  • 暂停时间 - 发生垃圾回收时应用程序执行停止的时间长度。
  • 收集频率 - 相对于应用程序执行而言,经常发生收集。
  • 占地面积 -a尺寸的度量,例如堆大小。
  • 提示 - 当一个对象变成垃圾和当内存变为 可用时之间的时间。

现在如果JVM听System.gc()想好宠物,并保证在每个System.gc()调用执行动作,想象一下会是应用程序的性能,如果它被称为程序中的许多倍。!! ??

  1. 吞吐量将减少
  2. 垃圾收集开销将增加。
  3. 由于应用程序忙于重新收集内存,所以会暂停多次。
  4. 如果占用空间很大,垃圾收集器将不得不扫描所有内存区域以恢复内存,而不管是否存在符合垃圾收集条件的对象。

因此,通过这些点看后,我猜它提供了足够的理由JVM上的应用程序选择System.gc不响应,但对自己的算法。 Garbage Collection肯定会回收所有未使用的对象的内存,但其调用完全依赖于JVM自己的算法,而不是用户的选择。

来源:内存管理在Java的HotSpot™虚拟机 - Sun Microsystems公司