垃圾收集
1、垃圾收集算法
两件事情。首先,必须检测出垃圾对象;其次,必须回收垃圾对象所使用的堆空间并还给程序。
垃圾检测通常通过建立一个根对象的集合并且检查从这些根对象开始的可触及性来实现(跟对象总是可触及的)。
--引用计数收集器:已经不在被接受使用
--跟踪收集器:追踪从根节点开始的对象引用图。
--压缩收集器:它把活动的对象越过空闲区滑动到堆的一端,在这个过程中,堆的另一端出现一个大的连续空闲区。所有被移动的对象的引用也被更新,指向新的位置。
更新被移动的对象的引用有时候通过一个间接对象引用层可以变得更简单。不直接引用堆中的对象,对象的引用实际上指向一个对象句柄表。对象句柄才指向堆中对象的实际位置,当对象被移动时只有这个句柄需要被更新为新位置。这种方法简化消除了堆碎块的工作,但每一次对象访问都带来了性能损失(两次引用解析)。
--拷贝收集器
[img]http://dl.iteye.com/upload/attachment/589122/21229994-f320-38a8-8197-62e64c981429.jpg[/img]
--按代收集的收集器
[img]http://dl.iteye.com/upload/attachment/589124/5c220230-db31-384f-b872-058b01ca64ca.jpg[/img]
--自适应收集器
--火车算法(渐进式收集算法):基于按代收集。目标是为了提供限定时间内按代收集的收集器中成熟对象空间的渐进式收集。
--堆中每个对象的三种状态:可触及的,可复活的,不可触及的,版本1.2中扩充了三个新状态:软可触及,弱可触及,影子可触及;原来的"可触及"状态被称作"强可触及"。
可触及性的三个比较弱的形式设计到1.2开始新引入的实体——引用对象,引用对象封装了其他对象的连接,被指向的对象称为引用目标。 java.lang.ref.Reference包含对应的三个子类:SoftReference,WeakReference,PhantomReference。
强引用和较弱形式的引用的区别:强引用禁止引用目标被垃圾收集,而弱引用不禁止。
垃圾收集器可以随意更改而是强可触及的任何对象的可触及性状态。
一旦某个被影子引用的对象编程影子可触及状态,垃圾收集器立即把该引用对象加入队列。垃圾收集器从不会清楚一个影子引用,所有的影子引用都必须由程序明确的清楚。如果一个对象到达了影子可触及状态,它不能再被复活。
--JVM对软引用的处理
[img]http://dl.iteye.com/upload/attachment/589116/4f1a873a-3dfc-34a8-9433-347537db9e90.jpg[/img]
--JVM对弱引用的处理
[img]http://dl.iteye.com/upload/attachment/589118/b190cbe9-4a0e-3703-bb0a-af355cb8929d.jpg[/img]
--JVM对影子引用的处理
[img]http://dl.iteye.com/upload/attachment/589120/14665774-6eee-30ea-afa5-115397490b7a.jpg[/img]
1、垃圾收集算法
两件事情。首先,必须检测出垃圾对象;其次,必须回收垃圾对象所使用的堆空间并还给程序。
垃圾检测通常通过建立一个根对象的集合并且检查从这些根对象开始的可触及性来实现(跟对象总是可触及的)。
--引用计数收集器:已经不在被接受使用
--跟踪收集器:追踪从根节点开始的对象引用图。
--压缩收集器:它把活动的对象越过空闲区滑动到堆的一端,在这个过程中,堆的另一端出现一个大的连续空闲区。所有被移动的对象的引用也被更新,指向新的位置。
更新被移动的对象的引用有时候通过一个间接对象引用层可以变得更简单。不直接引用堆中的对象,对象的引用实际上指向一个对象句柄表。对象句柄才指向堆中对象的实际位置,当对象被移动时只有这个句柄需要被更新为新位置。这种方法简化消除了堆碎块的工作,但每一次对象访问都带来了性能损失(两次引用解析)。
--拷贝收集器
[img]http://dl.iteye.com/upload/attachment/589122/21229994-f320-38a8-8197-62e64c981429.jpg[/img]
--按代收集的收集器
[img]http://dl.iteye.com/upload/attachment/589124/5c220230-db31-384f-b872-058b01ca64ca.jpg[/img]
--自适应收集器
--火车算法(渐进式收集算法):基于按代收集。目标是为了提供限定时间内按代收集的收集器中成熟对象空间的渐进式收集。
--堆中每个对象的三种状态:可触及的,可复活的,不可触及的,版本1.2中扩充了三个新状态:软可触及,弱可触及,影子可触及;原来的"可触及"状态被称作"强可触及"。
可触及性的三个比较弱的形式设计到1.2开始新引入的实体——引用对象,引用对象封装了其他对象的连接,被指向的对象称为引用目标。 java.lang.ref.Reference包含对应的三个子类:SoftReference,WeakReference,PhantomReference。
强引用和较弱形式的引用的区别:强引用禁止引用目标被垃圾收集,而弱引用不禁止。
垃圾收集器可以随意更改而是强可触及的任何对象的可触及性状态。
一旦某个被影子引用的对象编程影子可触及状态,垃圾收集器立即把该引用对象加入队列。垃圾收集器从不会清楚一个影子引用,所有的影子引用都必须由程序明确的清楚。如果一个对象到达了影子可触及状态,它不能再被复活。
--JVM对软引用的处理
[img]http://dl.iteye.com/upload/attachment/589116/4f1a873a-3dfc-34a8-9433-347537db9e90.jpg[/img]
--JVM对弱引用的处理
[img]http://dl.iteye.com/upload/attachment/589118/b190cbe9-4a0e-3703-bb0a-af355cb8929d.jpg[/img]
--JVM对影子引用的处理
[img]http://dl.iteye.com/upload/attachment/589120/14665774-6eee-30ea-afa5-115397490b7a.jpg[/img]