JVM中强引用,弱引用,软引用和幽灵引用的代码
上代码:
public class ReferenceTest {
public static void main(String[] args) {
//test1();//软引用
//test2();//弱引用
//test3();//幽灵引用_1
test4();//幽灵引用_2
}
public static void test1(){
//在堆中创建一个对象Obj
//在栈中创建一个p来强引用此对象Obj
Person p=new Person(1);
//在栈中创建一个softReference来软引用此对象Obj 可以获取对象的属性值
SoftReference<Person> softReference=new SoftReference<Person>(p);
System.out.println(p.getId());//输出打印:1
System.out.println(softReference.get().getId());//输出打印:1
//断开p和Obj的强引用
p=null;
//System.out.println(p.getId());
//System.gc();
System.out.println(softReference.get().getId());//输出打印:1
//并不报空指针异常 虽然断开了p和Obj的强引用,但是并没有被回收.
//如果在前面调用gc() 垃圾回收 运行结果也是打印1的..软引用只有系统在发生内存溢出异常之前,会把只被软引用的对象进行回收
}
public static void test2(){
//在堆中创建一个对象Obj
//在栈中创建一个p来强引用此对象Obj
Person p=new Person(1);
//在栈中创建一个weakReference来弱引用此对象Obj 可以获取对象的属性值
WeakReference<Person> weakReference=new WeakReference<Person>(p);
System.out.println(weakReference.get().getId());//打印输出:1
//断开p和Obj的强引用
p=null;
//System.gc();
System.out.println(weakReference.get().getId());//打印输出:1
//p=null 之后 还是可以正常的打印输出1 说明断开强引用和其他弱引用,软引用压根没有关系.
//如果在打印之前 调用gc() 方法之后 就会报错..java.lang.NullPointerException
//垃圾回收不论内存是否不足都会回收只被弱引用关联的对象。
}
public static void test3(){
//在堆中创建一个对象Obj
//在栈中创建一个p来强引用此对象Obj
Person p=new Person(1);
//Phantom 幻影幽灵 的意思
ReferenceQueue<Person> referenceQueue = new ReferenceQueue<Person>();
//在栈中创建一个phantomReference来虚引用此对象Obj 不可以获取对象的属性值
PhantomReference<Person> phantomReference=new PhantomReference<Person>(p,referenceQueue);
System.out.println(phantomReference.get().getId());//打印报错 java.lang.NullPointerException
//直接得不到p对象对应的id值....
//PhantomReference的唯一作用就是 能在这个对象被收集器回收时收到一个系统通知 看test4()方法
}
public static void test4(){
//在堆中创建一个对象Obj
//在栈中创建一个p来强引用此对象Obj
Person p=new Person(1);
//Phantom 幻影幽灵 的意思
ReferenceQueue<Person> referenceQueue = new ReferenceQueue<Person>();
//在栈中创建一个phantomReference来虚引用此对象Obj 不可以获取对象的属性值
PhantomReference<Person> phantomReference=new PhantomReference<Person>(p,referenceQueue);
System.out.println(referenceQueue.poll());//打印输出: null 这个是查询队列中是否有元素.
//断开p和obj的强引用
p=null;
System.gc();//p被回收之后 队列referenceQueue中就有值了.
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}//过 一秒钟之后再查询队列中是否有元素.
System.out.println(referenceQueue.poll());//打印输出: java.lang.ref.PhantomReference@77fef1a0
//PhantomReference的唯一作用就是 能在这个对象被收集器回收时收到一个系统通知
//如果这个对象被回收了,会把通知放到队列中.
//如果前面p=null注释掉 再运行打印输出就是 null 因为p没有被回收(强引用中) 就不会把通知放到队列中...队列中为空 null
//回收的标志就是把通知放到队列中..
}
}
class Person{
public Person(Integer id) {
this.id = id;
}
private Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Override
protected void finalize() throws Throwable {
System.out.println("finalized!!!!!");
}
}
JVM中强引用,弱引用,软引用和幽灵引用的代码的更多相关文章
- Java 强,弱,软,虚 引用
import java.lang.ref.SoftReference; import java.lang.ref.WeakReference; public class TestGC { /** * ...
- java中的强引用(Strong reference),软引用(SoftReference),弱引用(WeakReference),虚引用(PhantomReference)
之前在看深入理解Java虚拟机一书中第一次接触相关名词,但是并不理解,只知道Object obj = new Object()类似这种操作的时候,obj就是强引用.强引用不会被gc回收直到gc roo ...
- java中强,软,弱,虚引用 以及WeakHahMap
java中强,软,弱,虚引用 以及WeakHahMap 一:强软引用: 参考:http://zhangjunhd.blog.51cto.com/113473/53092/进行分析 packa ...
- Java中强、软、弱、虚引用
1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使 ...
- java中强引用、软引用、弱引用、幻象引用有什么区别?分别使用在什么场景?
不同的引用类型,主要体现在对象的不同可达性(reachable)状态和对垃圾收集的影响. 1.强引用是我们最常见的普通对象引用,只要还有强引用指向一个对象,就表明对象还"活着",垃 ...
- Java 强引用 软引用 弱引用 虚引用详解
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt393 众所周知,java中是JVM负责内存的分配和回收,这是它的优点(使用方 ...
- java当中的强引用,软引用,弱引用,虚引用
强引用,软引用,弱引用,虚引用:不同的引用类型主要体现在GC上 强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收.即使当前内存空间不足,JVM也不会回收它,而是抛出 OutOfMemoryEr ...
- JVM-gcRoots 和 强引用,软引用, 弱引用, 虚引用, 代码演示和应用场景
什么是垃圾? 什么是gcRoots, 谈谈你对 强, 软, 弱 , 虚引用的理解, 他们的应用场景 jvm采用可达性分析法: 从gcRoots集合开始,自上向下遍历,凡是在引用链上的对象,都不是垃圾, ...
- java强引用 软引用 弱引用 虚引用
https://www.cnblogs.com/yw-ah/p/5830458.html Java四种引用包括强引用,软引用,弱引用,虚引用. 强引用: 只要引用存在,垃圾回收器永远不会回收Objec ...
随机推荐
- IntelliJ IDEA 2017版 使用笔记(五) 模板 live template自定义设置(二) ;postfix使用;IDE快捷键使用
一.live template 活模板 就像这个单词的含义一样,live template就是一个高效的提高代码,书写速度的方式,(live template位置File-----settin ...
- es6 字符串方法
1.字符串的新方法 includes() 包含属性 startsWith() 头部开始是否包含 endWith() 字符串是否在尾部 ========三个返回值都为布尔值 第二参数为数字 e ...
- PHP continue break 区别 用法
<?php //continue 跳过当前循环,进行下一个 //break 终止当前循环 $db=new PDO("mysql:host=localhost;dbname=root&q ...
- 百度Web Uploader组件实现文件上传之分片上传(一)
当网络问题导致传输错误时,只需要重传出错分片,而不是整个文件.另外分片传输能够更加实时的跟踪上传进度.多的不说了直接怼代码 前端是三个监听:一个是获取md5,一个是分片,最后一个是合并代码 <! ...
- Struts2-result
所有result-type <result-types> <result-type name="chain" class="com.opensympho ...
- 20155205 2016-2017-2 《Java程序设计》第2周学习总结
20155205 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 变量 变量在命名时有一些规则,它不可以使用数字作为开头,也不可以使用特殊字符. 对常用忽略符 ...
- 1111 Online Map (30 分)
1111. Online Map (30)Input our current position and a destination, an online map can recommend sever ...
- 关于MVC视图传参
转自:http://q.cnblogs.com/q/48477/
- [转]Android SQLite
数据库操作SQLite Expert Personal 3 注:下载相关SQLite的文档在:http://www.sqlite.org/ 具体的sql语句不作长细介绍,在本博客中也有相关的文章. 一 ...
- OC语言-runtime
参考博客 IOS高级开发-Runtime(一) http://blog.csdn.net/lizhongfu2013/article/details/9496705 apple官方参考 Object- ...