有谁知道 Java 和 .Net 垃圾收集器之间的主要区别?网上搜索并没有透露太多信息,这是一个测试中出现的问题。
区别在于 CLR (.Net) GC 和 JVM GC 之间,而不是语言本身。
两者都可能发生变化,并且其行为规范宽松,允许在不影响程序正确性的情况下进行更改。
存在一些历史差异,主要是由于 .Net 的设计吸取了 java(和其他基于 gc 的平台)发展的经验教训。在下文中,不要假设 .Net 在某种程度上更优越,因为它从一开始就包含了功能,这只是后来的结果。
一个显着的公开可见的差异是,MS GC 公开了其分代性质(通过 GC api),这可能会在一段时间内保持正确,因为这是基于大多数程序所表现出的行为而采取的明显方法:大多数分配都极其困难。寿命短暂。
最初的 JVM 没有分代垃圾收集器,但很快就添加了此功能。
SunOracle 和其他公司实现的第一代收集器往往是 Mark 和 Sweep。人们意识到,标记-清除-紧凑方法将带来更好的内存局部性,从而证明额外的复制开销是合理的。 CLR 运行时以这种行为首次亮相。
SunOracle 和 Microsoft 的 GC 实现“精神”之间的区别之一是可配置性。
Sun 提供了大量选项(在命令行)来调整 GC 的各个方面或在不同模式之间切换。许多选项都是 -X 或 -XX 来指示它们缺乏跨版本或供应商的支持。相比之下,CLR 几乎不提供可配置性;您唯一真正的选择是使用服务器或客户端收集器,它们分别针对吞吐量和延迟进行优化。
两家公司(以及开源实现)都在积极研究 GC 策略,最近 GC 实现中使用的当前方法也是每个线程 eden 区域(改进局部性并允许 eden 收集可能不会导致完全暂停)作为预保有权方法,它试图避免将某些分配放入伊甸园一代。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)