主要来源自阅读深入理解java虚拟机
引用计数法
对对象添加一个引用计数器,每当有一个地方引用,计数器就会加1;当引用失效时计数器就减1,任何时刻计数器为0的时候就应该可回收了。优点在于实现简单,但是引用计数法很难解决循环引用的问题
可达性分析
可达性分析是java实际的算法,通过GC Roots开始乡下搜索,搜索走过的路径叫引用链,当一个对象到GC Roots没有任何引用链,就可以判断成可回收对象,GC Roots包含
- 虚拟机栈中引用的对象
- 方法区类静态属性引用的对象
- 方法区常量引用的对象
- 本地方法栈中JNI引用的对象
引用
- 强引用
强引用就是指代码中普遍存在的,类似"Object obj = new Object()"这类的引用,只要强引用还存在,垃圾收集器永远不会回收被引用的对象 - 软引用
软引用是用来描述一些还有用但并非必需的对象,对于软引用关联的对象,在系统将要发生内存溢出异常之前会先对这些对象进行第二次回收,如果仍然没有足够内存才报内存溢出异常 - 弱引用
被弱引用关联的对象只能生存到下次垃圾回收之前,当垃圾回收器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。WeakReference类可以实现一个弱引用,Thread类源码中也会看到 - 虚引用
虚引用是最弱的一种引用关系,一个对象是否有虚引用完全不会对其生存时间有影响,PhantomReference可以实现一个虚引用
网友评论