深入学习JAVA虚拟机-垃圾回收算法

概述

JAVA提供了自动垃圾回收管理机制来管理对象的生命周期,本文将对几种常见的算法进行简要介绍。

分类

  • Mark-Sweep 标记-清除
  • Copying 复制
  • Mark-Compac 标记-整理
  • Generational Collection 分代收集

标记-清除 算法是最基础的一种算法,通常通过“标记”和“清除”两个阶段,将需要进行回收的对象进行“标记”,标记完成后统一进行回收处理。这个算法主要存在两个不足:

  1. 效率问题,标记和清除连个过程效率都不高。
  2. 空间问题,通常进行标记和清除后会产生大量不连续的内存碎片,导致后期进行大对象分配时无法找到可用空间而触发不必要的GC动作。

复制 算法提高了 标记-清除算法的效率问题,主要通过将可用内存按容量分成大小相同的两块,每次选用其中一块进行对象内存分配,当内存用完的时候,就将存活的对象复制至另一块,然后将本块区域完全清理。这样使得每次只适用半块内存,所以显而易见的导致了容量浪费,成本变高。
另外,复制算法在对象存活率较高的情况下,由于每次复制很多对象,所以也会直接导致效率的就降低。

标记-整理 算法过程与 标记-清除类似,主要是通过标记对象后,将存活的对象想一端移动,然后对另一端内存进行清理,解决了“内存碎片”问题。

分代收集 算法作为目前商业虚拟机的主流算法,主要根据对象存活周期的不同将内存进行分块管理,一般是将Java堆分为新生代和老年代,根据IBM公司对JVM的专项研究表明,新生代中的对象98%是瞬息而亡的,所以HotSpot虚拟机磨人Eden和Survivor的大小比例是8:1,所以分代收集可以在新生代内存区域选用复制算法,而在老年代内存区域选择标记-清除或者标记整理进行回收。

#小结#
本文主要介绍JVM常用垃圾回收算法,通过了解各种算法来达到对实际生产所遇到的JVM相关问题进行追踪-定位-解决,并且在开发编码过程中尽量迎合虚拟机特性,来提升运行效能。

文章目录
  1. 1. 概述
  2. 2. 分类
,