垃圾回收先判生死
垃圾回收算法:
-
引用计数算法
-
在对象中加一个引用计数器,当有地方引用他时,计数器值+1,引用失效时,计算器值减1。计数器为0的对象是不能再被引用的。
-
引用计数很难解决对象之间相互循环引用的问题。
-
使用例子:微软com技术,python
-
如果两个对象相互访问,则引用计数器无法回收他们
-
-
可达性分析算法
- 通过一些GC Roots的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,如果对象到GC Roots间没有路径,则从GC Roots到这个对象是不可达的,这些对象要被回收。
- 宣告对象真正死亡,至少两次标记:若对象在进行可达性分析后发现没有与GC Roots相连,那它将会被第一次标记,随后进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。假如对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用 过,那么虚拟机将这两种情况都视为“没有必要执行”。若被判有必要执行,则对象被放置在F-Queue的 队列中,稍后会有线程去执行finalize()方法,finalize()方法是最后拯救的机会。
Java引用分类
-
强引用:指程序中的引用赋值,即类似“Object obj=new Object()”这种引用关系,只要强引用关系在,垃圾收集器就永远不会回收被引用的对象。
-
软引用:只被软引用关联着的对象,在系统要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常。
-
弱引用:也是用来描述那些非必须对象,强度比软引用更弱,被弱引用关联的对象只 能生存到下一次垃圾收集发生为止。
-
虚引用:并不影响其生存空间,为一个对象设置虚引用的唯一目的只为了能在这个对象被收集器回收时收到一个系统通知。