垃圾收集的实现

1、引用计数器,早期版本

优点:交织的在程序运行之中运行教快

缺点:由于计数带来了额外的开销,不能识别循环引用

2、跟踪收集:

优点:可以识别循环引用,不会交织在 程序运行过程中

缺点:需要维护一张对象引用全景图,增加了 内存开销,如果是一个复杂的引用,那么还会增加引用对象图遍历的性能开销。

3、基于对象跟踪的分代增量收集:

当今大部分的企业及虚拟机产品,都使用这种收集技术。如:Sun的HotSpot。

具体实现,以SUN的HotSpot为例说明

SUN的JVM将整个堆分为三代,即三个区域,经历了若干次的GC依然存活的对象,晋升到OldGen。内存占用较大的对象,则直接被分配到OldGen。而PermGen中用于存放场时间存活的对象,如Class对象基础数据信息,以及全局应用配置信息等。

年轻区又被进一步分为一个Eden区和两个Survivor Space,而两个SurvivorSpace在同一时刻,总有一个是空的,这个空的Survivor Space被称为To Space,另外一个则被称为From Space。在对YongGen进行GC时,Eden中存活的对象会被copy到to Space中,而剩余的则晋升到OldGen中。当To Spae不足时,那些本该被copy到To Space中的对象则被就地Tenured,这一点也是 需要注意的,因为这往往会带来性能问题,SUN JVM 提供了调节Survivor Space大小的参数,当GC Log中出现Tenured字样时,很可能就是Survivor Space不够大造成的。

程序运行一段时间Eden空间不足的时候,在触发垃圾回收之前,会将一些依然存活的对象拷贝到From Space,释放Eden区间的对象,重新使用。一旦决定垃圾回收,会将Eden的对象拷贝到To Space。已经拷贝到到From Space的对象,会做一个考量,可能会拷贝到年老区域。Eden区域里面大的对象会被拷贝到年老对象。

 

何时进行G呢?很简单当然是

YoungGen不够就对YongGen做GC。OldGen不够就对OldGen做GC.针对YoungGen的收集算法与针对OldGen的算法是不同的。值得注意的是,当OldGen因为没有足够的空闲空间,而无法接纳YoungGen晋升来的对象时,YoungGen Colletion Algorithm将会停止,取而代之的是,使用OldGen Collection Algorithm,对整个堆进行GC此时所有的应用进程将被挂起,等候垃圾收集的结束,这种情况也被称为全收集,另外在回收OldGen对象过程中,还要启动堆空间碎片的压缩,以便节省内存空间的使用,显然这种收集是需要尽力避免的或者尽量使之延后。所有对于OldGen,不能只看到其仍有空闲,就认为其大小已经足够。

而对于YoungGen的收集,首先采用复制将仍然活的对象复制到其它区域,然后一次性回收剩余对象,这也称为增量收集,这种收集算法可以降低停顿,并且提高吞吐量。随着java版本的提升在JavaSE5.0Update 6及之后的版本中,对于OldGen区域的java对象的回收算法也得到了改,出现了针对OldGen对象的并行回收算法,从而大大提升了性能,但无论怎样OldGen对象的回收远比YoungGen对象的回收耗时耗力。

 

From Space的对象进入ToSpace或者进入OldGen

小收集(minor collection)
全收集对应用系统性能会造成极大伤害,因此尽力避免。为次最新的JVM都引入了小收集。当分配器不能满足分配请求时,它
先触发一个小收集,它只收集年轻的代。因为年轻代中的许多对象已经死亡,复制收集器完全不用分析死亡的对象,所以小的
收集的暂停可以相当短,通常可以收回大量的堆空间。如果小的收集释放了足够堆空间,那么用户程序就可以立即恢复。小收集
能够最大程度的避免和延后全收集的发生频率。
分代收集的优缺点:
优点:1、不同时收集所有代,因此可以是垃圾收集时间更短。
      2、可以针对不同代对象采用不同的收集算法。从而充分的利用系统资源。
缺点:收集算法复杂,开销巨大,这也是java性能与内存使用问题的主要来源之一。
A a = new A();do something;a=null;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值