【JVM】程序员进阶JVM(二)——垃圾回收算法

一、前言

      上一篇博客中,小编向大家开了个头,介绍了一些JVM的内存区域,相信大家一想起四象限,就可以想起JVM的内存区域:栈,方法区,堆,程序计数器。在这篇博客中,小编向大家介绍垃圾回收算法。

二、什么是垃圾回收?

      对JVM有一定了解的,或者对java有一定了解的都知道Jvm有一个很大的特点就是垃圾回收机制。在JVM中有7种垃圾回收器,他们根据不同的算法去回收在内存中却没有被使用的对象。这就是垃圾回收。

      回收垃圾也就是回收没有用的对象。

垃圾回收器回收哪里的内存呢?

      如果你是一个jvm设计师,你会怎么安排回收内存呢?

      这是一个很好的问题,通过上一篇博客,小编相信大家通过对四象限的认识,已经对jvm内存的分布有了一些了解。在我们使用的过程中,不同的对象放到了不同的区域。我们要找到已经死去的对象,这里jvm提供了两种方案:

  •       引用计数算法

      计数器来记录对象引用的次数。如果引用了就+1,减少引用了就-1。从而产生了相互引用的问题。

  •       可达性分析算法

      从起始点“GC Root”开始向下搜索,可以搜索链接到的就是存活的,链接不到的就是死的对象,可以被回收。(java 、C#就是使用的这种)

这里写图片描述

      注意:在使用可达性分析算法的时候,并不是链接不到的对象,就是“非死不可”。jvm会给这种对象两次机会,把这些对象置于“缓刑”。第一次没有连接到 ,就被标记,然后判断对象是否执行了finalize()方法,如果没有执行,就可以通过执行finalize()方法进行自救。否则会死亡,从而被回收。

什么时候回收?

      通过上面的两个算法,我们就可以筛选出那些对象是可以回收的,那些对象是不可以回收的。那么上面时候开始回收呢?

      我们有一个屋子,里面放着好多自己的东西,有的东西我们经常用,有的东西不经常用,而且我们还会时不时的向这个屋子里面放一些新的东西。屋子越来越满,空间越来越小。自然而然,当空间小的时候,空间紧张的时候我们就会回收一些扔一些东西。扔那些我们用不到的东西

      代码如人生。

      生活中我们会在空间不足的时候扔东西,所以计算机内存管理中,也会在内存不足的时候,对垃圾进行回收。

      基本是在内存不够用的时候。每个收集器还所有不同。

      垃圾回收基本的思想是:stop-the-world再回收,就如:不能在打扫卫生的时候同时再仍新的垃圾。

      但是CMS、与将出世的 G1会打破这个界限,实现 边打扫卫生,还边扔垃圾。

谁来回收?

      垃圾回收器

怎么回收?

      不同的垃圾回收器根据不同的算法进行回收。

三、垃圾回收算法

标记-清除法

      这是最基础的算法,从命名上可以看出分为两步:1.标记 2.清除。

首先标记出所有要回收的对象,然后统一回收。

      不足:

      1.效率不高
      2.容易产生垃圾碎片

      通过下面的图看出,黑色的是可以回收的,收集器会把可以回收的标记出来,需要回收的时候,就统一回收。产生了很多的内存碎片。

这里写图片描述

复制法

      特点:

      内存分成两个大小相等的两块。

      每次只使用一块,当这块内存用完了,就将还存活的复制到另一块上。

      然后把已使用过的内存空间一次清理掉。

      对半个进行操作,不用考虑内存碎片问题

      移动堆顶的指针,按顺序分配内存

      好处:

      简单 高效

这里写图片描述

标记-整理法

      特点:

      先标记,所有的存活对象都向一端移动,直接清理掉端边界以外的内存

这里写图片描述

分代收集法

特点:

商业虚拟机都采用这个

根据对象存活周期的不同将内存划分为几块,每块用不同的算法。

      说明:

      一般把java堆分为“年轻代”和“老年代”。

      年轻代中存放的对象生命周期短,大部分都会被回收,所以采用“复制法”。为了更好的对内存分配和回收,年轻代又分成了Eden 、s1、s2区。他们的比例大约是8:1:1。大部分对象都存放到Eden区,Eden区和s1中的98%的数据都会被回收,所以采用复制法,把Eden和s1中存活的数据(不到10%)复制到s2上,然后清除Eden和s1区。完成垃圾回收。

      老年代中的数据生存周期长,没有额外的空间对其进行担保,使用“标记-整理法”或者“标记-清除法”来进行垃圾回收。

四、小结

      通过这次的学习,相信可以对垃圾回收机制有所了解吧。这些可是JVM的重点哦,下一篇博客中,会向大家介绍jvm中的7中垃圾回收器。

猜你喜欢

转载自blog.csdn.net/kisscatforever/article/details/80651981