快捷搜索:  汽车  科技

垃圾回收机制认识与算法详解(4垃圾回收算法)

垃圾回收机制认识与算法详解(4垃圾回收算法)为了解决Mark-Sweep算法内存碎片化的缺陷而提出的算法。按内存容量将内存划分为等大小的两块。每次只使用其中一块,当这一块内存存满后将存活的对象复制到另一块内存中,把已使用的内存清掉 3 、标记清除算法 最基础的垃圾回收算法,分为两个阶段,标记和回收。标记阶段标记出所有需要回收的对象,清楚阶段回收标记的对象所占用的空间 4、复制算法

1、引用计数法

在Java中,引用和对象是有关联的。如果要操作对象则必须用引用进行。因此,很显然一个简单的办法就是通过引用计数来判断一个对象是否可以回收。简单说,即一个对象如果没有任何与之关联的引用,即他们的引用计数都为0,则说明对象不太可能再被用到,那么这个对象就是可回收对象。

2、可达性分析法

为了解决引用计数法的循环引用问题, Java使用了可达性分析的方法,通过一系列的“GC Roots”对象作为起点搜索,如果在“GC Roots”和一个对象直接没有可达路径,则称该对象是不可达的。要注意的是不可达对象不等价于可回收对象,不可达对象变为可回收对象至少要经过两次标记过程。两次标记后仍然是可回收对象,则将面临回收

3 、标记清除算法

最基础的垃圾回收算法,分为两个阶段,标记和回收。标记阶段标记出所有需要回收的对象,清楚阶段回收标记的对象所占用的空间

垃圾回收机制认识与算法详解(4垃圾回收算法)(1)

4、复制算法

为了解决Mark-Sweep算法内存碎片化的缺陷而提出的算法。按内存容量将内存划分为等大小的两块。每次只使用其中一块,当这一块内存存满后将存活的对象复制到另一块内存中,把已使用的内存清掉

垃圾回收机制认识与算法详解(4垃圾回收算法)(2)

5 、标记整理算法

结合了以上两个算法,为了避免缺陷而提出。标记阶段和Mark-Sweep算法相同,标记后不是清除对象,而是将存活的对象移向内存的一端。然后清除端边界外的对象

垃圾回收机制认识与算法详解(4垃圾回收算法)(3)

6、分代收集算法

分代收集法是目前大部分JVM所采用的的方法,其核心思想是根据对象存活的不同生命周期将内存划分为不同区域,一般情况下将GC堆划分为老生代和新生代。老生代的特点是每次垃圾回收时只有少量对象需要被回收,新生代特点是每次垃圾回收时都有大量垃圾需要被回收,因此可以根据不同区域选择不同的算法

新生代与复制算法

目前大部分JVM的GC对于新生代都采取Copying的算法,因为新生代中每次垃圾回收都要回收大部分对象,即要复制的操作比较少,但通常并不是按照1:1来划分新生代。一般将新生代划分为一块较大的的Eden空间和两个较小的survivor空间,每次使用Eden空间和其中一块survivor空间,当进行回收时,将该两块空间中还存活的对象复制到另一块survivor中

老年代和标记复制算法

老年代因为每次只回收少量对象,因而采用Mark-Compact算法

1、Java虚拟机提到过的处于方法区的永生代,它用来存储calss类,常量,方法描述等。对永生代的回收主要包括废弃常量和无用的类。

2、对象的内存分配主要在新生代的Eden Space和Survivor Space的From Survivor ,少数情况会直接分配到老年代。

3、当新生代的Eden区和Survivor区GC,进行GC后,Eden区和From Survivor区的存活对象会被挪到To Survivor区,然后将Eden区和From Survivor区清理

4、如果TO Survivor没有足够内存存储某个对象,则将这个对象直接存储到老年代

5、在进行GC后,使用的便是Eden区和From Survivor区,如此反复循环

6、当对象在Survivor区躲过一次GC后其年龄就会加1。默认情况下年代达到15 的对象都会被移到老年代。

谢谢大家的赞 。觉得对学习有帮助的请给个赞,大家一起进步 后续会继续更新,谢谢

猜您喜欢: