About GC
这里是我对JVM GC的一个想法:
线程在分配对象时,首先为每个线程提供一个Local的对象分配堆,其大小可以设为4K-32K,由于分配对象首先在线程局部进行,因此,对象分配的操作不需要进行线程间同步,其速度会比从全局堆中分配要快速得多。
当线程局部堆使用完毕后(这个会比较经常的出现,因为线程局部堆较小),对此堆进行垃圾回收。
在 这里我们使用模拟的引用计数法来记录全部堆中对象对局部堆中对象的引用,在putfield/putstatic指令执行时,检查是否把局部堆对象的指针 存储在全局堆下,如果是,则在对象的头中设置标志:本对象已被全局堆中对象引用。(这样做的话,putfield指令速度将会变慢,不够,我估计:该影响 是有限的)
对局部对进行垃圾回收时,仅需要检查线程的局部root(线成堆栈、寄存器),将所有的如下对象视为垃圾:
- 将所有的从root引用到的对象复制到全局堆中
- 将所有的被全局堆引用的对象复制到全局堆中
- 将这些对象所引用到的局部堆中的对象复制到全局堆中
- 所有其它剩下的对象是垃圾
- 遍历全局堆,更新所有对局部对象的引用,使其指相新的地址。
在这个垃圾回收过程中,其它的线程基本上不需要进行停顿,除非他们要访问此局部堆中的对象,此时,如何处理呢?
0 Comments:
张贴评论
<< Home