Java之强引用、弱引用、软引用和虚引用简介说明
下文笔者讲述java中强引用、弱引用、软引用和虚引用的简介说明,如下所示:
当一个对象具有强引用,则垃圾回收器绝不会回收它 例:
但是不会回收此对象
当强引用对象不使用时,我们需使用以下方式释放对象
如果内存空间充足时,则垃圾回收器就不会回收它
如果内存空间不足了,就会回收这些对象的内存
例:
只具有弱引用的对象拥有更短暂的生命周期
在垃圾回收器线程扫描它所管辖的内存区域的过程中
一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存
如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收
虚引用与软引用和弱引用的一个区别在于:
虚引用必须和引用队列(ReferenceQueue)联合使用
当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,
就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中
以下讲述四种引用的区别:
我们都知道Java中垃圾回收(GC回收),是借助判断对象是否存在存活 那么判断对象是否存活中,有一种方式就是引用计数 ---------------------------------------------------------------- 引用技术:Java堆中每一个对象都有一个引用计数属性,引用每新增1次计数加1,引用每释放1次计数减1 -------------------------------------------------------------------------------------------- 根据对象的引用等级,将对象分为四个级别,分别为:强引用、软引用、弱引用和虚引用 下文将依次将四个级别的简介说明,如下所示:
强引用(StrongReference)
强引用是我们日常使用最多的引用当一个对象具有强引用,则垃圾回收器绝不会回收它 例:
Object obj = new Object();当内存空间不足时,Java虚拟机会抛出OutOfMemoryError错误,使程序异常终止
但是不会回收此对象
当强引用对象不使用时,我们需使用以下方式释放对象
obj = null; 显式的将对象设置为null,此时GC则会回收其信息例:
public void test() { Object obj = new Object(); //其它业务操作 } 一个方法的内部有一个强引用,这个引用保存在Java栈中,而真正的引用内容(Object)保存在Java堆中。 当这个方法运行完成后,就会退出方法栈,此时引用对象的引用数为0 这个对象会被回收。 当这个strongReference是全局变量时,就需要在不用这个对象时赋值为null,因为强引用不会被垃圾回收。
软引用(SoftReference)
当一个对象只具有软引用如果内存空间充足时,则垃圾回收器就不会回收它
如果内存空间不足了,就会回收这些对象的内存
例:
// 强引用 String strongReference = new String("java265.com"); // 软引用 String str = new String("java265.com"); SoftReference<String> softReference = new SoftReference<String>(str);
注意事项: 软引用对象是在jvm内存不够的时候才会被回收, 当调用System.gc()方法只是起通知作用 JVM什么时候扫描回收对象是JVM自己的状态决定的 就算扫描到软引用对象也不一定会回收它 只有内存不够的时候才会回收 ---------------------------------------------------------- 即: 垃圾收集线程会在虚拟机抛出OutOfMemoryError之前回收软引用对象 而且虚拟机会尽可能优先回收长时间闲置不用的软引用对象
弱引用(WeakReference)
弱引用与软引用的区别在于只具有弱引用的对象拥有更短暂的生命周期
在垃圾回收器线程扫描它所管辖的内存区域的过程中
一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存
String str = new String("java265.com"); WeakReference<String> weakReference = new WeakReference<>(str); str = null;
当一个对象是偶尔(很少)的使用 且希望在使用时随时就能获取到 但又不想影响此对象的垃圾收集 那么你应该用Weak Reference来记住此对象。
虚引用(PhantomReference)
与上面几种引用都不同,虚引用并不会决定对象的生命周期如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收
虚引用与软引用和弱引用的一个区别在于:
虚引用必须和引用队列(ReferenceQueue)联合使用
当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,
就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中
String str = new String("java265.com"); ReferenceQueue queue = new ReferenceQueue(); // 创建虚引用,要求必须与一个引用队列关联 PhantomReference pr = new PhantomReference(str, queue);
以下讲述四种引用的区别:
引用类型 | 被垃圾回收时间 | 用途 | 生存时间 |
强引用 | 从来不会 | 对象的一般状态 | JVM停止运行时终止 |
软引用 | 当内存不足时 | 对象缓存 | 内存不足时终止 |
弱引用 | 正常垃圾回收时 | 对象缓存 | 垃圾回收后终止 |
虚引用 | 正常垃圾回收时 | 跟踪对象的垃圾回收 | 垃圾回收后终止 |
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。