1.为什么要使用垃圾处理器
除了释放不再被引用的对象,垃圾收集器还要处理堆碎块。
好处一:提高生产率。
好处二:帮助程序保持完成性。垃圾回收是Java安全策略的一部分,Java程序员不可能因失误错误的释放内存而导致虚拟机崩溃。
缺点:增加程序负担,可能影响程序性能。
2.垃圾收集算法
垃圾收集算法做两件事,首先检测出垃圾对象,其次,它必须回收垃圾对象所使用的堆空间并还给程序。区分活动对象和垃圾的两个基本方法是引用计数和跟踪。引用计数垃圾收集器通过为堆中每个对象保存一个计数器来区分活动对象和垃圾对象。这个计数器记录了对那个对象的引用次数。跟踪垃圾收集器实际上追踪从根节点开始的引用图。在追踪中遇上的对象以某种方式打上标记,当追踪结束时,没有被打上标记的对象就被判定为不可触及的,可以被当作垃圾回收。
3.引用计数收集器
引用计数是垃圾收集的早期策略。堆中每一个对象都有一个引用计数。
这种方法的好处:引用计数器可以很快的执行,交织在程序运行之中。这个特性对于程序不能被长时间打断的实时环境很有利。
坏处:引用计数无法检测出循环(即两个或更多的对象互相引用)。譬如父对象对子对象的引用,子对象又反过来引用父对象。还有就是每次引用计数的增加或减少都带来额外开销。该技术现在已不为人所接受
4.跟踪收集器
跟踪垃圾收集器实际上追踪从根节点开始的引用图。在追踪中遇上的对象以某种方式打上标记,当追踪结束时,没有被打上标记的对象就被判定为不可触及的,可以被当作垃圾回收。
基本的追踪算法被称为“标记并清除”。指出了垃圾收集过程的两个阶段。标记阶段:垃圾收集器遍历引用树,标记每一个遇到的对象。在清除阶段,未被标记的对象被释放了,使用的内存被返回到正在执行的程序。清除步骤必须包括对象的终结。
5.压缩收集器
Java虚拟机可能有对付堆碎块的策略。标记并清除收集器常用的两种策略是压缩和拷贝。这两种策略都能快速的移动对象来减少堆碎块。压缩收集器把活动的对象越过空闲区滑动到堆的另一端,在这个过程中,堆的另一端出现一个大的连续空闲区。所有被移动的对象的引用也被更新,指向新的位置。
6.拷贝收集器
拷贝垃圾收集器把所有的活动对象移动到一个新的区域。对于指定大小的堆来说需要两倍大小的内存。
7.按代收集的收集器
通过把对象按照寿命来分组解决拷贝收集器效率低下的问题,更多的收集那些短暂出现的年幼对象,而非较长寿命的对象。在这种方法里,堆被划分成两个或更多的子类,每个子类为“一代”对象服务。最年幼的那一代进行最频繁的垃圾收集。按代收集算法除了可以应用于拷贝算法,同样可以应用于标记并清除算法。
8.自适应收集器
自适应收集器算法利用了以下事实:在某种情况下某些垃圾收集算法工作的更好,而另一种垃圾手机算法在另外的情况下工作的更好。自适应算法监视堆中的情形,并且对应的调整为合适的垃圾收集技术。
9.火车算法
因为垃圾收集器一般都会停止整个程序来进行查找和收集垃圾对象,它们可能在程序执行的任何时刻暂停,并且暂停的时间也无法确定。这种垃圾收集有时候暂停的时间长了让用户注意到了。垃圾收集可能使程序对事件响应迟钝,无法满足实时系统的要求,这种算法被成为破坏性的。
达到非破坏性垃圾收集的方法是使用渐进式垃圾收集算法。它不试图一次性回收所有的垃圾对象,每次发现一部分并回收。
火车算法目前正用于Sun公司的Hotspot虚拟机。
9.1 车厢、火车和火车站
火车算法把成熟对象划分为固定长度的内存块,算法每次在一个块中单独执行。
10.终结
是垃圾收集器运行的终结方法。以为总是无法预测对象什么时候被垃圾收集,所以也无法预测对象的终结方法何时被执行。
11.对象可触及性的生命周期
堆中的每一个对象都有三种状态:可触及的、可复活的、以及不可触及的。
如果垃圾收集器可以从根节点开始通过追踪“触及”到该对象,它就是可触及的。
如果该对象从根节点的追踪图中不可“触及”,但是有可能在垃圾收集器执行某些终结方法时触及。不仅仅是那些声明了finalize()方法的对象,而是所有的对象都要经过可复活状态。
不可触及状态标志着不但对象不再被触及,而且也不可能通过任何终结方法复活。
1.引用对象
“可触及”表示强引用。较弱弱引用包括:软引用(SoftReference)、弱引用(WeakReference)、影子引用(PhantomReference),这三个类都是抽象类Reference的子类。强引用和较弱引用的差别是,强引用禁止引用被垃圾回收,较弱引用则不禁止。
引用对象:它封装了指向其它对象的连接。被指向的对象称为引用目标。
2.可触及性状态变化
??
3.缓存、规范映射和临终清理
??
12.