上代码:

 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中强引用,弱引用,软引用和幽灵引用的代码的更多相关文章

  1. Java 强,弱,软,虚 引用

    import java.lang.ref.SoftReference; import java.lang.ref.WeakReference; public class TestGC { /** * ...

  2. java中的强引用(Strong reference),软引用(SoftReference),弱引用(WeakReference),虚引用(PhantomReference)

    之前在看深入理解Java虚拟机一书中第一次接触相关名词,但是并不理解,只知道Object obj = new Object()类似这种操作的时候,obj就是强引用.强引用不会被gc回收直到gc roo ...

  3. java中强,软,弱,虚引用 以及WeakHahMap

    java中强,软,弱,虚引用  以及WeakHahMap   一:强软引用: 参考:http://zhangjunhd.blog.51cto.com/113473/53092/进行分析   packa ...

  4. Java中强、软、弱、虚引用

    1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使 ...

  5. java中强引用、软引用、弱引用、幻象引用有什么区别?分别使用在什么场景?

    不同的引用类型,主要体现在对象的不同可达性(reachable)状态和对垃圾收集的影响. 1.强引用是我们最常见的普通对象引用,只要还有强引用指向一个对象,就表明对象还"活着",垃 ...

  6. Java 强引用 软引用 弱引用 虚引用详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt393 众所周知,java中是JVM负责内存的分配和回收,这是它的优点(使用方 ...

  7. java当中的强引用,软引用,弱引用,虚引用

    强引用,软引用,弱引用,虚引用:不同的引用类型主要体现在GC上 强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收.即使当前内存空间不足,JVM也不会回收它,而是抛出 OutOfMemoryEr ...

  8. JVM-gcRoots 和 强引用,软引用, 弱引用, 虚引用, 代码演示和应用场景

    什么是垃圾? 什么是gcRoots, 谈谈你对 强, 软, 弱 , 虚引用的理解, 他们的应用场景 jvm采用可达性分析法: 从gcRoots集合开始,自上向下遍历,凡是在引用链上的对象,都不是垃圾, ...

  9. java强引用 软引用 弱引用 虚引用

    https://www.cnblogs.com/yw-ah/p/5830458.html Java四种引用包括强引用,软引用,弱引用,虚引用. 强引用: 只要引用存在,垃圾回收器永远不会回收Objec ...

随机推荐

  1. HDU-3608 最长回文

    HDU-3608 最长回文 题面 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如ab ...

  2. doc.getElementById(id); null

    Open Declaration Element org.w3c.dom.Document.getElementById(String elementId) Returns the Element t ...

  3. Matlab绘图添加直角坐标轴

    绘制y=x^2,并添加直角坐标轴. clear;clc;close all %% 绘制方程 x = -10:0.01:10; figure; y = x.^2-30; plot(x,y,'k','li ...

  4. checked 选择框选中

    移除属性,两种方式都可 $browsers.removeAttr("checked"); $browsers.attr("checked",false); // ...

  5. js获取标签下标

    <body> <div class="titTab"> <span>低</span> <span>中</span& ...

  6. hdu 5047 大数找规律

    http://acm.hdu.edu.cn/showproblem.php?pid=5047 找规律 信kuangbin,能AC #include <stdio.h> #include & ...

  7. Hadoop读写流程

    写流程 读流程 HDFS写数据流程 HDFS读数据流程 网络拓扑-节点距离计算 节点距离:两个节点到达最近的共同祖先的距离总和

  8. Poj2296

    题意:给定n个点,然后在每个点在一个正方形的上边或者下边的中点,并且所有的正方形等大且不能重叠.求正方形最大的边长是多少. 思路:很明显的二分边长+判定.不过判定要用到2-sat,算是2-sat的入门 ...

  9. ASP.NET Web API 框架研究 Controller创建过程与消息处理管道

    现在我们从代码角度来看下,从消息处理管道末尾是怎么创建出Controller实例的.消息处理管道末端是一个叫HttpRoutingDispatcher的处理器,其内部完成路由后 ,会把消息派送给其内部 ...

  10. wordpress和数据库的连接

    1.首先在数据库里创建wordpress数据库 2.在网页上配置WordPress,安装WordPress 如上配置不对,提交时提示了错误,于是我选择了root用户 123456, 3.提交后,连上了 ...