我听说垃圾收集会导致不良的软件设计。真的吗?确实,我们不关心垃圾收集语言中对象的生命周期,但是这对程序设计有什么影响?垃圾收集是否会导致软件设计不良?
回答
如果一个对象要求其他对象代表它做某件事,直到另行通知,对象的所有者应该在不需要它的服务时通知它。让代码放弃这些对象而不通知他们不再需要他们的服务将是不好的设计,但这在垃圾收集框架中与在非GC框架中一样正确。
垃圾收集框架,适当地使用,提供了两个优点:
在许多情况下,对象被用于在其中包封值的目的而创建,向对象的引用被作为代理为围绕通过数据。接收这种引用的代码不应该关心其他引用是否存在于这些相同的对象,或者它是否包含最后存活的引用。只要有人持有对象的引用,就应该保留这些数据。一旦没有人需要这些数据,它就不应该存在,但没有人应该特别注意。
在非GC框架中,尝试使用处置对象通常会生成无法可靠捕获(并可能允许代码违反安全策略)的未定义行为。在许多GC框架中,可以确保使用处置资源的尝试将被确定性地困住,并且不会破坏安全性。
在某些情况下,垃圾收集将允许程序员是更模糊比将在非GC系统是可以容忍的设计“以蒙混过关”。然而,基于GC的框架也允许使用很多好的编程模式,这些编程模式在非GC系统中无法高效地实现。例如,如果一个程序使用多个工作线程为问题寻找最佳解决方案,并且有一个UI线程周期性地想要显示迄今为止找到的最佳解决方案,那么UI线程会想知道当它询问一个状态更新它会得到一个解决方案已被发现,但不希望负担工作线程的必要同步,以确保它有绝对最新的解决方案。
在非GC系统中,线程同步将是不可避免的,因为UI线程和工作线程必须协调谁将删除状态对象,该状态对象在显示时会变得过时。然而,在一个基于GC的系统中,GC将能够判断一个UI线程是否能够在状态对象被替换之前获取一个对状态对象的引用,从而解决该对象是否需要保持足够长的时间UI线程来显示它。 GC有时必须强制线程同步才能找到所有可到达的引用,但偶尔为GC进行同步的性能消耗可能会低于非GC系统中所需的频繁线程同步。
非GC语言可以很容易地捕获Use-After-Dispose。但他们通常不会处理东西,而是删除它们。 – 2015-04-08 10:28:14
@HenkHolterman:跟踪GC语言可以保持一个绝对不变量,只要有任何可以想象的代码路径可以通过它来访问一个对象的引用,引用永远不会被解释为识别其他任何东西。我能想到的提供这种保证而没有追踪GC的最实际的方法是引用包含句柄而不是直接指针,并且每个引用都包含一个序列号,这样即使句柄被回收了,序列号也不会与任何现有的引用相匹配。我想不出任何... – supercat 2015-04-08 15:05:36
...替代方法的开销较小,但必须保持每个参考序列号的同时检查每次访问似乎相当昂贵,而使用跟踪GC。 – supercat 2015-04-08 15:06:07
- 1. 不良垃圾收集
- 2. 这会导致垃圾收集问题
- 3. 组件不会被垃圾收集
- 4. 垃圾收集器如何确定对象是否是垃圾?
- 5. 这会收集垃圾吗?
- 6. Threadlocal引用休眠会话impl,导致会话impl不会被垃圾收集
- 7. ParameterizedThreadStart是否保证对象实例不会被垃圾收集?
- 8. java垃圾收集是否安全地清除垃圾数据?
- 9. 垃圾收集 - 是否需要?
- 10. 垃圾收集器是否有配置?
- 11. 垃圾收集是否影响堆栈?
- 12. 是否收集了客观C垃圾?
- 13. GC是否从Metaspace收集垃圾?
- 14. JDialog永远不会垃圾收集
- 15. Swing Timer不会垃圾收集
- 16. 活物是垃圾收集?
- 17. 为什么调用AppDomain.Unload不会导致垃圾回收?
- 18. 因垃圾对象引用而导致的java垃圾回收
- 19. 垃圾收集java
- 20. Java垃圾收集
- 21. Java垃圾收集
- 22. C#垃圾收集
- 23. GWT垃圾收集
- 24. DoctrineCommonCache垃圾收集?
- 25. 垃圾收集器
- 26. Java Swing JTree不是垃圾收集
- 27. 是否有可能因为垃圾收集太慢而导致OutOfMemoryError?
- 28. 在iis 7.5中设置物理内存限制是否会导致垃圾收集器更积极地运行?
- 29. 指向null的JavaScript链对象是否会被垃圾收集?
- 30. 值类型是否收集垃圾收集?
我从来没有听说过。我经历过GC导致更好的软件设计。 – 2015-04-08 10:29:18