栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

初识 GC 回收

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

初识 GC 回收

文章目录
    • GC [垃圾回收]
      • 作用区域:堆、方法区【特殊堆】
        • 年轻代的GC一般用复制算法 。
      • GC一般有两种: 轻GC (又称:普通GC),和重GC (又称:全局GC)
        • 注:轻GC一般发生在 新生代和幸存区,重GC一般发生在老年代
      • GC算法的评判标准
      • GC的算法:
      • 可达性
      • 引用计数法
        • 注:这个引用计数法很少被使用。
      • 标记-清除法
      • 标记-压缩法
      • 复制算法
        • 复制算法最佳使用场景:对象存活度比较低得时候。新生区!
      • 保守式GC与准确式GC
      • 总结:
        • 维度分析
        • 分代收集算法
        • 分代收集算法

GC [垃圾回收] 作用区域:堆、方法区【特殊堆】

堆里面一般分区:

  • 新生代/伊甸园区
  • 幸存区 (from、to)
  • 老年代
  • 元空间/永久区

GC回收的区域一般在:

  • 新生代/伊甸园区
  • 幸存区 (from、to)
  • 老年代

GC回收99%的情况在 新生区

年轻代的GC一般用复制算法 。
每次GC 都会将Eden活的对象移到幸存区中,并且Eden区被清空
幸存区 复制出来一个空的,将其中一个复制到另一个幸存区中。 谁空谁是to 

白话理解:  Eden存活对象复制到 幸存to区,同时 from区存活对象也复制到to区。保证有个一个幸存区永远是空的。也就是谁空谁是to 也就出现了 from 和 to 会互换。

默认当一个对象经历15次GC 会进入养老区。
-XX:MaxtenuingThreshold      当新手代对象通过指定的次数就能进入老年代,默认为15.
GC一般有两种: 轻GC (又称:普通GC),和重GC (又称:全局GC) 注:轻GC一般发生在 新生代和幸存区,重GC一般发生在老年代 GC算法的评判标准

GC算法的评判标准主要是以下4点:

  1. 吞吐量:即单位时间内的处理能力。
  2. 最大暂停时间:因执行GC而暂停执行程序所需的时间。
  3. 堆的使用效率:鱼与熊掌不可兼得,堆使用效率和吞吐量、最大暂停时间是不可能同时满足的。即可用的堆越大,GC运行越快;相反,想要利用有限的堆,GC花费的时间就越长。
  4. 访问的局部性:在存储器的层级构造中,我们知道越是高速存取的存储器容量会越小。由于程序的局部性原理,将经常用到的数据放在堆中较近的位置,可以提高程序的运行效率。
GC的算法:
  • 标记清除法
  • 标记压缩
  • 复制算法
  • 引用计数法
可达性

​ 所谓的可达性就是通过一系列称为“GC Roots”的对象为起点,从这些节点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则说明此对象是不可用的,就是GC Roots到这个对象不可达.

哪些对象可以作为GC Roots呢?有以下几种:

  1. 栈(栈帧中的本地变量表)中引用的对象。

  2. 方法区中的静态成员。

  3. 方法区中的常量引用的对象(全局变量)。

  4. 本地方法栈中JNI(一般说的Native方法)引用的对象。

注:第一和第四种都是指的方法的本地变量表,第二种表达的意思比较清晰,第三种主要指的是声明为final的常量值。

引用计数法

什么是引用计数法

​ 所谓的引用计数法就是给每个对象一个引用计数器,每当有一个地方引用它时,计数器就会加1;当引用失效时,计数器的值就会减1;任何时刻计数器的值为0的对象就是不可能再被使用的。

注:这个引用计数法很少被使用。

优点

  • 可即时回收垃圾:在该方法中,每个对象始终知道自己是否有被引用,当被引用的数值为0时,对象马上可以把自己当作空闲空间链接到空闲链表。
  • 最大暂停时间短。
  • 没有必要沿着指针查找

缺点

  • 计数器值的增减处理非常繁重
  • 计算器需要占用很多位。
  • 实现繁琐。
  • 循环引用无法回收。
标记-清除法

什么是标记-清除算法

​ 该算法分为标记和清除两个阶段。标记就是把所有活动对象都做上标记的阶段;清除就是将没有做上标记的对象进行回收的阶段。

优点

  • 不需要额外得空间。相比于复制算法。

  • 实现简单

  • 与保守式GC算法兼容(保守式GC在后面介绍)

