Java gc如要考虑三件事情。
- 哪些内存需要回收?
- 什么时候回收?
- 如何回收?
确认回收对象
想要进行Java GC,首先要做的便是确定哪些对象是可以回收的。
引用计数法
判断对象是否存活,最基本的算法便是引用计数法。对对象添加一个引用计数器,每当一个地方引用它时,计数器值+1;当引用失效时,计数器-1。但是主流的Java虚拟机都没有采用这种算法,最大的原因是其没办法解决循环引用的问题。
可达性分析法
可达性分析法是目前应用比较广泛的算法。其基本思想就是通过一系列的\"GC Roots\"对象作为起始点,从这些节点开始向下搜索,搜索走过的路径称为引用链(Reference Chain),当一个对象没有任何引用链与GC Roots相连,则会被判定为可回收对象。
被判断为可回收的对象并不会立马被回收。要宣告一个对象死亡,至少要经历两次标记过程:如果对象在进行可达性分析后被发现没有与GC Roots相连的引用链,那它将被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,虚拟机将这两种情况都视为“没有必要执行”。
如果判断为没有必要执行finalize()方法,那第二次标记后,便会被回收。
如果判断为有必要执行finalize()方法,那么在finalize()方法执行过程中,该对象可以完成自我救赎–只要重新与引用链上的任何一个对象建立关联即可,譬如把自己(this关键字)赋值给某个类变量或者对象的成员变量,那在第二次标记时它将被移出\"即将回收\"集合。因为任何一个对象的finalize()方法,只会被调用一次。也就是说对象自我救赎的机会只有一次。
需要注意的是,Java语言并不建议使用finalize()方法。
垃圾回收算法
确认了要回收的对象,便可以开始垃圾回收了。那怎么回收呢?
标记-清除算法
这是最基础的收集算法,后续的收集算法都是基于这种思路并对其不足进行改进而得到的。该算法分为两个阶段:标记和清除。
首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。
这个算法的不足之处有两个:一个是效率低下;另一个是会产生大量不连续的内存碎片。碎片过多会导致在分配大对象的时候,因为无法找到足够的连续内存不得不提前出发一次GC。
复制算法
为了解决效率问题,复制(Copying)算法出现了。它将内存按容量分为大小相等的两块,每次使用其中的一块,当一块用完了,将活着的对象移到另一块上面,然后将已使用过的内存一次清理掉。
这种方式的缺点也很明显:
1.浪费内存
2.当存活对象很多时,复制操作会很耗时。
标记-整理算法
标记-整理算法的标记过程和标记-清除算法一样,但后续步骤不是直接回收对象,而是让存活的对象移动到一端,然后直接清理到其他内存。
分代收集算法
这是目前商业虚拟机都采用的一种算法。它是基于前面几种算法的。所谓分代收集算法,便是根据不同的区域,采用不同的收集算法。一般java堆分为新生代和老年代。
新生代
新生代又被分为一块较大Eden区和两块较小的Survivor区,Eden区的Survivor区的比例是8:1。每次使用的时候,都只用Eden区,和其中一块Survivor区,发生GC时,会将所有存活的对象移到到另一块没有使用的Survivor区。
但是复制的时候,用来存放存活对象的Survivor区空间不足怎么办?这个时候,我们需要另一块区域来保证这些对象有地方存放,这块区域就是老年代。
老年代
如果另外一块Survivor空间没有足够空间存放上一次新生代收集下来的存活对象时,这些对象将直接进入老年代。老年代的对象存活率高,采用标记-清理或者标记-整理算法来回收。
垃圾回收器
垃圾回收算法是理论,垃圾回收器是具体的实现。目前比较常用的是CMS回收器和G1回收器。
CMS回收器
CMS(Concurrent Mark Sweep)回收器是一种以获取最短回收停顿时间为目标的收集器。其基于标记-清楚算法实现,对用重视服务响应速度,希望系统停顿时间最短,以带来较好体验的应用来说,CMS回收器是很好的选择。
CMS运作过程分为4个步骤:
- 初始标记
- 并发标记
- 重新标记
- 并发清楚
G1回收器
G1是一款面向服务端应用的垃圾回收器。HotSpot开发团队希望它未来可以替换掉JDK1.5发布的CMS回收器。G1具备以下特点:
1.并行与并发
2.分代收集
3.空间整合
4.可预测的停顿
继续阅读与本文标签相同的文章
-
精读《使用 css 变量生成颜色主题》
2026-05-19栏目: 教程
-
震撼!全球首台“智慧旅游黑科技车”现身井陉……
2026-05-19栏目: 教程
-
科技产品没有时尚力?搜狗AI录音笔,要科技更要时尚
2026-05-19栏目: 教程
-
安!排!微信聊天记录的最佳恢复方法,拿走不谢!
2026-05-19栏目: 教程
-
一线丨滴滴与清华成立未来出行联合研究中心
2026-05-19栏目: 教程
