admin 管理员组

文章数量: 1184232

GC

GC-序

GC要做的就两件事:

  1. 找到内存空间里的垃圾
  2. 回收垃圾,让程序员能再次利用这部分空间

GC历史:

  1. GC标记-清除算法
  2. 引用计数法:有个缺点不能回收“循环引用”
  3. GC复制算法:把内存分为两部分

50年来,GC的根本都没有改变,现在的GC算法大多是从上述的三个基本算法衍生出来的产物。

要注意的是,GC基本上是高负载处理,需要花费一定的时间,对于追求即时性的程序,就必须尽量压低GC导致的最大暂停时间。

对象/头/域:
在面向对象编程,对象是指“具有属性和行为的事物“,然而在GC的世界中,对象表示:”通过应用程序利的数据的集合“。

对象配置在内存空间里,GC根据情况将配置好的对象进行移动或销毁操作。所以对象是GC的基本单位。

对象有头和域两部分构成,头是对象的一些元数据,域是指对象使用这在对象中可访问的部分。
对象的使用者会引用或替换对象的阈值;对象的使用者,基本上无法直接更改头的信息,这部分是有系统或编程语言操作的。

疑问,如何管理对象所占用的内存的,也就是对象是要占用元数据的,而原生支持的数据类型,如int,数组,是在对象的域上操作的,所以我们操作的都是域,无论c过程型,或者oo的。

分块:是利用对象,实现准备出来的空间
根: 对象指针的起点

对象指针,怎么连起来的,域中引用。。。也就是没回都需要遍历搜索,即dfs,另外bitmap中对象地址是顺序的,所以可用bitmap管理。

堆:就是动态存放对象的内存空间,跟数据结构的堆不是一个东西,其本意就是一堆内存。

mutator:改变GC对象间的引用关系。主要有生成对象、更新指针两个操作。伴随着这些引用关系的变化,就可能产生垃圾,而GC就是负责处理这些垃圾的。

本文标签: GC