JVM三大常用GC回收算法

时间:2021-07-05 18:55:36   收藏:0   阅读:0

前言

谈常用GC回收算法之前,先说一下引用计数法

算法原理

引用计数算法很简单,它实际上是通过在对象头中分配一个空间来保存该对象被引用的次数。如果该对象被其它对象引用,则它的引用计数加一,如果删除对该对象的引用,那么它的引用计数就减一,当该对象的引用计数为0时,那么该对象就会被回收。

比如说,当我们编写以下代码时,

String p = new String("abc")

abc这个字符串对象的引用计数值为1

技术图片

而当我们去除abc字符串对象的引用时,则abc字符串对象的引用计数减1

技术图片

常用GC回收算法

一、复制算法

所谓复制算法(Copying),即将内存平均分成A区、B区两块,进行复制+清除垃圾的操作,算法图解如下:

技术图片

算法过程:

  1. 新生对象被分配到A块中未使用的内存当中。当A块的内存用完了, 把A块的存活对象复制到B块。
  2. 清理A块所有对象。
  3. 新生对象被分配到B块中未使用的内存当中。当B块的内存用完了, 把B块的存活对象复制到A块。
  4. 清理B块所有对象。
  5. 循环1。

分析:

这种算法简单高效,但是内存代价极高,有效内存只为总内存的一半,会浪费掉50%的空间。所以这种算法只是纸面算法,不具备可用性,一般来说都会使用优化的复制算法。

适用场景:

这种方法不涉及到对象的删除,只是把可用的对象从一个地方拷贝到另一个地方,因此适合大量对象回收的场景,比如新生代的回收。

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!