java的垃圾回收

来源:互联网 发布:宏晶stc单片机官网 编辑:程序博客网 时间:2024/05/16 07:47

从一个根出发,搜索所有的可达对象,这样剩下的那些对象就是需要被回收的

判断完了哪些对象是没用的,这样就可以进行回收了

最简单的,就是直接清空那个需要被回收的对象。但是这又出现了一个问题,就是内存会被分为一块一块的小碎片。

为了解决这个问题,可以采用第二种方法,就是在之前的基础上将存活的对象给整理一下,使他们变成一个连续的内存,从而释放出连续的较大的内存空间。

还有一中回收方法就是采用复制的办法:将内存分为2块,一块用来存放对象,另一块用来放着,当存放对象的那块满了以后就将上面存活的对象给复制过来,然后在这块内存上工作,并且将之前的内存清空,当自己这块满了以后再复制回去,如此反复。


比较效率的一中做法是将以上的几种方法给结合起来。

首先将内存分块,分为新生代,老年代和永久代。

永久代用来存放代码,等一些基本不改变的数据,

新生代用来存放刚产生的一些对象,新生代又可分为3块。分别为Edon区,Survivor0,survivor1,刚产生的对象是放在Edon区中,当这个区块放满了以后就将其存活的部分复制到survivor0块中,并且将Edon区中的数据清空,等到survivor0满了就将其中的存活的数据放到survivor1中,清空survivor0,垃圾回收到了一定次数还未被回收的对象,就可以放到老年区。一般来说,刚才产生的对象大多是要在下一次垃圾回收的时候就要被回收掉的,只有一小部分对象会被保留下来,这些被保留下来的对象都是比较稳定的,所以在老年区中的对象回收方法可以采用整理的方法,而在Edon区等新生代中采用复制的方法比较好。

0 0
原创粉丝点击