为什么方法调用System.gc()
不能保证垃圾回收算法会在那一刻运行?为什么它无法回收所有未使用的对象的内存,只要它被调用?java - 垃圾回收
回答
- 强制对象销毁是错误编码的标志,因此Java可能希望避免开发人员沉迷于其中。
- 如果Java允许您自由强制破坏对象,则不当使用它可能会对应用程序性能产生不利影响。
- 这个限制允许你(强迫你)把更多的精力到业务逻辑比内存managemnt
- JVM是当需要的内存管理,以及如何做决定的最佳人选。
- 您可以(应该)信任JVM,让它以比我们更好的方式处理事情。
- 你还真的想强迫物体破坏吗?如果是,为什么?
想象一下,能够将动态分配的内存参数传递给该方法。等一下。 – 2013-03-23 16:48:04
为了确保方案在JVM中运行平稳,JVM本身管理垃圾收集。 垃圾收集已变得相当复杂。当您询问系统进行GC运行时,您期望使用哪种算法?一个“完整的GC”?还有很多堆,哪一个是你关心的垃圾?你不知道,这种方法不表示。
假设调用System.gc()
总是触发完整的GC。一个错误的程序可能会轻易将JVM性能瘫痪。在防御方面,JVM希望限制它响应这种调用的频率。
如果您正在非嵌入式系统(例如服务器或台式计算机)上的JVM中运行,除了监视它和代码之外,没有理由关心内存管理的任何方面有效率的。
不能肯定回收所有未使用对象的内存时,它被调用
你的这种假设是错误的。在大多数情况下,垃圾收集器可能会在任何时间点收回所有未使用的对象。但是,如果标准Java库提供了一种保证的方法,那么它将给GC子系统带来完全不合理的负担,以提供大部分时间无用甚至可能造成破坏的服务。
但是也有一些用来评估垃圾收集器性能的几个指标,其中一些是:
- 吞吐量的垃圾收集没有花总时间的百分比-The,认为在很长一段时间。
- 垃圾收集开销 - 吞吐量的倒数,即在垃圾回收中花费的总时间的百分比。
- 暂停时间 - 发生垃圾回收时应用程序执行停止的时间长度。
- 收集频率 - 相对于应用程序执行而言,经常发生收集。
- 占地面积 -a尺寸的度量,例如堆大小。
- 提示 - 当一个对象变成垃圾和当内存变为 可用时之间的时间。
现在如果JVM听System.gc()
想好宠物,并保证在每个System.gc()
调用执行动作,想象一下会是应用程序的性能,如果它被称为程序中的许多倍。!! ??
- 吞吐量将减少
- 垃圾收集开销将增加。
- 由于应用程序忙于重新收集内存,所以会暂停多次。
- 如果占用空间很大,垃圾收集器将不得不扫描所有内存区域以恢复内存,而不管是否存在符合垃圾收集条件的对象。
因此,通过这些点看后,我猜它提供了足够的理由JVM上的应用程序选择System.gc
不响应,但对自己的算法。 Garbage Collection肯定会回收所有未使用的对象的内存,但其调用完全依赖于JVM自己的算法,而不是用户的选择。
来源:内存管理在Java的HotSpot™虚拟机 - Sun Microsystems公司
- 1. java垃圾回收
- 2. Java:垃圾回收
- 3. Java:垃圾回收
- 4. Java垃圾回收器
- 5. 垃圾回收Java类
- 6. java的垃圾回收Runnable
- 7. Java垃圾回收5
- 8. Java垃圾回收混淆
- 9. 垃圾收集java
- 10. Java垃圾收集
- 11. Java垃圾收集
- 12. Python垃圾回收
- 13. C#垃圾回收
- 14. Erlang垃圾回收
- 15. JDBC垃圾回收
- 16. JS垃圾回收
- 17. requestAnimationFrame垃圾回收
- 18. vb.net垃圾回收
- 19. ColdFusion垃圾回收
- 20. PhoneGap垃圾回收
- 21. Chrome垃圾回收
- 22. Javascript垃圾回收
- 23. 因垃圾对象引用而导致的java垃圾回收
- 24. .Net 4垃圾回收
- 25. 垃圾回收操作
- 26. Perl中的垃圾回收
- 27. Java短暂对象和垃圾回收
- 28. Java 6的插座垃圾回收
- 29. Android/Java对象没有垃圾回收
- 30. Java:使用jlibs保证垃圾回收
http://stackoverflow.com/q/66540/139010和http://stackoverflow.com/q/2414105/139010 – 2013-03-23 16:45:27