JAVA的四种引用类型
来源:互联网 发布:centos和windows双系统 编辑:程序博客网 时间:2024/06/05 22:35
Java四种引用类型
1.引用的基本概念
强引用:当我们使用new创建对象时,被创建的对象就是强引用,如Object object = new Object(),其中的object就是一个强引用了。如果一个对象具有强引用,JVM就不会去GC它,JVM宁可会报OOM来终止程序,也不回收该对象。
软引用: 如果一个对象只具备软引用,如果内存空间足够,那么JVM就不会GC它,如果内存空间不足了,就会GC该对象。
弱引用: 如果一个对象只具有弱引用,只要JVM的GC线程检测到了,就会立即回收。弱引用的生命周期要比软引用短很多。不过,如果垃圾回收器是一个优先级很低的线程,也不一定会很快就会释放掉软引用的内存。
虚引用:如果一个对象只具有虚引用,那么它就和没有任何引用一样,随时会被JVM当作垃圾进行GC。
上面的四种引用对应的是new关键字以及java.lang.ref包中的SoftReference,WeakReference, PhantomReference。我们注意到在java.lang.ref包中,还存在一个类叫做ReferenceQueue。
2.理解ReferenceQueue
当软引用对象被GC之后,虽然这个SoftReference对象指向的对象已不存在,但这个SoftReference对象本身还占用内存,因此需要一个适当的清除机制,避免大量SoftReference对象带来的OOM。这就需要用到ReferenceQueue。如果在创建SoftReference对象的时候,使用了一个ReferenceQueue对象作为参数提供给SoftReference的构造方法,如下例子:
那么当这个SoftReference指向的MyOhject对象被垃圾收集器回收的同时,ref对象本身会被放入ReferenceQueue。也就是说,ReferenceQueue中保存的对象是Reference对象,但这些Reference对象引用的对象已经不存在了。
我们可以调用ReferenceQueue的poll()方法来检查是否有它所关心的非强引用对象被回收。利用这个方法,我们可以检查哪个SoftReference所软引用的对象已经被回收。于是我们可以把这些失去软引用的对象的清除掉。
3.理解WeakHashMap
WeakHashMap是以弱引用为键实现的HsahMap。更精确地说,对于一个给定的key对象,其对应的value对象的存在并不能阻止该key对象被GC。GC某个key对象时,它所在的条目会一并被从Map中删除。这是WeakHashMap与其他HashMap最大的不同。看下面的例子:
1.引用的基本概念
强引用:当我们使用new创建对象时,被创建的对象就是强引用,如Object object = new Object(),其中的object就是一个强引用了。如果一个对象具有强引用,JVM就不会去GC它,JVM宁可会报OOM来终止程序,也不回收该对象。
软引用: 如果一个对象只具备软引用,如果内存空间足够,那么JVM就不会GC它,如果内存空间不足了,就会GC该对象。
弱引用: 如果一个对象只具有弱引用,只要JVM的GC线程检测到了,就会立即回收。弱引用的生命周期要比软引用短很多。不过,如果垃圾回收器是一个优先级很低的线程,也不一定会很快就会释放掉软引用的内存。
虚引用:如果一个对象只具有虚引用,那么它就和没有任何引用一样,随时会被JVM当作垃圾进行GC。
上面的四种引用对应的是new关键字以及java.lang.ref包中的SoftReference,WeakReference, PhantomReference。我们注意到在java.lang.ref包中,还存在一个类叫做ReferenceQueue。
2.理解ReferenceQueue
当软引用对象被GC之后,虽然这个SoftReference对象指向的对象已不存在,但这个SoftReference对象本身还占用内存,因此需要一个适当的清除机制,避免大量SoftReference对象带来的OOM。这就需要用到ReferenceQueue。如果在创建SoftReference对象的时候,使用了一个ReferenceQueue对象作为参数提供给SoftReference的构造方法,如下例子:
ReferenceQueue queue = new ReferenceQueue();SoftReference ref=new SoftReference(new MyObject(), queue);
那么当这个SoftReference指向的MyOhject对象被垃圾收集器回收的同时,ref对象本身会被放入ReferenceQueue。也就是说,ReferenceQueue中保存的对象是Reference对象,但这些Reference对象引用的对象已经不存在了。
我们可以调用ReferenceQueue的poll()方法来检查是否有它所关心的非强引用对象被回收。利用这个方法,我们可以检查哪个SoftReference所软引用的对象已经被回收。于是我们可以把这些失去软引用的对象的清除掉。
3.理解WeakHashMap
WeakHashMap是以弱引用为键实现的HsahMap。更精确地说,对于一个给定的key对象,其对应的value对象的存在并不能阻止该key对象被GC。GC某个key对象时,它所在的条目会一并被从Map中删除。这是WeakHashMap与其他HashMap最大的不同。看下面的例子:
import java.util.Iterator;import java.util.WeakHashMap;public class Demo{ public static void main(String [] args) throws Exception{ WeakHashMap<String,String> weakHashMap=new WeakHashMap<String, String>(); String [] sts=new String[10]; for(int i=0;i<100;i++){ if(i%10==0) { sts[i/10]=new String(""+i); weakHashMap.put(sts[i/10], new String(""+i)); } else weakHashMap.put(new String(""+i), new String(""+i)); } // 催促垃圾回收器工作 System.gc(); // 把CPU让给垃圾回收器线程 Thread.sleep(8000); Iterator<String> iterator=weakHashMap.keySet().iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } }}
0 0
- Java的四种引用类型
- Java的四种引用类型
- java的四种引用类型
- java的四种引用类型
- Java的四种引用类型
- Java的四种引用类型
- Java的四种引用类型分析
- Java对象的四种引用类型
- Java的四种引用类型
- java的四种引用类型
- JAVA的四种引用类型
- Java的四种对象引用类型
- java的四种引用类型
- Java四种对象的引用类型
- java的四种引用类型
- Java的四种引用类型详解
- Java对象的四种引用类型
- Java四种引用类型
- ASP.NET IIS System.UnauthorizedAccessException: 对路径“C:\......xls”的访问被拒绝。
- tomct处理请求的流程
- awk简明用法
- sed简明用法
- 点击页面判断是否安装app并打开,否则跳转app store的方法
- JAVA的四种引用类型
- mybatis是如何防止SQL注入的
- BP tricks
- Go-Slice
- Eclipse搭建C语言开发环境——Eclipse+CDT+MinGW的配置与使用详解
- Spark JobServer 安装使用
- mybatis自动切换多个数据源
- TCP流量控制
- 关于添中ISampleGrabber滤波器实现单帧抓图的问题