当前位置: 首页 > 编程日记 > 正文

JVM中强引用,弱引用,软引用和幽灵引用的代码

上代码:

复制代码
  1 public class ReferenceTest {
  2     public static void main(String[] args) {
  3         //test1();//软引用
  4         //test2();//弱引用
  5         //test3();//幽灵引用_1
  6         test4();//幽灵引用_2
  7         
  8     }
  9     public static void test1(){
 10         //在堆中创建一个对象Obj
 11         //在栈中创建一个p来强引用此对象Obj
 12         Person p=new Person(1);
 13         
 14         //在栈中创建一个softReference来软引用此对象Obj 可以获取对象的属性值
 15         SoftReference<Person> softReference=new SoftReference<Person>(p);
 16         System.out.println(p.getId());//输出打印:1
 17         System.out.println(softReference.get().getId());//输出打印:1
 18         
 19         //断开p和Obj的强引用
 20         p=null;
 21         //System.out.println(p.getId());    
 22         //System.gc();
 23         System.out.println(softReference.get().getId());//输出打印:1 
 24         //并不报空指针异常  虽然断开了p和Obj的强引用,但是并没有被回收.
 25         //如果在前面调用gc() 垃圾回收  运行结果也是打印1的..软引用只有系统在发生内存溢出异常之前,会把只被软引用的对象进行回收
 26     }
 27 
 28     public static void test2(){
 29         //在堆中创建一个对象Obj
 30         //在栈中创建一个p来强引用此对象Obj
 31         Person p=new Person(1);
 32         
 33         //在栈中创建一个weakReference来弱引用此对象Obj 可以获取对象的属性值
 34         WeakReference<Person>  weakReference=new WeakReference<Person>(p);
 35         System.out.println(weakReference.get().getId());//打印输出:1
 36         
 37         //断开p和Obj的强引用
 38         p=null;
 39         //System.gc();
 40         System.out.println(weakReference.get().getId());//打印输出:1 
 41         //p=null 之后 还是可以正常的打印输出1  说明断开强引用和其他弱引用,软引用压根没有关系.
 42         //如果在打印之前 调用gc() 方法之后  就会报错..java.lang.NullPointerException
 43         //垃圾回收不论内存是否不足都会回收只被弱引用关联的对象。
 44         
 45     }
 46     
 47     public static void test3(){
 48         //在堆中创建一个对象Obj
 49         //在栈中创建一个p来强引用此对象Obj
 50         Person p=new Person(1);
 51         
 52         //Phantom 幻影幽灵 的意思
 53         ReferenceQueue<Person> referenceQueue = new ReferenceQueue<Person>();
 54         //在栈中创建一个phantomReference来虚引用此对象Obj 不可以获取对象的属性值
 55         PhantomReference<Person> phantomReference=new PhantomReference<Person>(p,referenceQueue);
 56         System.out.println(phantomReference.get().getId());//打印报错 java.lang.NullPointerException
 57         //直接得不到p对象对应的id值....
 58         //PhantomReference的唯一作用就是 能在这个对象被收集器回收时收到一个系统通知 看test4()方法
 59     }
 60     
 61     public static void test4(){
 62         
 63         //在堆中创建一个对象Obj
 64         //在栈中创建一个p来强引用此对象Obj
 65         Person p=new Person(1);
 66         
 67         //Phantom 幻影幽灵 的意思
 68         ReferenceQueue<Person> referenceQueue = new ReferenceQueue<Person>();
 69         //在栈中创建一个phantomReference来虚引用此对象Obj 不可以获取对象的属性值
 70         PhantomReference<Person> phantomReference=new PhantomReference<Person>(p,referenceQueue);
 71         
 72         System.out.println(referenceQueue.poll());//打印输出: null  这个是查询队列中是否有元素.
 73         
 74         //断开p和obj的强引用
 75         p=null;
 76         System.gc();//p被回收之后 队列referenceQueue中就有值了.
 77         
 78         try {
 79             Thread.sleep(1000);
 80         } catch (InterruptedException e) {
 81             e.printStackTrace();
 82         }//过 一秒钟之后再查询队列中是否有元素.
 83         System.out.println(referenceQueue.poll());//打印输出: java.lang.ref.PhantomReference@77fef1a0
 84         //PhantomReference的唯一作用就是 能在这个对象被收集器回收时收到一个系统通知 
 85         //如果这个对象被回收了,会把通知放到队列中.
 86         
 87         //如果前面p=null注释掉  再运行打印输出就是  null  因为p没有被回收(强引用中) 就不会把通知放到队列中...队列中为空 null
 88         //回收的标志就是把通知放到队列中..
 89     }
 90 }
 91 
 92 class Person{
 93     public Person(Integer id) {
 94         this.id = id;
 95     }
 96 
 97     private Integer id;
 98 
 99     public Integer getId() {
100         return id;
101     }
102 
103     public void setId(Integer id) {
104         this.id = id;
105     }
106 
107     @Override
108     protected void finalize() throws Throwable {
109         System.out.println("finalized!!!!!");
110     }
111 }
复制代码


