内存回收机制

来源:互联网 发布:php处理数组的函数 编辑:程序博客网 时间:2024/06/11 02:22

垃圾收集技术的三大传统算法——引用计数算法(无法解决循环引用的问题)、标记-清除算法(效率问题)和复制算法(空间利用率减半)。

现在的回收算法:标记-整理,增量收集算法(实际是对多线程的运用),分代收集(分类收集、在JVM中得到了应用)。

具体讲解一下JVM的垃圾回收机制:


Space(命名为S0和S1)具体分为这么几块,那么在每一块又是怎么进行内存分配及回收的那:

1、年轻代(Young Gen):年轻代主要存放新创建的对象,内存大小相对会比较小,垃圾回收会比较频繁。年轻代分成1个Eden Space和2个Suvivor 

当对象在堆创建时,将进入年轻代的Eden Space。

垃圾回收器进行垃圾回收时,扫描Eden Space和A Suvivor Space,如果对象仍然存活,则复制到B Suvivor Space,如果B Suvivor Space已经满,则复制 Old Gen

扫描A Suvivor Space时,如果对象已经经过了几次的扫描仍然存活,JVM认为其为一个Old对象,则将其移到Old Gen。

扫描完毕后,JVM将Eden Space和A Suvivor Space清空,然后交换A和B的角色(即下次垃圾回收时会扫描Eden Space和BSuvivor Space。

 可以看到:Young Gen垃圾回收时,采用将存活对象复制到到空的Suvivor Space的方式来确保不存在内存碎片,采用空间换时间的方式来加速内存垃圾回收。
 2、年老代(Tenured Gen):年老代主要存放JVM认为比较old的对象(经过几次的Young Gen的垃圾回收后仍然存在),内存大小相对会比较大,垃圾回收也相对没有那么频繁(譬如可能几个小时一次)。年老代主要采用压缩的方式来避免内存碎片(将存活对象移动到内存片的一边),当然,有些垃圾回收器(譬如CMS垃圾回收器)出于效率的原因,可能会不进行压缩。

有这些区域的区别,那么我们就可以理解那些在JVM经常配置的参数的意义了:

 -Xms:初始堆大小

-Xmx:最大堆大小

-Xmn:年轻代的大小

-XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4

-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5

-XX:MaxPermSize=n:设置最大持久代大小

-XX:MinPermSize=n:设置初始持久代大小

其中具有如下关系:

Eden+ S0 + S1 = Xmn
典型的配置:java -Xmx3550m -Xms3550m -Xmn2g -Xss128k


注:以上参考了三篇不错的帖子:

垃圾收集趣史:http://blog.csdn.net/javafuns/article/details/1771535

垃圾回收调优及JVM参数详解:http://blog.csdn.net/suiyuan0808/article/details/5109164

SunJVM内存管理和垃圾回收:http://ayufox.iteye.com/blog/652205



原创粉丝点击