jvm - 垃圾回收

来源:互联网 发布:探究小车速度实验数据 编辑:程序博客网 时间:2024/06/11 11:11

1 什么是垃圾收集?垃圾收集相对于手动释放的缺点是什么?

   就是自动释不再被程序使用的对象的过程。

   缺点是不能精确控制回收的时机、和回收时间的长度。

 

2 为什么需要垃圾收集?

   (1)回收对象

   (2)整理碎片

   (3)提高程序员生产率,减少犯错的机会。

 

3 垃圾回收算法

   区分活动对象和垃圾的两种基本方法:引用计数和跟踪;

 

4 根对象包括:

  (1)局部变量中的对象的引用操作数栈中的对象引用,类变量中的对象引用。

  (2)被加载到类的常量池中的对象引用 -- 字符串 比如类名、超类型名、超接口的名字,字段名、字段特征签名,方法名和方法特征签名。

  (3)传递到本地方法,没有被本地方法释放的对象引用。

  (4)被垃圾收集器使用的存放在运行时数据区中堆内的数据。

 

5 引用计数收集器

   好处:可以很快执行,利于程序不能被长时间打断的环境使用

   坏处:无法处理循环引用

 

6 跟踪收集器(标记-清除):追踪从根节点开始的对象引用。

 (1)标记阶段:遍历引用树,标记每一个遇到的对象。

 (2)清除阶段:释放未被标记的对象。

 

7 压缩收集器

   标记-清除 收集器常使用的方法是 压缩和拷贝:都是快速移动对象来减少碎片。

压缩收集器 : 把活动对象从堆的一端越过堆的空闲区滑动到堆的另一端。

  

  

 

8 拷贝收集器(停止并拷贝)

   把所有的活动对象移动到一个新的区域,再拷贝过程中,它们被紧挨着布置,消除原来存在于间隙间的碎片。

  

 

9 按代的垃圾收集器 产生的原因

 (1)大部分程序的创建的大部分对象都具有很短的生命周期

 (2)大多数程序都创建一些具有非常长生命周期的对象

 

10 自适应收集器

     (1)监视程序执行情况,适用不同算法

     (2)把堆分成子堆,适用不同算法

11 火车算法 的目的是在成熟对象空间提供限定时间的渐进收集。

     破坏性垃圾收集:垃圾收集的停顿时间达到了用户可体验/程序(或不可容忍)的程度

     渐进式垃圾收集:不是试图一次性发现并回收所有不可回收的对象,而是每一次发现并回收一部分。

   

(1)车厢、火车、火车站

   年老带称作火车站

   火车 按照创建它们的顺序分配编号

   车厢 固定大小的内存块,算法每次在一个单独的块中执行

 

   算法每次对号码最小的那个车厢进行收集:第一次1.1,然后1.2;当收集了火车1的最后一节车厢后,收集2.1.....

   对象从年轻带进入年老带的方式有两种:打包成车厢挂在除号码最小的回车尾部;作为一列火车进站

(2)车厢收集

    1 检查最小号火车的对象没有被该火车外的对象引用,那么整个火车作为垃圾丢弃。

    2 最小号火车不全是垃圾的时候,注意力集中在最小号车厢上:

        2.1 如果车厢中有一个对象被来自未成熟对象的引用,这个对象移动到同火车的其他车厢;

        2.2 如果一个对象被成熟区的其他火车的对象引用,这个被引用对象移动到引用对象所在的火车中;然后扫描移动的对象,检查它对原来车厢的引用,移动在原车厢中被引用的对象;不断移动,直到没有任何对象指向被收集的车厢。如果收集对象的火车没有空间了,会新增一节车厢。

        2.3 如果车厢的对象没有来自未成熟区的引用,也没有来自其他火车中对象的引用,那么只有来自同火车其他车厢对象的引用:将被引用的对象移动到火车尾部,扫描该被移动的对象,如果引用了被收集车厢的对象,将被引用的对象移动到火车尾部。直到被收集车厢没有外部对象引用。释放最小号火车的最小号车厢。

 

 

  

   

记忆集合:包含了一节车厢或者一列火车包含的外部对象对内部对象的引用。

流行对象:具有好多外部连接的对象。

 

12 终结

  (1)垃圾收集器必须检查所有不再被引用的对象是否存在finalize()方法。

  (2)执行finalize方法,并标记对象执行过finalize方法了。

  (3)第二次扫描:从根节点开始再次扫描不再被引用的对象,因为终结方法可能会“复活”某些不再被引用的对象。

  (4)释放两次扫描都不再被引用的对象。

 

13 对象可触及性的生命周期

 引用对象:封装了指向其他对象的连接,被指向的对象称为引用目标。

 强引用:强引用和较弱引用的差别在于,强引用禁止垃圾收集,较弱引用不禁止垃圾收集。

 软引用:

 弱引用:

 影子引用:

 

对象可触及性的六种状态

强可触及:对象从根节点开始不经过任何引用对象就可以搜索到。

软可触及:对象不是强可触及的,从根节点开始通过一个或多个软引用对象触及。

弱可触及:对象不是强可触及的,也不是弱可触及的,从根节点开始通过一个或多个弱引用对象触及。

可复活的:对象不是强可触及、软可触及、弱可触及的,但是可以通过执行finalize方法恢复到这几种状态之一。

影子可触及的:对象不是强可触及、软可触及、弱可触及的,并且执行过finalize方法(或者没有finalize方法),垃圾收集器不会清除影子引用,只能由程序明确清除。

不可触及:已经准备好被回收。

原创粉丝点击