Java垃圾回收新算法
(1)程序开始运行,对象动态地申请堆区,这时,每个块的计数器启动,根据引用对象的标记位情况来改变计数器的值,为1则计数器加1,8个计数器值放在数组里,并比较8个计数器值的大小,选取最大的计数器所在块,进行扫描。
(2)扫描出的垃圾转移到删除区,等待被删除。
(3)继续比较计数器值,但已经进行扫描的块不参加此后的比较,待删除的垃圾占的空间达到min值时,垃圾器开始对活跃区压缩内存碎片,并且在删除区同时开始进行垃圾删除申请。
(4)当删除区的空间达到了max值时,删除区的垃圾还没有被删除,这时停止活跃区的扫描,等待删除区进行垃圾删除。
4.2 实例分析
看下面一段程序:
int [][] m1=new int[2][3];
int [][] m2=new int[2][3];
m1=m2;
此例中,第一句是用new语句在堆中为数组申请了一个空间,然后用matrix引用此空间的对象(这里数组可以理解为对象),此时这个内存空间就是有用的。第二句是给matrix赋空值,matrix则不再引用此数组。此时,这个空间就是无用的。
对于原来的算法,m1引用的数组在堆中是随机存放的,若要查找垃圾,则会遍历整个堆内存,先标记,然后再清理垃圾。设耗费时间为Ta。
m1引用的数组在堆中是随机存放的,所以假设其放在活跃区中的cnt[x]区(x取值为0~7之一),下面分两种情况来考虑:
(1)最好的情况,m1原来引用的数组放在cnt1中为数组cnt[x]中最大的数,则查找到这个垃圾的时间为: T8+cnt[x]。

由此可以节省7Ta/16的时间。此新算法可以大大减少垃圾处理所需的时间。
Java语言对垃圾的处理是利用Java的垃圾处理器自动进行的,JVM虽然没有明确程序员必须了解垃圾处理器的过程和实质,但是,一个优秀的Java程序员应该掌握和熟悉垃圾处理器的工作机制,充分利用好内存空间,减少不必要的空间浪费,从而使程序更好地运行。
评论