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

今天药忘吃喽~ 2022-05-22 00:13 251阅读 0赞

一、前言

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

二、什么是垃圾回收?

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

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

  1. 如果你是一个jvm设计师,你会怎么安排回收内存呢?
  2. 这是一个很好的问题,通过上一篇博客,小编相信大家通过对四象限的认识,已经对jvm内存的分布有了一些了解。在我们使用的过程中,不同的对象放到了不同的区域。我们要找到已经死去的对象,这里jvm提供了两种方案:
  • 引用计数算法

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

  • 可达性分析算法

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

这里写图片描述

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

什么时候回收?

  1. 通过上面的两个算法,我们就可以筛选出那些对象是可以回收的,那些对象是不可以回收的。那么上面时候开始回收呢?
  2. 我们有一个屋子,里面放着好多自己的东西,有的东西我们经常用,有的东西不经常用,而且我们还会时不时的向这个屋子里面放一些新的东西。屋子越来越满,空间越来越小。自然而然,**当空间小的时候,空间紧张的时候**我们就会回收一些扔一些东西。**扔那些我们用不到的东西**
  3. 代码如人生。
  4. 生活中我们会在空间不足的时候扔东西,所以计算机内存管理中,也会在内存不足的时候,对垃圾进行回收。
  5. 基本是在内存不够用的时候。每个收集器还所有不同。
  6. 垃圾回收基本的思想是:stop-the-world再回收,就如:不能在打扫卫生的时候同时再仍新的垃圾。
  7. 但是CMS、与将出世的 G1会打破这个界限,实现 边打扫卫生,还边扔垃圾。

谁来回收?

  1. 垃圾回收器

怎么回收?

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

三、垃圾回收算法

标记-清除法

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

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

  1. 不足:
  2. 1.效率不高
  3. 2.容易产生垃圾碎片
  4. 通过下面的图看出,黑色的是可以回收的,收集器会把可以回收的标记出来,需要回收的时候,就统一回收。产生了很多的内存碎片。

这里写图片描述

复制法

  1. 特点:
  2. 内存分成两个大小相等的两块。
  3. 每次只使用一块,当这块内存用完了,就将还存活的复制到另一块上。
  4. 然后把已使用过的内存空间一次清理掉。
  5. 对半个进行操作,**不用考虑内存碎片问题**
  6. 移动堆顶的指针,按顺序分配内存
  7. 好处:
  8. 简单 高效

这里写图片描述

标记-整理法

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

这里写图片描述

分代收集法

特点:

商业虚拟机都采用这个

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

  1. 说明:
  2. 一般把java堆分为“年轻代”和“老年代”。
  3. 年轻代中存放的对象生命周期短,大部分都会被回收,所以采用“复制法”。为了更好的对内存分配和回收,年轻代又分成了Eden s1s2区。他们的比例大约是8:1:1。大部分对象都存放到Eden区,Eden区和s1中的98%的数据都会被回收,所以采用复制法,把Edens1中存活的数据(不到10%)复制到s2上,然后清除Edens1区。完成垃圾回收。
  4. 老年代中的数据生存周期长,没有额外的空间对其进行担保,使用“标记-整理法”或者“标记-清除法”来进行垃圾回收。

四、小结

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

发表评论

表情:
评论列表 (有 0 条评论,251人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JVM垃圾回收算法

    Java是一门不用程序员手动管理内存的语言,全靠JVM自动管理内存,既然是自动管理,那必然有一个垃圾内存的回收机制或者回收算法。 在Java堆上分配一个内存给实例对象时,此时

    相关 JVM 垃圾回收算法

    在说垃圾回收算法之前,先谈谈JVM怎样确定哪些对象是“垃圾”。 1.引用计数器算法: 引用计数器算法是给每个对象设置一个计数器,当有地方引用这个对象的时候,计数器\+1

    相关 JVM垃圾回收算法

    前言 程序计数器,虚拟机栈,本地方法3个区域随线程而生,随线程而灭,栈中的栈帧随着方法的进入和退出有条不紊地执行着出栈和入栈操作,每一个栈帧中分配多少内存,基本上是在类结