什么是JVM的垃圾回收

Posted 我永远信仰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是JVM的垃圾回收相关的知识,希望对你有一定的参考价值。

什么是JVM的垃圾回收?

       顾名思义就是释放垃圾占用的空间,防止内存泄露。有效的使用可以使用的内存,对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。

垃圾回收技术是一项不断改进与优化的技术,要想理清垃圾回收的机制,需要搞清楚下面这三个问题。

一:那些垃圾需要回收?

判断对象需要回收有两种算法。一种是引用计数算法,一种是可达性分析算法。

引用计数算法
给对象的引用进行计数(统计),它通过记录对象被引用的次数从而判断该对象的重要程度。
每当有一个地方引用它时,计数器就加1,当引用失效时,计数器就减1;当某个对象的引用计数为0,说明该对象没有被使用,从而被JVM当成垃圾,对它进行回收。

不过引用计数算法也存在着一定的问题
当两个对象相互引用时,由于他们的相互引用对方所以计数器不为零,就会导致这两个对象无法被回收。

所以JVM采用了另一种机制来判断对象是否存活,那就是可达性分析算法。

可达性分析算法
确定对象哪些还“存活”着(通过任何途径都无法使用的对象)。
首先确定一系列的根对象(GC Roots),并从根对象为起点,根据对象中的引用关系搜索出一条引用链(Reference Chain),在引用链中的对象就存活,不在的就被认定位可回收的对象。

可以作为根对象的有下面这几种

①虚拟机栈中的引用对象(正在运行的方法使用到的变量,参数等)

②方法区中静态属性引用对象(static关键字声明的字段)

③方法区中常量引用的对象(inal关键字声明的字段)

④本地方法栈中引用的对象(native方法)

⑤Java虚拟机内部的引用。(系统内部的东西当然能作为根)

二:有哪些重要的垃圾回收算法?

标记-清除算法

分两个步骤:

• 标记
在这里插入图片描述
没有在引用链(GC ROOT)中的对象会被标记(灰色),这些对象会被判定为需要被回收。

• 清除
在这里插入图片描述
将被标记(灰色)的对象清除。

需要注意的是:所谓的清除,并不需要真正地把整个内存的字节进行清零操作,只是把空闲对象的起始结束地址记录下来放入空闲列表里,表示这段内存是空闲的。

优点: 速度快,只需要做个标记就能知道哪一块需要被回收。

缺点: 一是执行效率不稳定。

二是会涉及到内存碎片化的问题。标记清除之后会产生大量不连续的内存碎片,当程序在运行过程中需要分配较大对象时,无法找到足够的连续内存而造成内存空间浪费。

解决该问题:

标记复制算法和标记整理算法,都是对标记清除算法缺点的改进。

标记-整理算法
标记整理算法与标记清除算法很相似,但显著的区别是:标记清除算法仅对不存活的对象进行处理,剩余存活对象不做任何处理,这就造成了内存碎片的问题;而标记整理算法不仅对不存活的对象进行清除,还对存活的对象进行重新整理,因此不会产生内存不连续的现象。

在这里插入图片描述
在这里插入图片描述
标记-整理算法弊端:涉及到了对象的移动,在整理阶段,由于移动了可用对象,需要去更新引用。效率会变低。

标记-复制算法

标记-复制算法,相比前面的比较不同,他将内存空间分为两块,在垃圾回收时将正在使用的内存中的存活对象复制到未被使用的内存块中,然后再清除正在使用的内存块中的所有对象。最后再交换两个内存的角色,最后完成垃圾回收
在这里插入图片描述
在这里插入图片描述
优点: 标记复制算法提升了效率,也不会参数碎片问题。

缺点: 标记复制算法的缺点也是十分明显的,它需要双倍空间。

三:垃圾回收的具体流程是怎样的?

JVM当然不会只采用一种算法,每种算法都有优点,JVM会结合三种算法协同工作,JVM的分代垃圾回收机制就是具体的实现。

在JVM中,堆内存划会划分区域:新生代、老年代,根据年代的特点选择合适的算法。

大对象直接进入老年代
大对象就是需要大量连续内存空间的对象(比如:字符串、数组)。因为避免为大对象分配内存时由于分配担保机制带来的复制而降低效率。

长期存活的对象将进入老年代

什么时候回收?
在Java程序运行的任何时期都有可能会进行垃圾回收,当某个区满了的时候就会触发垃圾回收机制。根据年代的不同,回收的程度也会有区别。

参考博客:
https://blog.csdn.net/bjweimengshu/article/details/117677385?utm_source=app&app_version=4.9.3&code=app_1562916241&uLinkId=usr1mkqgl919blen

以上是关于什么是JVM的垃圾回收的主要内容,如果未能解决你的问题,请参考以下文章

JVM之G1垃圾回收器

什么是JVM的垃圾回收

JVM垃圾回收篇(基本概述)

什么,你还不知道什么是JVM垃圾回收?!

JVM:垃圾回收算法垃圾回收器

图解JVM垃圾内存回收算法