About GC: Scan Memory
在JVM的GC处理中,经常需要的一个操作是:遍历整个对象堆,查找堆中是否存在对某个对象的引用。
假设我们一次对一块64K大小的对象区域进行GC,而整个堆的大小为100M,我们首先要遍历100M内存,看看是否有可能的指针指向了这64K内存。
for(int *start = (int*)current; start < (int*)end; start++){
int value = *start;
if(value & 0xFFFF0000 == base){
match((int)start);
}
}
这个测试程序从current到end一共是100M的内存,使用 gcc -O3编译选项,运行时间大约为0.10s。
这个时间是一个很关键的,如果不在算法上进行大的改进,那么这个时间将是一个不可压缩的时间。
====== 说老实话,我做这个测试的时候对GC的了解确实比较一般,实际上,现有的GC在进行full gc时,对于100M的对象区,其数量级往往是超过1s的。说明算法的复杂度确实很高的了。
0 Comments:
张贴评论
<< Home