博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java点滴(6)之java引用
阅读量:5984 次
发布时间:2019-06-20

本文共 4477 字,大约阅读时间需要 14 分钟。

1.强引用
这是使用最普遍的引用。如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。
2.软引用(SoftReference)
如果一个对象只具有软引用,那就类似于可有可物的生活用品。如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。
软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。
3.弱引用(WeakReference)
如果一个对象只具有弱引用,那就类似于可有可物的生活用品。弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。
弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。
4.虚引用(PhantomReference)
"虚引用"顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。
虚引用主要用来跟踪对象被垃圾回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用。当垃 圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。

 

  1 package com.test.reference.mode;

 2 
 3 
public 
class Student {
 4 
 5     
private 
int id;
 6     
private String name;
 7     
private 
int age;
 8     
 9     
public Student(
int id, String name, 
int age) {
10         
super();
11         
this.id = id;
12         
this.name = name;
13         
this.age = age;
14     }
15     
16     @Override
17     
protected 
void finalize() 
throws Throwable {
18         
super.finalize();
19         System.out.println("finalize : " + toString());
20     }
21     
22     @Override
23     
public String toString() {
24         
return " [Student msg : id = " + id + " name = " + name + " age = " + age +"]";
25     }
26     
27     
public 
int getId() {
28         
return id;
29     }
30     
public 
void setId(
int id) {
31         
this.id = id;
32     }
33     
public String getName() {
34         
return name;
35     }
36     
public 
void setName(String name) {
37         
this.name = name;
38     }
39     
public 
int getAge() {
40         
return age;
41     }
42     
public 
void setAge(
int age) {
43         
this.age = age;
44     }
45     
46 }

 

 1 
package com.test.reference;
 2 
 3 
import java.lang.ref.ReferenceQueue;
 4 
import java.lang.ref.WeakReference;
 5 
 6 
import com.test.reference.mode.Student;
 7 
 8 
 9 
10 
public 
class ReferenceUsage {
11     
public 
static 
void main(String args[]) {
12         hold();
13         release();
14     }
15 
16     
public 
static 
void hold() {
17         System.out.println("--------------hold--------------");
18         
//
 Create an object
19 
        Student stu = 
new Student(0, "kobe", 33);
20         
//
 Create a reference queue
21 
        ReferenceQueue<Student> rq = 
new ReferenceQueue<Student>();
22         
//
 Create a weakReference to obj and associate our reference queue
23 
        WeakReference<Student> wr = 
new WeakReference<Student>(stu, rq);
24         System.out.println("weak reference wr: " + wr); 
//
 wr
25 
        System.out.println("weak reference stu wr.get(): " + wr.get()); 
//
 stu
26 
        
//
 Check to see if it´s on the ref queue yet
27 
        System.out.println("Polling rq.poll(): " + rq.poll()); 
//
 null
28 
        System.gc();
29         System.out.println("hold   gc   ");
30         System.out.println("Polling  rq.poll(): " + rq.poll()); 
//
 null
31 
        System.out.println("weak reference returns obj wr.get(): " + wr.get()); 
//
 not null
32 
    }
33 
34     
public 
static 
void release() {
35         System.out.println("--------------release--------------");
36         
//
 Create an object
37 
        Student stu = 
new Student(0, "刘德华", 48);
38         
//
 Create a reference queue
39 
        ReferenceQueue<Student> rq = 
new ReferenceQueue<Student>();
40         
//
 Create a weakReference to obj and associate our reference queue
41 
        WeakReference<Student> wr = 
new WeakReference<Student>(stu, rq);
42         System.out.println("weak reference wr: " + wr); 
//
 wr
43 
        System.out.println("weak reference stu wr.get(): " + wr.get()); 
//
 stu
44 
        
//
 Check to see if it´s on the ref queue yet
45 
        System.out.println("Polling rq.poll(): " + rq.poll()); 
//
 null
46 
        stu = 
null;
47         System.gc();
48         System.out.println("release   gc   ");
49         System.out.println("Polling  rq.poll() : " + rq.poll()); 
//
maybe not null
50 
        System.out.println("weak reference returns obj : wr.get() " + wr.get()); 
//
 null
51 
    }

52 } 

 

运行结果:

--------------hold--------------
weak reference wr: java.lang.ref.WeakReference@61de33
weak reference stu wr.get():  [Student msg : id = 0 name = kobe age = 33]
Polling rq.poll(): null
hold   gc   
Polling  rq.poll(): null
weak reference returns obj wr.get():  [Student msg : id = 0 name = kobe age = 33]
--------------release--------------
weak reference wr: java.lang.ref.WeakReference@ca0b6
weak reference stu wr.get():  [Student msg : id = 0 name = 刘德华 age = 48]
Polling rq.poll(): null
finalize :  [Student msg : id = 0 name = 刘德华 age = 48]
finalize :  [Student msg : id = 0 name = kobe age = 33]
release   gc   
Polling  rq.poll() : java.lang.ref.WeakReference@ca0b6
weak reference returns obj : wr.get() null

 

 

 

转载于:https://www.cnblogs.com/cody1988/archive/2012/04/18/2455299.html

你可能感兴趣的文章
防止 DDoS 攻击的五个「大招」!
查看>>
epoll LT/ET 深入剖析
查看>>
如何使用Android UI Fragment开发“列表-详情”界面
查看>>
啥是中台?
查看>>
使用keepalived实现nginx的高可用
查看>>
前端小报 - 201903月刊
查看>>
Ingress-nginx 源码分析
查看>>
centos7安装配置rsync以及遇到问题
查看>>
[kuangbin带你飞]专题一 简单搜索 题解报告
查看>>
阿里云 Aliplayer高级功能介绍(六):进度条标记
查看>>
JS基础篇--sort()方法的用法,参数以及排序原理
查看>>
HAVING语句
查看>>
Jetty JNDI开发实战(上)
查看>>
mybatis---高级映射、延迟加载、查询缓存
查看>>
在Sql Server中使用Guid类型的列及设置Guid类型的默认值
查看>>
2018高通骁龙峰会,大象声科在内的合作伙伴基于骁龙855实现的AI升级成为全场亮点...
查看>>
MySQL基础4
查看>>
什么是堡垒机?个人经验推荐优质堡垒机
查看>>
9月25日科技联播:科大讯飞发文称公司没有造假;刘强东案涉事女主微信内容曝光...
查看>>
XShell和CRT文件传输
查看>>