015. 深入JVM学习—Java引用类型

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1. 引用类型划分


  1. 强引用:当内存不足时,JVM宁可出现“OutOfMemoryError”错误停止,也需要进行保存,并且不会将此空间回收。

  2. 软引用:当内存不足的时候,进行对象的回收处理,往往用于高速缓存中。

  3. 弱引用:不管内存是否紧张,只要有垃圾产生,立即回收。

  4. 幽灵引用(虚引用):和没有引用是一样的。

2. 强引用


1. 简单介绍

  • 强引用是JVM默认的支持模式,即:在引用的期间内,如果该堆内存被指定的栈内存有联系,那么该对象就无法被GC所回收,而一旦出现内存空间不足,就会出现“OutOfMemoryError”。

2. 范例:观察强引用

  • 测试代码

    public class TestDemo {public static void main(String[] args) {Object obj = new Object(); // 强引用,默认的支持Object ref = obj; // 引用传递obj = null; // 断开了一个连接System.gc();System.out.println(ref);}
    }
    
  • 终端命令

    > javac TestDemo.java
    > java TestDemo
    
  • 结果

    java.lang.Object@15db9742
    
  • 结论

    • 此时如果对象堆内存有栈内存的指向,那么该对象将无法被GC回收。
    • 强引用是我们一直在使用的模式,并且也是以后的开发中主要的使用模式,因为强引用有这样的内存分配异常问题,所以开发原则是尽量少实例化对象。

3. 软引用


1. 简单介绍

  • 在很多的开源组件之中,往往会使用软引用作为缓存组件出现,其最大的特点:内存不足时回收,充足时不回收。

  • 想实现软引用需要单独的一个类来实现控制:java.lang.ref.SoftReference

2. 范例:观察软引用

  • 测试代码:

    import java.lang.ref.SoftReference;public class TestDemo {public static void main(String[] args) {Object obj = new Object();SoftReference<Object> ref = new SoftReference<Object>(obj); // 软引用obj = null; // 断开连接System.gc();System.out.println(ref.get());}
    }
    
  • 终端命令

    > javac TestDemo.java
    > java TestDemo
    
  • 结果

    java.lang.Object@15db9742
    
  • 结论

    • 软引用在内存不紧张的情况下不会被回收。

3. 范例:观察内存紧张情况下的软引用

  • 测试代码

    import java.lang.ref.SoftReference;public class TestDemo {public static void main(String[] args) {Object obj = new Object();String str = "hello world !!!";SoftReference<Object> ref = new SoftReference<Object>(obj);obj = null;try {for (int i = 0; i < 10000; i++) {str += str;str.intern();}} catch (Throwable e) {}System.gc();System.out.println(ref.get());}
    }
    
  • 终端命令

    > javac TestDemo.java
    > java -Xmx10m -Xms10m TestDemo
    
  • 结果

    null
    
  • 结论

    • 软引用在内存紧张的情况下会被回收。

4. 弱引用


1. 简单介绍

  • 弱引用,只要一进行gc处理,那么所引用的对象将会立即被回收。弱引用需要使用的是Map接口的子类:java.util.WeakHashMap。

2. 范例:观察弱引用

  • 测试代码

    import java.lang.ref.SoftReference;
    import java.util.Map;
    import java.util.WeakHashMap;public class TestDemo {public static void main(String[] args) {String key = new String("shadowolf");String value = new String("www.shadowolf.cn");Map<String, String> map = new WeakHashMap<String, String>();map.put(key, value);System.out.println(map);key = null;System.out.println(map);System.gc();System.out.println(map);}
    }
    
  • 终端命令

    > javac TestDemo.java
    > java TestDemo
    
  • 结果

    {shadowolf=www.shadowolf.cn}
    {shadowolf=www.shadowolf.cn}
    {}
    
  • 结论

    • 一旦出现GC,则必须进行回收处理,并且一回收一个准。

3. 范例:观察 java.lang.ref.WeakReference

  • 测试代码

    import java.lang.ref.SoftReference;
    import java.lang.ref.WeakReference;
    import java.util.Map;
    import java.util.WeakHashMap;public class TestDemo {public static void main(String[] args) {String key = new String("shadowolf");WeakReference<String> ref = new WeakReference<String>(key);System.out.println(ref.get());key = null;System.out.println(ref.get());System.gc();System.out.println(ref.get());}
    }
    
  • 终端命令

    > javac TestDemo.java
    > java TestDemo
    
  • 结果

    shadowolf
    shadowolf
    null
    

5. 引用队列


1. 简单介绍

  • 引用队列保存那些准备被回收的对象。很多时候所有的对象的回收扫描都是从根对象开始的,那么对于整个GC而言,如果要想确定哪些对象可以被回收,就必须确定好引用的强度,这个也就是所谓的引用路径的设置。

2. 引用队列的操作流程

引用队列操作流程

  1. 单条引用路径的可及性判断:在这条路径上,最弱的一个引用决定对象的可及性。

  2. 多条引用路径的可及性判断:在这几条路径上,最强的一个引用决定对象的可及性。

  3. 例如:如果要找到对象5,那么1找到5属于“强 + 软”,2找到5属于“强 + 弱”。软引用比弱引用保存的强。所以这个时候对于对象的引用而言,如果要进行引用关联的判断,那么就必须找到强关联,为了避免非强引用对象所带来的内存引用问题,所以提供引用队列的概念。如果在创建一个软引用或弱引用对象使用了引用队列的方式,那么这个对象在回收之后会自动保存到引用队列之中。

3. 范例:使用引用队列

  • 测试代码

    import java.lang.ref.ReferenceQueue;
    import java.lang.ref.WeakReference;public class TestDemo {public static void main(String[] args) throws Exception {Object obj = new Object();ReferenceQueue<Object> queue = new ReferenceQueue<Object>();WeakReference<Object> ref =new WeakReference<Object>(obj, queue);System.out.println(queue.poll());obj = null;System.gc();Thread.sleep(100); // 保存引用队列需要点时间System.out.println(queue.poll());}
    }
    
  • 终端命令

    > javac TestDemo.java
    > java TestDemo
    
  • 结果

    null
    java.lang.ref.WeakReference@15db9742
    
  • 结论

    • 被回收的弱引用对象被保存到了引用队列中。
    • 引用队列主要做一些被回收对象的控制。

6. 幽灵引用(虚引用)


1. 简单介绍

  • 永远取得不了的数据就叫幽灵引用。

2. 范例:观察幽灵引用

  • 测试代码

    import java.lang.ref.PhantomReference;
    import java.lang.ref.ReferenceQueue;public class TestDemo {public static void main(String[] args) throws Exception {Object obj = new Object();ReferenceQueue<Object> queue = new ReferenceQueue<Object>();PhantomReference<Object> ref = new PhantomReference<Object>(obj, queue);System.gc();System.out.println(ref.get());System.out.println(queue.poll());}
    }
    
  • 终端命令

    > javac TestDemo.java
    > java TestDemo
    
  • 结果

    null
    null
    
  • 结论

    • 所有保存在幽灵引用类型中的数据都不会真正的保留。

转载于:https://my.oschina.net/shadowolf/blog/1837258

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/538386.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

表正在被别的用户或进程使用_linux内核对进程的管理分为两个方面

嵌入式开发直播课 - linux内核通知链 - 创客学院直播室​www.makeru.com.cn众所周知&#xff0c;现在的分时操作系统能够在一个CPU上运行多个程序&#xff0c;让这些程序表面上看起来是在同时运行的。linux就是这样的一个操作系统。在linux系统中&#xff0c;每个被运行的程序实…

android studio生成签名导打包的方法

原文链接&#xff1a;http://blog.csdn.net/l_215851356/article/details/69914213 ---------------------------------如果图片失效了&#xff0c;见有道云笔记------------------- 方法一&#xff1a; 在android中。可以非常快速的生成签名文件.jsk文件。步骤如下&#xff1…

vbs脚本延时_Wincc的脚本进程执行问题

接到某同事B的电话&#xff0c;说是一段Wincc里面的VBS脚本出现了问题&#xff1a;A按钮和B按钮&#xff0c;要求A按钮点击后&#xff0c;对plc某变量写1并等待5s后写0&#xff0c;在这5s期间如果点击B按钮&#xff0c;同样是对另外一个变量如此操作&#xff0c;则plc在5s内检测…

微信小程序 - 非Form数据怎么发送到后端?

通过设置异步缓存&#xff0c;就可以做到 wx.setStorageSync(imgs,imglist); 最后的提交信息&#xff1a;

DjangoAdmin站点调整列表页展示

调整列表页展示 1 页大小 每页中显示多少条数据&#xff0c;默认为每页显示100条数据&#xff0c;属性如下&#xff1a; list_per_page1001&#xff09;打开booktest/admin.py文件&#xff0c;修改AreaAdmin类如下&#xff1a; class BookInfoAdmin(admin.ModelAdmin):list_per…

大华热成像netsdkdemo_千年博物,智慧展馆丨大华股份全力守护“华夏珍宝库”...

陕西历史博物馆作为我国第一座大型现代化国家级博物馆&#xff0c;以及首批国家一级博物馆和全国排名前五的国家顶级博物馆&#xff0c;被誉为“古都明珠 华夏宝库”&#xff0c;是讲述五千年中华文化的大学堂&#xff0c;是我国博物馆事业发展的重要里程碑。随着陕西历史博物馆…

最新php常用函数200个,180多个PHP常用函数总结

我们知道任何有效的 php 代码都有可能出现在函数内部&#xff0c;甚至包括其它函数和类定义。本文我们主要和大家分享180多个PHP常用函数总结&#xff0c;希望能帮助大家更高效的学习PHP。数学函数1.abs(): 求绝对值$abs abs(-4.2); //4.211输入: 数字输出: 绝对值数字2.ceil(…

Markdown 使用教程

前言 以前经常在 github 中看到 .md 格式的文件&#xff0c;一直没有注意&#xff0c;也不明白为什么文本文档的后缀不是 .txt ,后来无意中看到了 Markdown&#xff0c;看到了用这个东西写得一些web界面等特别的规整漂亮&#xff0c;顿时不明觉厉。后来自己学习了一下&#xff…

wdm设备驱动程序开发pdf_DWDM是什么 DWDM相关设备功能介绍【图文】

WDM/DWDM技术,什么是WDM/DWDM技术波分复用(WDM)是将两种或多种不同波长的光载波信号(携带各种信息)在发送端经复用器(亦称合波器&#xff0c;Multiplexer)汇合在一起&#xff0c;并耦合到光线路的同一根光纤中进行传输的技术;在接收端&#xff0c;经解复用器(亦称分波器或称去复…

团队作业8—团队项目用户验收评审

一、源代码管理的10 个实践问题&#xff1a; 1. 你的团队的源代码控制在哪里&#xff1f;用的是什么系统&#xff1f;如何处理文件的锁定问题&#xff1f; 我们团队项目的源代码在GitHub上托管&#xff0c;用git控制代码版本&#xff0c;我们用的是win10系统。在这个项目上&…

Android中已经添加权限,依然提示缺少权限,此时你需要添加动态权限

原文链接&#xff1a;http://blog.csdn.net/android_hdh/article/details/52583557 ------------------------------- 最近在开发项目时&#xff0c;项目需要获取系统的WRITE_EXTERNAL_STORAGE权限&#xff0c;然后就在清单文件AndroidManifest中添加了该权限&#xff0c;但是…

linux php任务计划,linux系统怎么添加计划任务执行php文件

linux系统怎么添加计划任务执行php文件linux系统怎么添加计划任务执行php文件?PHP不支持多线程,有时候处理问题不是那么爽,小编以php文件为例&#xff0c;讲解linux下的计划任务。linux系统添加计划任务执行php文件方法1.打开linux系统命令行界面。在命令行界面中输入如下命令…

windows server 2008 r2 定时关机_电脑怎么定时关机 秒懂的Win10定时关机命令使用方法...

Win10怎么定时关机&#xff1f;今天芝麻科技网教大家3种Win10定时关机方法&#xff0c;包含用命令定时关机、软件以及杀毒工具定时关机等&#xff0c;也适合XP、Win7和Win8等系统&#xff0c;相信对于一些如夜间下载东西或者大文件&#xff0c;挂机等用户有所帮助。方法一&…

Android-循环访问网站App

网优同事的突然需求。 花了1天开发了出来。 App截图 App操作流程 1、赋值要循环访问网站的地址 2、设置每次循环间隔时间和每次访问间隔时间 3、点击按钮开始访问 下载地址&#xff1a;https://download.csdn.net/download/zengmingen/9983519

与专门团队一起持续交付

BCG Digital Ventures的首席工程师Robin Weston 最近在伦敦持续生命周期大会&#xff08;Continuous Lifecycle London&#xff09;上发布了一份经验报告&#xff0c;在该报告中称&#xff0c;外部支持团队能够在难以实施变化的组织和封闭的团队中引入持续交付(CD)实践。该团队…

windows版一键绕id工具_Windows免费版一键绕过IOS13.6激活锁工具XgRiNdA,完美重启!...

支持iOS13.6.1系统&#xff0c;支持iPhone、iPad绕过&#xff0c;支持MEID三网、两网GSM机器&#xff0c;只要一键就可以绕过&#xff0c;可以完美关机重启&#xff0c;并且支持iTunes同步、爱思安装软件。新版本&#xff1a;增加屏幕锁/停用绕过解信号功能、新增12.4~13.2.3绕…

Could not find artifact

用Maven install 对父工程安装到本地仓库

uart怎么判断帧错误_UART通讯总线工作原理的理解

奥的斯电梯OCSS/LCBII /TCBC/GECB板与电梯轿厢和电梯井道之间的串行通讯采用了UART通讯&#xff0c;将井道和轿厢的输入、输出和开关部件的信号转换成串行通讯信号传输给电梯操作控制系统&#xff0c;大大节省了现场布线&#xff0c;下面就UART通讯总线工作原理的理解予以描述。…

matlab 光谱噪声,环境小卫星高光谱影像条纹噪声去除程序IDL版

前言源代码PRO stripe_remove1ENVI,/Restore_Base_Save_FilesENVI_Batch_initfile DIALOG_PICKFILE(/READ, FILTER *.img)print,fileENVI_OPEN_FILE,file,r_fidfidENVI_FILE_QUERY, fid, dimsdims, nsns, nlnl, nbnbprint,fid,dims,ns,nl,nbfdata fltarr(ns,nl,nb)datafltar…

启动TOMCAT报错 java.util.zip.ZipException: invalid LOC header (bad signature)

报错信息大致如下所示&#xff1a; at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)at java.lang.reflect.Method.invoke(Unknown Source)at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:303)at org.apache.catalina.startup.Bootstrap.…