个人博客:http://47.104.241.73:8080
如何确定垃圾
-
因用计数法
在Java中,引用和对象是有关联的。如果要操作对象,必须用因用进行。因此,很显然一个简单的方法是通过引用计数来判断一个对象是否可以回收。简单说,如果一个对象没有任何与之关联的引用,即他们的引用计数都为零,则说明对象不太可能再被用到,那个这个对象可以回收。 -
可达性分析
为了解决引用计数法的循环引用问题,java使用了可达性分析的方法。通过一系列“GC root”对象作为起点搜索。如果在“GC root”和一个对象之间没有可达路径,则称该对象是不可达的,不可达对象不等价于可回收对象,不可达对象变为可回收对象至少要经过两次标记过程,两次标记后,仍为不可达对象,则将面临回收。
垃圾回收算法(Mark-Sweep)
-** 标记清除算法**
最基础的垃圾回收算法,分为两阶段:标记和清除。标记阶段标记出所有需要回收的对象,清除阶段回收被标记的对象所占用的空间。
缺点:内存碎片化严重,后续可能发生大对象找不到可利用空间的问题。
复制算法(copying)
为了解决Mark-Sweep算法内存碎片化的缺陷,提出了复制算法。按内存容量将内存分为大小两块,每次使用其中一块,当这一块存满后,将尚存活的对象复制到另外一块上去,把已使用的内存清掉。
这个算法虽然实现简单,内存效率高,不易产生碎片,但是最大的问题是,可用内存被压缩到原来的一半。且存活对象增多的话,Copying算法的效率会大大降低。
标记整理算法(Mark-Compact)
该算法结合了以上两个算法,标记阶段跟标记清除算法的标记阶段一样,标记后不是马上清除对象,而是把存活的对象移动到内存的一端,然后清除端边界外的对象。
分代手机算法
分代收集算法是目前大部分jvm采用的方法,核心思想就是根据对象存活的不同生命周期讲内存划分为不同的域,一般情况下将GC堆分为新生代和老年代。老年代的特点是每次垃圾回收时只有少量对象需要回收,新生代是每次垃圾回收时都有大量垃圾需要被回收,因为可以根据不同的区域选择不同的算法。