深入理解JVM学习笔记之垃圾收集器与内存分配策略(一)
深入理解JVM学习笔记之垃圾收集器与内存分配策略(一)
确定对象是否存活算法
引用计数法:给对象添加一个引用计数器,当一个地方引用它时,计数器值就+1;当引用失效时,计数器值就-1;任何时刻计数器为0的对象就是不再被使用的。
优点:实现简单,判定效率高。
缺点:很难解决对象间循环引用问题。如:对象objA.instance=objB; objB.instance=objA; 除此以外这两个对象再无引用。实际上这两个对象已经不可能再被访问,但因为它们互相引用,引用计数器的值都不为0,导致引用计数法不会判断这两个对象已死,从而使得引用计数法无法通知GC收集器回收它们。
可达性分析算法:通过一系列的“GC Rooots”的对象作为起点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。
优点:可以解决对象循环引用问题
可作为GC Roots的对象:虚拟机栈中引用的对象
方法区中类静态属性引用的对象
方法区中常量引用的对象
本地方法栈中JNI(即一般说的Native方法)引用的对象
引用分类
强引用(Strong Reference):程序代码中普遍存在的如Object obj=new Object() 这类的引用,只要强引用存在,对象就不会被回收。
软引用(Soft Reference):在系统将要发生内存溢出之前,将对象列进回收范围内进行第二次回收。如果这次回收后还没有足够内存,才会抛出内存溢出异常。在JDK1.2之后,提供了SoftReference类来实现软引用。
弱引用(Weak Reference):被弱引用关联的对象只能生存到下一次垃圾收集发生之前。无论当前内存是否足够,都会回收只被弱引用关联的对象。在JDK1.2之后,提供了WeakReference类来实现弱引用。
虚引用(Phantom Reference):是最弱的引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间造成影响,也无法通过虚引用来取得一个对象的实例。为一个对象设置虚引用的目的仅是为了在对象被回收时收到一个系统通知。在JDK1.2之后,提供了PhantomReference类来实现虚引用。
详细见:强引用 软引用 弱引用 虚引用&ReferenceQueue Reference分析
对象的自救
回收对象的过程:要真正宣告一个对象的死亡,至少要经历两次标记过程:如果对象经过可达性分析后,发现没有与GC Roots相连接的引用链,那它将被第一次标记。标记对象后将判断这个对象是否有执行finalize()方法的必要(当对象没有覆盖finalize()方法或finalize()方法已被调用过,虚拟机将认为没有必要执行finalize()方法),执行后,进行第二次标记,并对已被标记的对象进行回收。
对象如何自救:在finalize()方法中重新与引用链上的任何一个对象建立关联即可,如把自己(this关键字)赋值给某个类变量或对象的成员变量。如下代码:
Public class FinalizeEscapeGC{ Public static FinalizeEscapeGC SAVE_HOOK = null; @Override Protected void finalize() throws Throwable{ Super.finalize(); FinalizeEscapeGC.SAVE_HOOK = this; } }
注:对象只能自救一次,因为当对象再一次没有任何引用链到达GC Roots后,将在第一次被标记后被认为没有必要执行finalize()方法,从而无法自救。
注:对象被判断有必要执行finalize()方法后,对象将会被放置在一个叫做F-Quene的队列中,并在稍后由一个虚拟机自动建立的低优先级的Finalizer线程运行它。虚拟机执行finalize()方法仅是触发它,并不保证会等待它运行结束。原因是,如果一个对象在finalize()方法中执行缓慢或发生了死循环,将很可能导致F-Queue队列中其他对象永远处于等待。
回收方法区
永久代的垃圾收集主要回收两部分内容:废弃常量和无用的类。
废弃常量的判定和JAVA堆中的对象非常类似。若一个常量没有被任何对象引用,则是废弃常量。
判断无用的类的条件则十分苛刻:
1.该类所有实例都被回收,即堆中不存在该类的任何实例
2.加载该类的ClassLoader已被回收
3.该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类方法。
而即使满足了这些条件,无用类也不一定会被回收。HopSpot虚拟机提供了Xnoclassgc参数进行控制。
- 点赞
- 收藏
- 分享
- 文章举报
- 深入理解JVM学习笔记:第3章 垃圾收集器与内存分配策略
- 深入理解JVM笔记二---垃圾收集器及内存分配策略
- 深入理解Java虚拟机JVM高级特性与最佳实践阅读总结——第三章垃圾收集器与内存分配策略
- 深入理解JVM:垃圾收集器与内存分配策略
- 深入理解JVM虚拟机总结——垃圾收集器与内存分配策略
- [课本划重点]深入理解jvm-第3章 垃圾收集器与内存分配策略(1)
- [课本划重点]深入理解jvm-第3章 垃圾收集器与内存分配策略(3)
- [课本划重点]深入理解jvm-第3章 垃圾收集器与内存分配策略(2)
- 【深入理解JVM虚拟机】第3章 垃圾收集器与内存分配策略
- 深入理解JVM(二)垃圾收集器与内存分配策略
- 深入理解JVM(四):垃圾收集器和内存分配策略
- 深入理解JVM:垃圾收集器与内存分配策略
- JVM 学习笔记(三) 垃圾收集器与内存分配策略
- 深入理解JVM—第三章:垃圾收集器与内存分配策略
- JVM学习笔记三:垃圾收集器与内存分配策略
- 深入理解JVM虚拟机学习笔记(三)内存分配和回收策略
- 笔记:深入理解JVM 第3章 垃圾回收器与内存分配策略
- [jjzhu学java]之深入理解JVM之垃圾收集器与内存分配策略
- 深入学习Java虚拟机学习笔记-垃圾收集器与内存分配策略
- 深入学习Java JVM - 垃圾收集器与内存分配策略