java 的内存回收

来源:互联网 发布:知乐作品 编辑:程序博客网 时间:2024/05/24 01:50

java的内存分配和内存回收工作都是有JVM自动完成的。

对于JVM的垃圾回收机制来说,是否回收一个对象的标准在于,是否还有引用变量引用该对象(JVM采用一种有向图方式来管理内存中的对象)

为了更好的管理对象的引用,从JDK1.2 开始,java在java.lang.ref包下提供了三个类  :SoftReference、PhantomReference、WeakReference

(1)强引用

这是最常见的引用,程序创建一个对象,并把这个对象赋给一个引用变量,被强引用所引用的java对象绝不会被垃圾回收机制回收,即使内存非常紧张

(2)软引用

通过SoftReference类实现,对于只有软引用的对象而言,当系统内存空间充足时,它不会被系统回收,当系统内存空间不足时,系统将会回收它。

(3)弱引用

通过WeakReference类实现,与软引用有点相似,区别在于弱引用所引用对象的生存期更短,对于只有弱引用的对象而言,当系统垃圾回收时,不管系统内存是否足够,总会回收该对象所占有的内存

强制垃圾回收:System.gc();  System.runFinalization();

(弱引用具有很大不确定性,因此程序在获取弱引用所引用的java对象时必须小心空指针异常,通过弱引用所引用的java对象可能是null)

(4)虚引用

软引用和弱引用可以单独使用,虚引用不行,虚引用的主要作用是跟踪对象被垃圾回收的状态,程序可以通过检查与虚引用关联的引用队列中是否已经包含指定的虚引用,从而了解虚引用所引用的对象是否即将被回收