上代码:

 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. 天使投资、A轮、B轮、C轮

    一般是这样划分的. A轮融资:公司产品有了成熟模样,开始正常运作一段时间并有完整详细的商业及盈利模式,在行业内拥有一定地位和口碑.公司可能依旧处于亏损状态.资金来源一般是专业的风险投资机构(VC).投 ...

  2. [转]两表join的multi update语句在MySQL中的执行流程分析

    出自:http://hedengcheng.com/?p=209 两表join的multi update语句,执行结果与预计不一致的分析过程 — multi update结论在实际应用中,不要轻易使用 ...

  3. css3实现切片动画

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <meta http- ...

  4. 20155205 《Java程序设计》实验四 Android程序设计

    20155205 <Java程序设计>实验四 Android程序设计 一.实验内容及步骤 (一) Android Stuidio的安装测试 参考<Java和Android开发学习指南 ...

  5. LINQ 语法

    语言集成查询 (LINQ) 是 Visual Studio 2008 和 .NET Framework 3.5 版中一项突破性的创新,它在对象领域和数据领域之间架起了一座桥梁. 传统上,针对数据的查询 ...

  6. python advanced programming (Ⅲ)

    IO编程 IO在计算机中指Input/Output.由于程序和运行时数据是在内存中驻留,由CPU来执行,涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口. IO编程中,Stream(流)是一个 ...

  7. MongoDB、redis、memcached

    mongodb和memcached不是一个范畴内的东西. mongodb     是文档型的非关系型数据库,其优势在于查询功能比较强大,能存储海量数据. memcached,redis mongodb ...

  8. python处理excel之读:xlrd模块

    # -*- coding:utf-8 -*- import xlrd path = r'D:/工作簿1(已自动还原).xlsx' # 打开excel文件读取数据 data = xlrd.open_wo ...

  9. linux 下载文件

    工作流程 1.tar pczvf file.tar.gz file 2.sz file.tar.gz:下载. 3.rm -i file.tar.gz: 删除.

  10. expect 安装使用

    expect 命令相当于crt远程连接,可用于脚本化实现多服务器巡检功能. 一.expect 命令安装: 1.rpm 文件下载:百度云链接:http://pan.baidu.com/s/1sl1wSU ...