垃圾收集技术的三大传统算法——引用计数算法(无法解决循环引用的问题)、标记-清除算法(效率问题)和复制算法(空间利用率减半)。
现在的回收算法:标记-整理,增量收集算法(实际是对多线程的运用),分代收集(分类收集、在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:设置初始持久代大小
其中具有如下关系:
垃圾收集趣史:http://blog.csdn.net/javafuns/article/details/1771535
垃圾回收调优及JVM参数详解:http://blog.csdn.net/suiyuan0808/article/details/5109164
SunJVM内存管理和垃圾回收:http://ayufox.iteye.com/blog/652205