科技 > 电脑产品 > 内存

JVM垃圾回收机制之GC解读

29人参与 2025-05-05 内存

jvm的垃圾回收机制:gc,是java提供的对于内存自动回收的机制。

在 java 中,所有的对象都是要存在内存中的(也可以说内存中存储的是一个个对象),因此将内存回收,也可以叫做死亡对象的回收。gc回收的是“堆上的内存”。

一、死亡对象的判断算法

1.1 引用计数算法

思想:

给对象增加一个引用计数器,每当有一个地方引用它时,计数器就+1;当引用失效时,计数器就-1; 任何时刻计数器为0的对象就是不能再被使用的,即对象已"死"。

引用计数法实现简单,判定效率也比较高,在大部分情况下都是一个不错的算法。比如python语言就采用引用计数法进行内存管理。

在主流的jvm中没有选用引用计数法来管理内存,最主要的原因就是引用计数法无法解决对象的循环引用问题。

1.2 可达性分析算法

思想:

通过一系列称为"gc roots"的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径称之为"引用链",当一个对象到 gc roots 没有任何的引用链相连时 (从gc roots到这个对象不可达)时,证明此对象是不可用的。如下:

对象 object5 - object7 之间虽然彼此还有关联,但是它们到 gc roots 是不可达的,因此他们会被判定为可回收对象。

在java语言中,可作为 gc roots 的对象包含下面几种:

在 jdk1.2 时,java 对引用的概念做了扩充,分为以下四种,这四种引用的强度依次递减:

二、垃圾回收算法

2.1 标记-清除算法

"标记-清除"算法是最基础的收集算法。算法分为"标记"和"清除"两个阶段 : 首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。后续的收集算法都是基于这种思路并对其不足加以改进而已。

2.2 复制算法

复制"算法是为了解决"标记-清理"的效率问题。

它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这块内存需要进行垃圾回收时,会将此区域还存活着的对象复制到另一块上面,然后再把已经使用过的内存区域一次清理掉。这样做的好处是每次都是对整个半区进行内存回收,内存分配时也就不需要考虑内存碎片等复杂情况,只需要移动堆顶指针,按顺序分配即可。

此算法实现简单,运行高效。算法的执行流程如下图 :

2.3 标记-整理算法

复制收集算法在对象存活率较高时会进行比较多的复制操作,效率会变低。因此在老年代一般不能使用复制算法。 针对老年代的特点,提出了一种称之为"标记-整理算法"。标记过程仍与"标记-清除"过程⼀致,但后续步骤不是直接对可回收对象进行清理,而是让所有存活对象都向一端移动,然后直接清理掉端边界以外的内存。

流程图如下:

2.4 分代算法

分代算法和上面 3 种算法不同,分代算法是通过区域划分,实现不同区域和不同的垃圾回收策略,从而实现更好的垃圾回收。

当前 jvm 垃圾收集都采用的是"分代收集(generational collection)"算法,这个算法并没有新思想,只是根据对象存活周期的不同将内存划分为几块。

一般是把java堆分为新生代和老年代。在新生代中,每次垃圾回收都有大批对象死去,只有少量存活,因此我们采用复制算法;而老年代中对象存活率高、没有额外空间对它进行分配担保,就必须采用"标记-清理"或者"标记-整理"算法。

哪些对象会进入新生代?哪些对象会进入老年代?

面试题 : 请问了解minor gc和full gc么,这两种gc有什么不一样吗?

三、垃圾收集器

收集算法是内存回收的方法论,垃圾收集器是内存回收的具体实现。

垃圾收集器的作用:垃圾收集器是为了保证程序能够正常、持久运行的一种技术,它是将程序中不用的死亡对象也就是垃圾对象进行清除,从而保证了新对象能够正常申请到内存空间。

以下这些收集器是 hotspot 虚拟机随着不同版本推出的重要的垃圾收集器:

上图展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明他们之间可以搭配使用。所处的区域,表示它是属于新生代收集器还是老年代收集器。

例如:虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。

3.1 cms收集器(老年代收集器,并发gc)

特性:

cms(concurrent mark sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的java应用集中在互联网站或者b/s系统的服务端上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。cms收集器就非常符合这类应用的需求。

cms收集器是基于“标记—清除”算法实现的,它的整个过程分为4个步骤:

优点:

缺点:

3.2 g1收集器(唯一一款全区域的垃圾回收器)

g1(garbage first)垃圾回收器是用在heap memory很大的情况下,把heap划分为很多很多的 region块,然后并行的对其进行垃圾回收。

g1垃圾回收器在清除实例所占用的内存空间后,还会做内存压缩。

年轻代垃圾收集 :

在g1垃圾收集器中,年轻代的垃圾回收过程使用复制算法。把eden区和survivor区的对象复制到新的survivor区域。 如下图:

老年代垃收集:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

您想发表意见!!点此发布评论

推荐阅读

JVM内存划分机制的使用详解

05-05

PS不能完成命令,因为没有足够内存(RAM)的解决方案

05-16

ps不能完成打开命令怎么办?PS不能完成命令,因为没有足够内存(RAM)的解决方法

05-16

计算机内存探秘:物理存储器、地址空间与内存地址

05-25

注销拼多多账号怎么注销?需要满足什么条件?

05-27

全球首发!芝奇256GB (64GBx4) DDR5-6000 CL32超频内存套装来了

04-22

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论