java中引用的用法
来源:互联网 发布:开淘宝店需要上传照片 编辑:程序博客网 时间:2024/05/18 01:07
java中引用分为四种强度:强引用,软引用、弱引用、虚引用
强引用:就是像Object obj = new Object()这种引用;
强引用存在时,垃圾回收器不会回收。
1、软引用:SoftReference类来实现
只有当内存快要溢出时才会回收这部分内存,经常应用在缓存技术中。
可以关联一个引用队列,当出现溢出时JVM回收这部分内存后,会将这个引用放入这个关联的引用队列。
// 软引用 public static void test() { SoftReference<String> sr = new SoftReference<String>(new String("hello")); System.out.println(sr.get()); System.gc(); System.out.println(sr.get()); }
运行结果如下
hellohello
内存并很充足,所以不会回收
2、弱引用:WeakReference类来实现
描述非必须对象。强度比软引用更弱。被弱引用关联的对象只能生存到下一次垃圾回收器工作之前。垃圾回收器开始工作时,无论是否内存充足都会回收。
可以关联一个引用队列,当该引用对象被JVM回收时,会将该引用放入该队列中。
// 弱引用 public static void test2() { WeakReference<String> sr = new WeakReference<String>(new String("hello")); System.out.println(sr.get()); System.gc(); //通知JVM的gc进行垃圾回收 System.out.println(sr.get()); }
运行结果
hellonull
gc运行时就会将内存收回
3、虚引用:PhantomReference类来实现
最弱的引用关系。这个引用存在不存在不影响其对象的生存,唯一的目的就是能在这个对象被垃圾回收器回收时收到一个系统通知。(就是放入引用队列中)
如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。而且不能通过虚引用访问到对象值。
// 虚引用 public static void test3() throws InterruptedException { String str = new String("hello"); ReferenceQueue<String> queue = new ReferenceQueue<String>(); System.out.println("queue:"+queue.poll()); // 建立一个虚引用,关联一个引用队列 PhantomReference<String> pr = new PhantomReference<String>(str, queue); System.out.println("queue:"+queue.poll()); System.out.println("pr:"+pr.get()); str = null; // 启动垃圾回收器 System.gc(); Thread.sleep(2000);// 个垃圾回收器运行时间 System.out.println(queue.poll()); }
运行结果
queue:nullqueue:nullpr:nulljava.lang.ref.PhantomReference@15db9742
JVM回收了这部分内存,然后将虚引用放入引用队列。注意这些被回收的引用仅仅只是一个引用,引用值为null
应用
软引用适合用来进行缓存,当内存不够时能让JVM回收内存;
弱引用能用来在回调函数中防止内存泄露。因为回调函数往往是匿名内部类,隐式保存有对外部类的引用,所以如果回调函数是在另一个线程里面被回调,而这时如果需要回收外部类,那么就会内存泄露,因为匿名内部类保存有对外部类的强引用。
阅读全文
0 0
- java中引用的用法
- C++中引用的用法
- C#中引用的用法
- C++中引用的用法
- C++中关于 引用 的用法
- C++中引用(reference)的用法详解
- c++中引用(&)的用法
- php中引用变量&的用法
- C++中指针的引用用法实例
- C++中引用(&)的用法
- C++中引用(&)的用法详解
- C++中引用&、const的用法
- C语言中引用的用法
- Java中强引用、软引用、弱引用的区别
- Java 关于强引用,软引用,弱引用和虚引用的区别与用法
- Java 关于强引用,软引用,弱引用和虚引用的区别与用法
- java 中对象的引用
- Java中引用的详解
- 视频容器格式与编码格式简介
- Unity Shader:Waveform波形(2)-基本波形:正弦,三角,锯齿,直角以及其变种的实现方式
- idea 破解
- Android图片加载框架最全解析(一),Glide的基本用法
- Sql Server基本操作语句
- java中引用的用法
- 任务切换的精华思想
- Adreno GPU Profiler工具使用总结
- 右键打开命令行窗口CMD
- CCF 2016 工资计算C++,Java,工资计算解题思路
- 音视频封装格式、编码格式知识
- 一级指针
- Android内置音频文件
- js 数组去重