缺点

  • 两次扫描,严重浪费时间。

  • 碎片化:在回收的过程中会产生被细化的分块,到后面,即使堆中分块的总大小够用,但是却因为分块太小而不能执行分配。

  • 分配速度:因为分块不是连续的,因此每次分块都要遍历空闲链表,找到足够大的分块,从而造成时间的浪费。

  • 与写时复制技术不兼容:所谓写时复制就是fork的时候,内存空间只引用而不复制,只有当该进程的数据发生变化时,才会将数据复制到该进程的内存空间。这样,当两个进程中的内存数据相同的时候,就能节约大量的内存空间了。而对于标记-清除算法,它的每个对象都有一个标志位来表示它是否被标记,在每一次运行标记-清除算法的时候,被引用的对象都会进行标记操作,这个仅仅标记位的改变,也会变成对象数据的改变,从而引发写时复制的复制过程,与写时复制的初衷就背道而驰了。

标记-压缩法

什么是标记-压缩算法

​ 标记-压缩算法与标记-清理算法类似,只是后续步骤是让所有存活的对象移动到一端,然后直接清除掉端边界以外的内存。

也可称之为 标记-清除-压缩 算法。三部曲。

优点

  • 该算法可以有效的利用堆。

缺点

  • 基于标记清除基础上 再次扫描。
  • 压缩需要花比较多的时间成本。
复制算法

什么是复制算法

​ 复制算法就是将内存空间按容量分成两块。当这一块内存用完的时候,就将还存活着的对象复制到另外一块上面,然后把已经使用过的这一块一次清理掉。这样使得每次都是对半块内存进行内存回收。内存分配时就不用考虑内存碎片等复杂情况,只要移动堆顶的指针,按顺序分配内存即可,实现简单,运行高效。

优点

  • 优秀的吞吐量。
  • 可实现高速分配:复制算法不用使用空闲链表。这是因为分块是连续的内存空间,因此,调用这个分块的大小,只需要这个分块大小不小于所申请的大小,移动指针进行分配即可。
  • 不会发生碎片化【没有内存碎片】。
  • 与缓存兼容。

缺点

  • 浪费了内存空间。多了一半空间永远是空 “to”。假设对象 100%存活(极端情况)

  • 堆的使用效率低下。

  • 不兼容保守式GC算法。

  • 递归调用函数。

复制算法最佳使用场景:对象存活度比较低得时候。新生区! 保守式GC与准确式GC

保守式GC

 所谓保守式GC就是“不能识别指针和非指针的GC”。
 对于寄存器、调用栈、全局变量空间来说,都是不明确的根。例如调用栈中,装着函数内的局部变量和参数值。而局部变量,如C语言中的int、double这样就是非指针,但是也会有像void*这样的指针。

   那么保守式GC会怎么检查不明确的根呢?1、是不是被正确对齐的值?(在32位CPU的情况下,为4的倍数)2、是不是指着堆内?3、是不是指向对象的开头?当然,这些只是基本的检查项目。

   上面的检查方法会将一些非指针识别成指针。例如一个数值和一个地址,它们两个值相等,这个时候,那个值也可以被识别成指针。

   保守式GC的优点是语言处理程序不依赖与GC。缺点为识别指针和非指针需要付出成本、错误识别指针会压迫堆、能够使用的GC算法有限。例如GC复制算法就不能使用,因为其可能会将非指针重写。
   

准确式GC

	准确式GC能够正确识别指针和非指针的GC。正确的根的创建方法是依赖于语言处理程序的实现的。我们可以通过打标签、不把寄存器和栈等当作根的方法来实现。
 	其优点就是完全能够识别指针,能够使用复制算法等需要移动对象的算法。但是在创建准确式GC时,语言处理程序必须对GC进行一些支援,而且创建正确的根就必须付出一定的代价。
总结: 维度分析

内存效率

​ 复制算法 > 标记清除算法 > 标记压缩算法(时间花费较多[时间复杂度])

内存整齐度

​ 复制算法 = 标记压缩算法 > 标记清除算法

内存利用率

​ 标记压缩算法 = 标记清除算法 > 复制算法

分代收集算法

年轻代

​ 特点:存活率低。故:复制算法!

老年代

​ 特点:区域大、存活率高。

​ 故:标记清楚 + 标记压缩 混合实现。在内存碎片不是太多得时候,直接用清除,当内存碎片达到一定量级就去压缩一下。

​ 复制算法 = 标记压缩算法 > 标记清除算法

内存利用率

​ 标记压缩算法 = 标记清除算法 > 复制算法

分代收集算法

年轻代

​ 特点:存活率低。故:复制算法!

老年代

​ 特点:区域大、存活率高。

​ 故:标记清楚 + 标记压缩 混合实现。在内存碎片不是太多得时候,直接用清除,当内存碎片达到一定量级就去压缩一下。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/833110.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号