欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JVM垃圾收集算法之清除算法

程序员文章站 2022-04-09 19:42:02
最近看了一些大佬的博文,文中提到说:学习知识不能一味的死学滥学,在学之前要明白为什么要学这个知识,在实际的应用中怎么运用这个知识。我觉得说的很对,很多时候我学习确实是了解了这是什么原理,但是要说到实际中怎么应用确实比较难总结。但以后我也会尽量总结这个知识点有什么用。 看前总结:为什么要了解垃圾回收中 ......

  最近看了一些大佬的博文,文中提到说:学习知识不能一味的死学滥学,在学之前要明白为什么要学这个知识,在实际的应用中怎么运用这个知识。我觉得说的很对,很多时候我学习确实是了解了这是什么原理,但是要说到实际中怎么应用确实比较难总结。但以后我也会尽量总结这个知识点有什么用。

 

  看前总结:为什么要了解垃圾回收中清除算法的具体实现,那是因为在jvm有很多种不同的垃圾收集器,而每个垃圾收集器中运用的清除算法是不一定相同的,为此我们在具体的应用中配置jvm的参数时,要根据业务的需求来对垃圾收集器进行配置,而清除算法是考虑应用哪一种垃圾收集器的要点之一。我们要根据业务的需求选择适合的垃圾收集器。

  • 在上次的博文中,我记录了,今天刚好想总结一下垃圾的清除算法。注意:回收算法指的是jvm的回收器用的是什么方法回收,并不指具体的回收器。
  • 标记——清除算法

  定义:标记清除算法顾名思义,是指在虚拟机执行垃圾回收的过程中,先采用标记算法确定可回收对象,然后垃圾收集器根据标识清除相应的内容,给堆内存腾出相应的空间。

  缺点:容易产生大量的内存碎片,可能无法满足大对象的内存分配,一旦导致无法分配对象,那就会导致jvm启动gc,一旦启动gc,我们的应用程序就会暂停,这就导致应用的响应速度变慢。

操作如图所示:

  JVM垃圾收集算法之清除算法

 

  •  复制算法

  定义:把内存空间分成两个维度,每次只使用其中一个空间。当开始gc的时,垃圾回收器会把相应的垃圾清除,剩下的存活对象按照顺序排列完成清理。

  缺点:复制算法把有用的空间压缩了一半,因为每次只能使用一半的空间用作分配,剩下的用作gc后的分配。

操作如图所示:

JVM垃圾收集算法之清除算法

 

  • 标记——压缩算法

  定义:标记压缩算法是标记清除的改进版本,当垃圾收集器把垃圾清除后,下一步还会对内存碎片进行整理,把存活对象统一的整理到一边。

  缺点:虽然算法免去了内存碎片的出现和节省了空间,但这种算法需要频繁的移动对象,所以会造成gc效率的降低。

操作如图所示:

 

JVM垃圾收集算法之清除算法

 

 

  • 总结
  标记—清除算法 复制算法 标记—压缩算法
速度 中等 最快 最慢
空间开销 少(堆积碎片) 通常需要两倍的空间
移动对象 否  

 

 

 

 

由表格可知:

  1. 标记——清除算法由于速度效率不高且会产生内存碎片,在实际中也很少被垃圾收集器使用。
  2. 而复制算法由于它的效率较高,在经常发生gc的新生代区应用是个不错的选择,因为在新生代的存活对象一般不多,对于空间的需求不高,而且还可以通过对象提升把对象放入老年代。
  3. 而标记压缩算法则可以应用在gc不那么频繁的老年代,虽然效率较低,但由于gc的次数没有那么频繁、同时由于可以进行内存碎片的整理,也有利于老年代的大对象的存放。
  4. 没有绝对优秀的算法,只有最适合的算法,所以具体使用需要根据业务的需求而定。