有关于 JVM 的垃圾收集(三)

对象可触及时的生命周期

在 JVM 1.2 之前,堆中的对象分为三种状态,分别是:

1. 可触及的 -- 从根节点开始可追踪到
2. 可复活的 -- 从根节点开始追踪不到,但有可能被终结方法触及并复活。不仅仅是那些声明了 finalize() 方法的对象,而是所有的对象都要经过可复活状态
3. 不可触及的 -- 以上两种可能性都不存在,可以真正回收它们所占据的内存了

版本 1.2 中,可触及按强弱进一步细分为:

1. 强可触及 -- 即原来的可触及,从根节点开始的任何直接引用,如一个局部变量或任何从强可触及对象的实例引用的对象
2. 软可触及 -- 表现为 SoftReference 所引用的对象
3. 弱可触及 -- 表现为 WeakReference 所引用的对象
4. 影子可触及 -- 表现为 PhantomReference 所引用的对象 阅读全文 >>

有关于 JVM 的垃圾收集(二)

自适应收集器

在第一篇:有关于 JVM 的垃圾收集(一)  中谈到过几种垃圾收集的算法,然而我们的 JVM 启动之后并不要求彻头彻尾的死板的使用一种垃圾收集算法,固定的算法参数。因为某种情况下某些垃圾收集算法工作得更好,而别外一些收集算法在另外的情况下工作得更好,所以自适应的垃圾收集技术应运而生。自适应算法监视堆中的情形,并且对应的调整为合适的垃圾收集技术。或能是换一种垃圾收集算法,或者是调整当前算法参数,或者把堆划分为子堆,同时在不同的子堆中使用不同的算法。

简述火车算法

垃圾收集一般都会停止整个程序的运行来查找和收集垃圾对象,它们可能在程序执行的任意时刻暂停,并且暂停的时间也无法确定。垃圾收集也可能使得程序对事件响应迟钝,无法满足实时系统的要求。如果一种垃圾收集算法可能导致用户可察觉的到的停顿或者使得程序无法适合实时系统的要求,这种算法被称作破坏性。垃圾收集算法的还有一个基本目标是使本质上的破坏性尽可能少,如果可能的话,尽可能消除这种破坏性。 阅读全文 >>

有关于 JVM 的垃圾收集(一)

Java 中使用 new、newarray、anewarray 和 multianewarray 指令来创建的对象,当这些对象不再使用时由垃圾收集来释放。那么 反序列化等都是间接使用了前面的某个指令, clone()  是个本地方法?

JVM 规范不需要任何特定的垃圾收集技术,甚至也没要求有垃圾收集机制。大概只是说不需要手工释放内存,具体怎么实现各 JVM 自行决定。

GC 除了释放不再被引用的对象,还要处理堆碎片,整理出连续的空闲空间才能放得下新的对象。不至于出现总的空闲空间足够,但碎片太多而报出 "Out of Memory" 的异常。

GC 有两个好处:一个是提高了生产率,不用埋头于 Memory Link 的有时甚至是逐行的检查;二,GC 也是 Java 安全策略的一部分,有了它不至于因错误的释放内存而导至 JVM 崩溃。但是 GC 的一个潜在缺陷影响了程序的性能,它需要一直在后台不时的做些事情,而且实时性也有所欠缺。 阅读全文 >>