您的位置:首页 > 其它

JVM 垃圾回收相关

2013-12-17 15:08 211 查看
先列出几种JVM垃圾回收类型及特点

1. 引用计数方式

堆中每个对象都有一个引用计数器,创建对象时,该对象的引用计数置1,此后,当有其他变量引用该对象时,引用计数都会加1。当一个变量被设置成新值或者引用超时后,引用计数减1。当引用计数器值为0时,该对象会被回收。这种gc方式可避免STW问题,但是它无法检测出循环引用的对象,因此会造成内存泄露,而且维护计算器也会造成一定开销。

2. 标记-收集-压缩(mark-sweep-compact)方式

垃圾收集器从root开始,追踪对象的引用图,并标记为活的对象,此为mark过程。遍历整个堆空间,将未被标记为活的对象清理掉,此为sweep过程。对sweep过后的堆空间进行压缩,去除内存碎片,此为compact方式。经过一次mark-sweep-compact处理之后,当前所有活的对象都被转移到一块连续的堆空间中。这种方式的gc不会出现内存泄露问题,但是compact的过程会导致程序暂停运行,而且sweep是对整个堆空间进行扫描,存在性能问题。

3. 拷贝回收

这种方式的垃圾回收是在内存中开辟堆空间两倍大小的空间,每次只使用一半空间。每一次gc都会把这一半中活的对象拷贝到另一半中。这种gc方式效率高,不必遍历整个堆空间,但是gc期间会造成程序停止运行,而且会造成一些生命周期较长的对象反复来回拷贝,并且,它需要的堆大小是其他方式的两倍。

4. 分代收集

分代收集的理论基础是:大部分对象的生命周期很短,但是总有一些对象的生命周期很长。这种gc方式会将堆空间按代分成多个区域,不同区域可采用不同的gc算法。年轻代的堆空间存放年轻对象,这个区域gc较频繁,当一个对象经过多次gc仍旧存活时,就被拷贝到老年代堆空间,这个区域gc不会太频繁。分代收集很好的在性能和程序可用性之间取了平衡,在各jvm的实现中较常见。

HotSpot VM的实现方式:

整个Java堆可以切割成为三个部分

1.Young:

a.Eden:存放新生对象。

b.Survivor:存放经过垃圾回收没有被清除的对象。

c.semi-Spaces:和Survivor做Copying collection。

2.Tenured:对象多次回收没有被清除,则移到该区块。

3.Perm:存放加载的类型还有方法对象。

不同的世代使用不同的GC算法。

1.Minor collection:

YOUNG世代使用将Eden还有Survivor内的数据利用semi-space做复制收集(Copying collection),

并将原本Survivor内经过多次垃圾收集仍然存活的对象移动到Tenured。

2.Major collection则会进行Minor collection,Tenured世代则进行标记压缩收集。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: