Java GC
什么是GC?就是G:Garage垃圾 C:Collection收集。在我们使用对象的时候,总会生成然后销毁一些对象。如果我们要销毁的对象没有被销毁,那就是内存泄露。在C++里面,就有很多对象生成了没被销毁,导致了内存泄露。在Java中为了避免这种情况而引入了GC,它能帮我们清除掉大部分这种情况,但是有时也可能无法清除一小撮顽固的对象。详细看这里(http://www.ibm.com/developerworks/cn/java/l-JavaMemoryLeak/index.html)。
GC的工作原理
看了好几篇文章,提到了好多种算法。
一种是引用计数法。引用计数法,法如其名,就是当这个对象被引用一次,那就给它计数加一,被置为null或离开作用域就减一。垃圾收集时,将所有为0的都清除掉,但是对于那种循环引用的对象,传说中的孤岛,就没用了。这种算法很简单,很慢。
一种是有向图法。就是从根出发,搜索所有能到达的对象,然后清除掉所有不可到达的对象。至于实现起来就有多种方式了。
例如,用两个堆,将A堆中所有可到达的对象复制到B堆,然后清理A堆,缺点是要两个堆而且碰到大的对象复制起来据说很慢。
例如,从根出发遍历一遍堆里面所有可到达的对象,将这些对象标志为“可到达”,遍历完成后清除所有不可到达的。缺点是内存处理完成后就变得支离破碎了,感觉就像磁盘碎片似的。
例如,一种用block,还有“年代数”来做的垃圾收集,看的不是很明白。个人理解是这样的,分配内存的时候分出了好多块,块上面有计数器,用来表示他们是否存活。但对象被创造出来就放入块中,此时块计数加一,就像引用计数法那样工作。垃圾收集器这时候开始工作,碰到死了的块,整理里面的内存,然后认为它为一个新块。碰到活着的,代数加一。
(Thinking in java 第四章中“垃圾回收站如何工作”一段中有详细介绍)。
Java GC基础
最新推荐文章于 2025-08-10 21:28:09 发布