JVM虚拟机中,哪种垃圾回收算法适用于长尾对象处理?
- 内容介绍
- 文章标签
- 相关推荐
本文共计6142个文字,预计阅读时间需要25分钟。
垃圾回收分为两个阶段:标记阶段和清除阶段。在堆内存中存在大量Java对象实例。在GC执行垃圾回收前,首先需要区分内存中哪些是存活对象,哪些是已死亡对象。只有被标记为存活的对象才会被保留。
垃圾回收分为两个阶段:标记阶段和清除阶段。
在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为己经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,这个过程称为垃圾标记阶段。
当成功区分出内存中存活对象和死亡对象后,GC接下来的任务就是执行垃圾回收,释放掉无用对象所占用的内存空间,这个过程称之为清除阶段。
标记阶段
当一个对象已经不再被任何的存活对象继续引用时,便可判定为已经死亡。
判断对象存活一般有两种方式:
- 引用计数算法
- 可达性分析算法
引用计数算法
引用计数算法(Reference Counting):对每个对象保存一个整型的引用计数器属性,用于记录对象被引用的情况。
例如:一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1;当引用失效时,引用计数器就减1。只要对象A的引用计数器的值为0,即表示对象A不可能再被使用,可进行回收。
优点:实现简单,垃圾对象便于辨识;判定效率高,回收没有延迟性。
缺点:需要单独的字段存储计数器,增加了存储空间的开销。每次赋值都需要更新计数器,伴随着加法和减法操作,增加了时间开销。且无法处理循环引用的情况(致命),这也导致在Java的垃圾回收器中没有使用这类算法。
本文共计6142个文字,预计阅读时间需要25分钟。
垃圾回收分为两个阶段:标记阶段和清除阶段。在堆内存中存在大量Java对象实例。在GC执行垃圾回收前,首先需要区分内存中哪些是存活对象,哪些是已死亡对象。只有被标记为存活的对象才会被保留。
垃圾回收分为两个阶段:标记阶段和清除阶段。
在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为己经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,这个过程称为垃圾标记阶段。
当成功区分出内存中存活对象和死亡对象后,GC接下来的任务就是执行垃圾回收,释放掉无用对象所占用的内存空间,这个过程称之为清除阶段。
标记阶段
当一个对象已经不再被任何的存活对象继续引用时,便可判定为已经死亡。
判断对象存活一般有两种方式:
- 引用计数算法
- 可达性分析算法
引用计数算法
引用计数算法(Reference Counting):对每个对象保存一个整型的引用计数器属性,用于记录对象被引用的情况。
例如:一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1;当引用失效时,引用计数器就减1。只要对象A的引用计数器的值为0,即表示对象A不可能再被使用,可进行回收。
优点:实现简单,垃圾对象便于辨识;判定效率高,回收没有延迟性。
缺点:需要单独的字段存储计数器,增加了存储空间的开销。每次赋值都需要更新计数器,伴随着加法和减法操作,增加了时间开销。且无法处理循环引用的情况(致命),这也导致在Java的垃圾回收器中没有使用这类算法。

