Java垃圾回收策略

java虚拟机的生命周期:

启动一个java程序时,一个虚拟机实例开始诞生,程序关闭的时候,虚拟机实例也随之消亡。

1.标记-清理算法

第一步:发生垃圾清理操作时,将可以被回收的对象进行标记处理。
第二步:回收第一步中标记的对象所占的空间。

优点:算法简单。
缺点:内存碎片化严重,后续可能会发生大对象找不到可以存放的空间问题。

2.复制算法

将内存分为大小相同的两块,每次只用其中的一块;当使用的这块内存存满后,将其中还存活的对象复制到另一块内存中,再将之前那块内存进行清理操作。

优点:不容易产生内存碎片。
缺点:内存被压缩到了原来的一半,如果存活对象比较多的话,复制算法效率会下降。

3.标记-整理算法:

该算法综合了上面两种算法:

第一阶段:将需要清除的对象进行标记。
第二阶段:将存活的的对象(未被标记的)向内存的一端进行移动,移动完毕后,清除剩下的内存空间。

4.分代收集算法:

该算法是目前大部分JVM所采用的的一种垃圾回收算法。

新生代
一般新生代会划分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden空间和其中的一块Survivor空间。

Eden空间比Survivor0Survivor1空间大,这是因为在新生代中大部分的对象被创建后很快就会被GC,所以Survivor空间不用分配太多的空间。

老生代
在新生代中经历了N次垃圾回收后仍然存活的对象,就会被放到老生代中。
因此,可以认为老生代中存放的都是一些生命周期较长的对象。所以在老生代中一般所采取的垃圾回收算法是标记-整理算法。

当进行回收时,将Eden空间和Survivor0空间中还存活的对象复制到另一块Survivor1空间中,
然后清除Eden和Survivor0的空间,之后就使用Eden和Survivor1这两块空间。
	
当进行下一次垃圾回收时,将Eden和Survivor1的空间还存活的对象复制到Survivor0,然后清除Eden和Survivor1的空间。	
	
以此类推,每次总有一个Survivor空间是空的。
当然,如果目标Survivor空间无法存储Eden和Survivor存活的所有对象时,会将这些对象存储到老生代。
当对象中Survivor区躲过一次GC时,其年龄就会加1,当到达一定的年龄后,会将其移动到老生代。

根据对象的生命周期,将内存空间划分为新生代和老生代;每次垃圾回收新生代大部分对象被回收老生代少部分对象被回收。

5.引用计数算法:

给对象增加一个计数器,对象每被引用一次,计数器+1,计数器数值越大说明对象引用越频繁。

优点:算法简单。
缺点:不能帮助解决相互引用对象的回收问题。

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页