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 ... 
随机推荐
- 天使投资、A轮、B轮、C轮
			一般是这样划分的. A轮融资:公司产品有了成熟模样,开始正常运作一段时间并有完整详细的商业及盈利模式,在行业内拥有一定地位和口碑.公司可能依旧处于亏损状态.资金来源一般是专业的风险投资机构(VC).投 ... 
- [转]两表join的multi update语句在MySQL中的执行流程分析
			出自:http://hedengcheng.com/?p=209 两表join的multi update语句,执行结果与预计不一致的分析过程 — multi update结论在实际应用中,不要轻易使用 ... 
- css3实现切片动画
			<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <meta http- ... 
- 20155205 《Java程序设计》实验四 Android程序设计
			20155205 <Java程序设计>实验四 Android程序设计 一.实验内容及步骤 (一) Android Stuidio的安装测试 参考<Java和Android开发学习指南 ... 
- LINQ 语法
			语言集成查询 (LINQ) 是 Visual Studio 2008 和 .NET Framework 3.5 版中一项突破性的创新,它在对象领域和数据领域之间架起了一座桥梁. 传统上,针对数据的查询 ... 
- python advanced programming (Ⅲ)
			IO编程 IO在计算机中指Input/Output.由于程序和运行时数据是在内存中驻留,由CPU来执行,涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口. IO编程中,Stream(流)是一个 ... 
- MongoDB、redis、memcached
			mongodb和memcached不是一个范畴内的东西. mongodb 是文档型的非关系型数据库,其优势在于查询功能比较强大,能存储海量数据. memcached,redis mongodb ... 
- python处理excel之读:xlrd模块
			# -*- coding:utf-8 -*- import xlrd path = r'D:/工作簿1(已自动还原).xlsx' # 打开excel文件读取数据 data = xlrd.open_wo ... 
- linux 下载文件
			工作流程 1.tar pczvf file.tar.gz file 2.sz file.tar.gz:下载. 3.rm -i file.tar.gz: 删除. 
- expect 安装使用
			expect 命令相当于crt远程连接,可用于脚本化实现多服务器巡检功能. 一.expect 命令安装: 1.rpm 文件下载:百度云链接:http://pan.baidu.com/s/1sl1wSU ... 
