GC概述
判断对象是否存活的方法:
引用计数算法:
在对象中添加一个引用计数器,每当有地方引用该对象时就加一,当引用失效时就减一。计数器为零的对象即为死对象。
缺陷:
有很多例外的情况要考虑,例如对象之间的相互循环引用。
可达性分析算法:
从GC Roots到这个对象不可达,则说明此对象是死的。
可作为GC Roots的对象包含以下几种:
- 虚拟机栈中引用的对象
- 方法区中类静态属性引用的对象
- 方法去中常量引用的对象
- 本地方法栈中引用的对象
- JVM虚拟机内部的引用(基本数据类型对应的Class对象,常驻的异常对象,系统类加载器等)
- 所有被同步锁持有的对象(synchronized关键字)
- JMXBean等
引用
JDK1.2之后,将引用分为强引用,软引用,弱引用,虚引用。
强引用:传统的引用赋值。只要强引用关系还在,GC永不会回收被引用的对象。
软引用:软引用对象,由垃圾收集器根据内存需求自行清除。软引用最常用于实现 对内存敏感的缓存。
弱引用:弱引用对象的存在不会阻止它所指向的对象被垃圾回收器回收。弱引用最常见的用途 是实现规范映射(canonicalizing mappings,比如哈希表)。
虚引用:唯一目的是在这个对象被GC回收时收到一个系统通知。
finalize方法
任何一个对象的finalize方法只会被系统调用一次。
不建议使用finalize方法,代价高,不确定性大。