一、垃圾回收机制特征
- 垃圾回收机制只负责回收堆内存中的对象,不糊回收任何物理资源
- 程序无法精确控制垃圾回收的运行,垃圾回收会在合适的时候进行。
- 在垃圾回收任何对象之前,总是会先执行它的finalize()方法,该方法可能使对象被重新引用
二、对象在内存中的状态
(1)可达状态:当对象被一个及以上的引用变量所引用时,它的状态就是可达状态
(2)可恢复状态:当对象没有任何引用变量引用,且其finalize()方法尚未被执行时的状态
(3)不可达状态:当对象没有任何引用变量引用,且finalize()方法执行后其仍未被引用,则它就是不可达状态,系统会真正回收其所占用的资源
三、finalize()方法
(1)永远不要主动调用某个对象的finalize()方法,该方法留给垃圾回收机制调用
(2)finalize()方法何时被调用具有不确定性,不一定会被执行
(3)当JVM执行可恢复对象的finalize()方法时,可能使其重新变成可达状态
(4)当finalize()方法执行出现异常时,系统不会报告异常,程序继续执行,这是由于其方法原型为
protected void finalize() throws Throwable
也就是在声明时已经将任何可能的异常抛给了系统。
四、Java中对对象的引用的四种方式
(1)强引用:最常见的引用方式,即将一个对象赋给一个引用变量
(2)软引用:软引用需要通过SoftReference类实现,当一个对象只有软引用时,它有可能 被垃圾回收机制回收,当系统存储空间足够时,它不会被回收。通常用于内存敏感的程序中
(3)弱引用:弱引用通过WeakReference类实现。当一个对象只有弱引用时,无论系统内存是否足够,当垃圾回收机制运行时,它都会被回收。
(4)虚引用:虚引用通过PhantomReference类实现,虚引用类似于没有引用。它主要用于跟踪对象被垃圾回收的状态,不能单独使用,必须和引用队列(ReferenceQueue)一起使用。