本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/6682968.html,如需转载请自行联系原作者

相关文章:

springboot取yml中的值_SpringBoot 中从yml配置文件中读取常用的参数值

SpringBoot现在基本上都是使用application-XXX.yml(生产环境为pro&#xff0c;开发测试环境为dev)来配置项目中的一些配置条件&#xff0c;在springboot中还可以通过从yml文件中将yml中的数据直接读取出来。1.yml文件(这里设置参数的时候往往设置两层前缀&#xff0c;避免在调用…

用AI帮你找工作,领英是如何做的?

领英人工智能研发总监 张梁11 月 8-9 日&#xff0c;CSDN 和 AICamp 联合举办的AI开发者大会在京举行。领英&#xff08;LinkedIn&#xff09;人工智能研发总监张梁发表了《AI 在大规模招聘求职上的应用》的主题演讲&#xff0c;并接受了 AI科技大本营的专访。张梁在分享中表示…

Web APi之消息处理管道(五)

前言 MVC有一套请求处理的机制&#xff0c;当然Web API也有自己的一套消息处理管道&#xff0c;该消息处理管道贯穿始终都是通过HttpMessageHandler来完成。我们知道请求信息存在 RequestMessage 中&#xff0c;而响应信息则存在 ResponseMessage 中&#xff0c;当请求信息进入…

delphi 判断鼠标 左右_外设评测HyperX Pulsefire Haste游戏鼠标分享

HyperX家的外设产品我使用较多的是游戏耳机和键盘&#xff0c;鼠标给我的印象还停留在两年前的首款逆火鼠标上&#xff0c;倒不是说HyperX的鼠标不好&#xff0c;主要是我不喜欢太大、太重&#xff0c;以及扁平外型鼠标&#xff0c;以至于HyperX近年发布的几款鼠标都没能结缘。…

先发制人!Waymo将首推商用载人自动驾驶服务,Uber们怕不怕?

编译 | 费棋出品 | AI科技大本营“真的&#xff0c;真的很难。”在 11 月 13 日《华尔街日报》举办的一场会议上&#xff0c;Alphabet 旗下 Waymo CEO John Krafcik 对做自动驾驶汽车技术的艰难不无感慨。在他看来&#xff0c;未来几十年内&#xff0c;自动驾驶汽车将一直存在限…

如何进行绩效考核

这是项目管理书中的一段摘要&#xff0c;年底到了&#xff0c;在这里我把它发出来&#xff0c;希望能对各位即将进行绩效考核的项目经理有帮助。项目经理小赵最近有两个棘手的问题&#xff0c;第一个问题是测试小组有些人抖机灵&#xff0c;对一些他们认为不那么重要的测试用例…

欧盟剑指科技巨头,意欲上调税款

科技公司和税收之间的博弈&#xff0c; 在欧盟早已是一场台面上的战争。 雷锋网了解到&#xff0c;最近法国、德国、意大利和西班牙四国的的财政部长联名致信欧盟轮值主席和欧盟委员会&#xff0c;要求对科技巨头的收入征税&#xff0c;而不仅仅只是利润部分征税。 此外&#x…

mysql 5.7 编译_Mysql5.7版本编译安装及配置

配置yum安装方式1、配置本地yum源1 vim /etc/yum.repos.d/rhel-source.repo2 [rhel-source]3 nameRed Hat Enterprise Linux $releasever - $basearch -Source4 baseurlfile:///mnt5 enabled16 gpgcheck02、清除yum缓存yum clean all3、更新yum源yum update allyum安装 …

程序员,快通知你们老板上吴恩达的最新AI课

是的&#xff0c;吴恩达老师又出新的 AI 课程了&#xff0c;不愧是劳模中的劳模。新课程的名字叫 AI For Everyone&#xff0c;一听就知道不是特别的技术。因此&#xff0c;本课程也适用于商业人士&#xff0c;帮助他们理解如何建立可持续的 AI 战略。吴恩达老师说了&#xff0…

mysql分组和where条件查询_【MySQL】:分组查询where和having

分组查询之前学习聚合函数&#xff0c;知道聚合函数在默认情况下&#xff0c;将会把所有的记录当成一组&#xff0c;让我们在对列求值&#xff0c;计算时更方便了一些。但是&#xff0c;在某些情况下&#xff0c;我们需要显式地对记录进行分组&#xff0c;使用的是group by [co…

百度研究院再升级,迎来9位世界级科学家

美国时间11月13日&#xff0c;百度研究院在美国硅谷召开会议&#xff0c;宣布百度研究院顾问委员会正式成立&#xff0c;并宣布在2018年陆续迎来9位世界级科学家加盟。 新成立的百度研究院顾问委员会包含5名成员&#xff0c;包括AT&T和贝尔实验室前副总裁及首席科学家Davi…

《Linux From Scratch》第二部分:准备构建 第三章:软件包与补丁- 3.1. 简介

本章列出了一个需要下载的软件包列表&#xff0c;它们用来构建一个基本的 Linux 系统。所列出来的版本号对应着该软件的确定可以正常工作的版本&#xff0c;本书是以它们为基础的。我们强烈反对使用更新一些的版本&#xff0c;因为某个版本能用的编译指令可能并不适用于新版本。…

和老同事的谈话:关于职业生涯以及MDA

应该是bigtall在2007年度的最后一篇了&#xff0c;虽然2007年欠了大家很多帐&#xff0c;但是继续写应该是在2008年的事情了&#xff0c;很多时候非常有想法的东西&#xff0c;真正到落笔的时候&#xff0c;还是会发现欠缺许多东西&#xff0c;所以很多时候犹豫再三&#xff0c…

太嚣张了!会Python的人!

随着计算机语言的发展&#xff0c;Python也跻身于语言排行的常青树。在当下的人工智能浪潮中&#xff0c;Python可以说是C位出道&#xff0c;成功引起了大家的注意。国内不少大公司都已经在使用Python&#xff0c;如豆瓣、搜狐、金山、腾讯、盛大、网易、百度、阿里、淘宝、热酷…

Oracle笔记 六、PL/SQL简单语句块、变量定义

1、简单SQL语句&#xff0c;HellWorld示例 --输出信息 begin dbms_output.put_line(Oracle Hello World!); end; 2、变量的定义、使用 --定义变量 declare sName varchar2(20); begin sName : jack; dbms_output.put_line(sName); end; --常用类型 declare sNum number(1); sCo…

mysql 5.6 uf8mb4_MySQL5.7升级到8.0过程详解

前言&#xff1a;不知不觉&#xff0c;MySQL8.0已经发布好多个GA小版本了。目前互联网上也有很多关于MySQL8.0的内容了&#xff0c;MySQL8.0版本基本已到稳定期&#xff0c;相信很多小伙伴已经在接触8.0了。本篇文章主要介绍从5.7升级到8.0版本的过程及注意事项&#xff0c;有想…

modules黑名单

http://www.linuxsir.org/bbs/thread321140.html今天刚看了udev的资料&#xff0c;说可以用blacklist禁用掉&#xff0c;写在/etc/modules.d/blacklist中&#xff0c;如&#xff1a;blacklist pcspkrblacklist via_agp更多的内容&#xff0c;还是看udev的资料吧。modules.auto…

基于tcp和udp的socket实现

2019独角兽企业重金招聘Python工程师标准>>> 本文介绍如何用Java实现Socket编程。首先介绍Java针对Socket编程提供的类&#xff0c;以及它们之间的关系。然后分别针对TCP和UDP两种传输层协议实现Socket编程。 1 Java中的Socket编程接口介绍 Java为Socket编程封装了几…

mysql 5.7编译安装重启_mysql5.7源码编译安装

安装mysql前的准备&#xff1a;一、安装依赖的库&#xff1a;yum install gcc-c ncurses-devel perl-Data-Dumper python-devel openssl openssl-devel二、 安装cmake(因为mysql5.7的编译由cmake来实现)安装cmake&#xff1a;cd cmake-2.8.8/预编译和安装&#xff1a;./bootst…

公开课 | 详解CNN-pFSMN模型以及在语音识别中的应用

近年来&#xff0c;在深度学习技术的帮助下&#xff0c;语音识别取得了极大的进展&#xff0c;从实验室开始走向市场&#xff0c;走向实用化。基于语音识别技术的输入法、搜索和翻译等人机交互场景都有了广泛的应用。 Librispeech是当前衡量语音识别技术的最权威主流的开源数据…

属蛇人一生运势

一生总运势 巳年生人&#xff0c;其性稳和才智&#xff0c;好安排进退&#xff0c;甚喜交际。有高尚的品质&#xff0c;受朋友好评&#xff0c;但其内心常有阴毒与忌妒心&#xff0c;致难以保持永久交情&#xff0c;心情易造多疑之虑&#xff0c;而且好色&#xff0c;好与人争论…

mysql邮箱配置文件_SQL-数据库邮箱配置

一、启用数据库邮件手动启用数据库邮件功能&#xff0c;需执行以下脚本&#xff1a;exec sp_configure show advanced options,1RECONFIGUREexec sp_configure Database Mail XPs,1RECONFIGURE With Override二、配置数据库邮件1、启用配置向导如果事先没有手动启用数据库邮件功…

开源可视化日志分析软件-Gource

Gource可以将代码版本控制系统里面的日志全部可视化&#xff0c;也就是说可以看见每个成员在系统里面提交代码的行为&#xff0c;Gource目前支持git、hg、svn。 静态的图片看着不过瘾&#xff0c;下面我将录频的效果(gourcegltail)给大家分享&#xff1a; http://www.tudou.com…

AI入侵机械设计,苦逼的“机械狗”还有未来吗?

作者 | Loren Grush译者 | 刘旭坤编辑 | 非主流出品 | AI科技大本营近几年&#xff0c;机械行业的平均薪资一直被 IT 碾压&#xff0c;更不用说 IT 行业里炙手可热的人工智能。现如今&#xff0c;AI 一路攻城略地&#xff0c;已经深入里很多行业和领域&#xff0c;其中就包括制…

[MySQL FAQ]系列 -- mysql是否支持跨库事务

作/译者&#xff1a;叶金荣&#xff08;Email: &#xff09;&#xff0c;来源&#xff1a;http://imysql.cn&#xff0c;转载请注明作/译者和出处&#xff0c;并且不能用于商业用途&#xff0c;违者必究。是可以支持的&#xff0c;例如这么用&#xff1a;start transaction; in…

docker 基本操作Ⅲ

1 数据卷备份恢复 - 我们一般用的最多的是把容器和本地宿主机做目录映射直接存在本地&#xff0c;但是还有一种就是数据卷的备份与恢复&#xff0c;如下就来介绍&#xff1a; 先来一副图来了解一下数据卷的恢复与备份 宿主机也就是我们的服务器分享一个/data/backup/ 目录&…

jquery操作mysql_使用jQuery从数据库访问对象

[{“日期”:“2019-02-10”,“诉状”:1},{“日期”:“2019-02-12”,“诉状”:1},{“日期”:“2019-02-14”,“诉状”:1}]我可以通过Jquery代码轻松地访问它// AJAX Request to get the data by UserID and Week 1$.get(/dashboard/performance?name document.getElementById(…

中国AI专利申请量超美国,百度居国内首位

整理 | 非主流本文数据来自《人工智能技术专利深度分析报告》随着人工智能成为新一轮科技革命和产业变革的重要驱动力量&#xff0c;AI 成为科技企业研发重点&#xff0c;专利申请量也在逐年提升。中国专利保护协会近日发布的《人工智能技术专利深度分析报告》显示&#xff0c;…

MySQL数据库中文模糊检索问题

我在这里谈一下 MYSQL的中文模糊搜索。我的MYSQL版本。version()5.1.22-rc-community-log这里用到的表&#xff1a;Table Create Table ------ -------------------------------------------------------a1 CREATE TABLE a1…

最新Python学习项目Top10!

作者 | Mybridge译者 | Linstancy整理 | Jane出品 | AI科技大本营【导读】过去一个月里&#xff0c;我们对近1000个Python 学习项目进行了排名&#xff0c;并挑选出热度前10的项目。这份清单涵盖了包括Web App, Geospatial Data, Time Paradox, Testing in Python, Crash repor…