GC垃圾回收介绍

GC 让无法利用的内存实现自动再利用,内存资源回收, 就是平常所说的"垃圾回收"

GC 相当于虚拟内存。
一般的虚拟内存技术是在较小的物理内存的基础上,利用辅助存储创造一片看上去很大的“虚
拟”地址空间。也就是说,GC 是扩大内存空间的技术,称其为空间性虚拟存储。这样一来,GC 就成了永久提供一次性存储空间的时间轴方向的时间性虚拟存储

GC 把程序不用的内存空间视为垃圾,因此GC主要完成两件事情:

  1. 找到内存空间中的垃圾

  2. 回收内存空间,让该部分空间能够再次被利用

    实际中,回收机制依赖许多标志位mark,内存本身没有标志,需要GC自行维护,因此 GC也会参与内存的分配,

没有GC, 基本都知道, 如果忘记释放内存空间,就会造成内存空间不会被重复利用,带来内存泄漏风险, 除非整个程序退出,由操作系统回收该内存分配空间

注:定义 – 内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果

在释放内存空间的世行,忘记释放对象指向内存空间的指针,这个指针就会一直指向释放完毕的内存空间,这个指针其实指向量一个无效的内存空间地址,称为"悬挂指针", 如果错误引用可能产生无法预料的bug, 同时也会导致安全漏洞的产生

注:正式定义如下:

当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址,此情况下该指针便称悬垂指针(也叫迷途指针)。

某些编程语言允许未初始化的指针的存在,而这类指针即为野指针

GC的算法大致分类:

  1. 标记-清除
  2. 引用计数法
  3. 复制算法

当然目前许多GC实现不是采用单一的方法,而是几种方法综合使用的,一般都是经过改进的算法实现

GC 说到底也是一段运行的程序, 基本都是高负载处理,会花费一定的时间,带来一定的延时, 因此在不同的应用程序中,能够了解具体的需求选择合适的GC方法也很重要, 比如对于实时性要求很高的场景,那么GC适合选择延时较低的, 而平常轻量使用的应用可以采用整体延迟较短的算法

对象是GC的羁绊单位

对象头部中包含对象的大小,对象的种类,标志等, 这些对GC很重要, 对象大小可以用来确定存储对象的边界, 也有GC的特殊标识,用来区分是否可回收

通过GC, 对象会被销毁或者保留, 起关键性的是指针,GC是根据指针去寻找对象的, 因此处理的是指针对象,对于非指针的,不做任何操作

GC处理对象的时候也能对其子对象进行处理

mutator改变GC 对象间的引用关系, 进行生成对象,更新指针两种操作, 这个过程就会参数内存垃圾, mutator 是从堆中分配程序所需空间的, 堆是由程序申请,操作系统分配的内存空间, 堆可以被看成是一棵树,如:堆排序

分配(allocation)指的是在内存空间中分配对象,当mutator 需要新对象时,就会向分配
器(allocator)申请一个大小合适的空间。分配器则在堆的可用空间中找寻满足要求的空间,
返回给mutator

当堆空间被使用完毕后,要不向操作系统申请更大的堆,要不重复利用现有空间

根是指向对象的指针的"起点"部分, ,调用栈、寄存器以及全局变量空间都是根

gc标准:

  1. 吞吐量
  2. 最大暂停时间
  3. 堆的使用率,即是内存空间使用率
  4. 访问局部性(缓存的位置,以及数据的排序位置及顺序)

你可能感兴趣的:(计算机基础)