jma*_*erx 8 java garbage-collection reference-counting
我一直想知道为什么Java中的垃圾收集器会在它感觉到而不是执行时激活:
if(obj.refCount == 0)
{
delete obj;
}
Run Code Online (Sandbox Code Playgroud)
我忽略了Java如何做到这一点有什么大的优势吗?
谢谢
tem*_*def 18
每个JVM都不同,但HotSpot JVM主要不依赖引用计数作为垃圾收集的手段.引用计数具有易于实现的优点,但它本身容易出错.特别是,如果您有一个引用循环(一组对象在一个循环中都相互引用),那么引用计数将无法正确回收这些对象,因为它们都具有非零引用计数.这迫使你不时使用辅助垃圾收集器,这往往会更慢(Mozilla Firefox有这个问题,他们的解决方案是以代码可读性为代价添加垃圾收集器).这就是为什么,例如,像C++这样的语言倾向于shared_ptr使用使用引用计数的weak_ptrs 和不使用引用循环的s 的组合.
此外,将引用计数与每个对象相关联会使分配引用的成本大于正常值,因为调整引用计数涉及额外的簿记(在多线程存在时情况会变得更糟).此外,使用引用计数排除了使用某些类型的快速内存分配器,这可能是一个问题.它也倾向于以其天真的形式导致堆碎片,因为对象通过内存分散而不是紧密堆积,减少分配时间并导致不良的局部性.
HotSpot JVM使用各种不同的技术来进行垃圾收集,但其主要垃圾收集器称为停止和复制收集器.该收集器通过在内存中彼此相邻地分配对象来工作,并允许极快(一个或两个汇编指令)分配新对象.当空间耗尽时,所有新对象都同时进行GC操作,这通常会杀掉大部分构建的新对象.因此,GC比通常的参考计数实现快得多,并且最终具有更好的位置和更好的性能.
有关垃圾收集技术的比较,以及HotSpot中GC的工作原理的快速概述,您可能希望查看我去年夏天教授的编译器课程中的这些演讲幻灯片.您可能还想查看HotSpot垃圾收集白皮书,该白皮书详细介绍了垃圾收集器的工作原理,包括逐个应用程序调整收集器的方法.
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
1613 次 |
| 最近记录: |