Java的四种引用,强弱软虚,用到的场景(转+补充)

Q1:引用队列是什么?如何使用?使用的场景有哪些?

A1:oracle的api文档的描述:

https://docs.oracle.com/javase/7/docs/api/java/lang/ref/ReferenceQueue.htmlReference queues, to which registered reference objects are appended by the garbage collector after the appropriate reachability changes are detected.

当对象的可及性的改变被GC发现时,与之相关联的(registered)的reference object会被加入该队列。

 

Q2:java的heap是什么?

A2:如图所示,Heap和Stack分别负责存储不同类型的数据。

Stack区用于存储基本数据类型和对象的引用;而Heap区存储对象的实例。

Stack区的读写很快但缺点是数据的生存期和大小都是固定的,而Heap则可以动态申请内存。

具体内容很多,以后单独写上。

 “java heap stack”的图片搜索结果

在Java里, 当一个对象o被创建时, 它被放在Heap里. 当GC运行的时候, 如果发现没有任何引用指向o, o就会被回收以腾出内存空间. 或者换句话说, 一个对象被回收, 必须满足两个条件:

  1. 没有任何引用指向它
  2. GC被运行.

 

强引用:

 

强引用不会被GC回收,并且在java.lang.ref里也没有实际的对应类型,平时工作接触的最多的就是强引用。Object obj = new Object();这里的obj引用便是一个强引用。如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。  当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。

 

软引用:如果一个对象只具有软引用,那就类似于可有可物的生活用品。如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。

 

弱引用:

 

弱引用(weak reference)在强度上弱于软引用,通过类WeakReference来表示。它的作用是引用一个对象,但是并不阻止该对象被回收。如果使用一个强引用的话,只要该引用存在,那么被引用的对象是不能被回收的。弱引用则没有这个问题。在垃圾回收器运行的时候,如果一个对象的所有引用都是弱引用的话,该对象会被回收。弱引用的作用在于解决强引用所带来的对象之间在存活时间上的耦合关系。弱引用最常见的用处是在集合类中,尤其在哈希表中。哈希表的接口允许使用任何Java对象作为键来使用。当一个键值对被放入到哈希表中之后,哈希表对象本身就有了对这些键和值对象的引用。如果这种引用是强引用的话,那么只要哈希表对象本身还存活,其中所包含的键和值对象是不会被回收的。如果某个存活时间很长的哈希表中包含的键值对很多,最终就有可能消耗掉JVM中全部的内存。

 

对于这种情况的解决办法就是使用弱引用来引用这些对象,这样哈希表中的键和值对象都能被垃圾回收。Java中提供了WeakHashMap来满足这一常见需求。

 

虚引用:

 

在介绍幽灵引用之前,要先介绍Java提供的对象终止化机制finalization)。在Object类里面有个finalize方法,其设计的初衷是在一个对象被真正回收之前,可以用来执行一些清理的工作。因为Java并没有提供类似C++的析构函数一样的机制,就通过 finalize方法来实现。但是问题在于垃圾回收器的运行时间是不固定的,所以这些清理工作的实际运行时间也是不能预知的。幽灵引用(phantom reference)可以解决这个问题。在创建幽灵引用PhantomReference的时候必须要指定一个引用队列。当一个对象的finalize方法已经被调用了之后,这个对象的幽灵引用会被加入到队列中。通过检查该队列里面的内容就知道一个对象是不是已经准备要被回收了。

 

幽灵引用及其队列的使用情况并不多见,主要用来实现比较精细的内存使用控制,这对于移动设备来说是很有意义的。程序可以在确定一个对象要被回收之后,再申请内存创建新的对象。通过这种方式可以使得程序所消耗的内存维持在一个相对较低的数量。

 

 

相关链接:

http://blog.csdn.net/weizaishouex2010/article/details/49002913

http://stackoverflow.com/questions/14450538/using-javas-referencequeue(stackoverflow上讲的弱引用和引用队列的应用场景)

转载于:https://www.cnblogs.com/Russel/p/5944735.html

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

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

相关文章

C# lambda表达式与匿名方法

文章目录匿名方法Lambda表达式实例实例博主写作不容易,孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 C#中的匿名方法是在C#2.0引入的,它终结了声明委托的唯一方法是使用命名方法的时代。在C#更高版本中,Lambda表达式取代了匿名方法&a…

LINUx打包命令汇总

.tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) ——————————————— .gz 解压1:gunzip FileName.gz 解压2:…

常用的相似度计算

在数据分析和数据挖掘的过程中,我们经常需要知道个体间差异的大小,进而评价个体的相似性和类别。最常见的是数据分析中的相关分析,数据挖掘中的分 类和聚类算法,如K最近邻(KNN)和K均值(K-Means&…

玩转C#窗体-属性、方法和事件详细说明

文章目录简介Windows窗体的基本属性一、布局属性1、StartPosition属性2、Location属性3、尺寸属性4、WindowsState属性5、Autoscroll属性6、AutoSize属性二、样式属性1、ControlBox属性2、MaximizeBox属性3、MinimizeBox属性4、HelpButton属性5、ShowIcon属性6、Icon属性7、Sho…

for循环和数组练习

//公鸡2文&#xff0c;母鸡1文&#xff0c;小鸡半文&#xff0c;每种至少一只&#xff0c;100文买100只鸡有多少种可能var ci 0; for(var g1;g<50;g){for(var m1;m<100;m){for(var x1;x<100;x){if(g*2m*1x*(0.5)100&&gmx100){ci1;console.log("买公鸡&qu…

CMD下查看路由表

在cmd下面输入route print 就可以查看路由表 如何读懂路由表如何读懂路由表 源码:--------------------------------------------------------------------------------Active Routes: Network Destination Netmask Gateway Interface M…

c# automapper 使用

一、最简单的用法 有两个类User和UserDto 1 public class User2 {3 public int Id { get; set; }4 public string Name { get; set; }5 public int Age { get; set; }6 }7 8 public class UserDto9 { 10 public string Na…

js正则归纳

/* * 正则的缓存区 * 一、 var numadb1122;var reg/(\d)\1(\d)\2/gi;console.log(num.match(reg));//[ 1122 ]二、普通字符&#xff1a;a b c 1 2 3 特殊字符&#xff1a;\d \w \D //w d 是什么三、元字符中限定符* &#xff1a; 匹配0到多 &#xff1a; 匹配1到…

洛谷 P1469 找筷子

题目描述 经过一段时间的紧张筹备&#xff0c;电脑小组的“RP餐厅”终于开业了&#xff0c;这天&#xff0c;经理LXC接到了一个定餐大单&#xff0c;可把大家乐坏了&#xff01;员工们齐心协力按要求准备好了套餐正准备派送时&#xff0c;突然碰到一个棘手的问题&#xff0c;筷…

玩转C#控件-常用控件属性

文章目录概述Control类的基本属性1、Name属性2、Text属性3、Anchor属性4、Dock属性Control类的方法和事件博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 概述 控件是包含在窗体上的对象&#xff0c;是构成用户界面的基本元素&#xff0c;也是…

LazyT 提供对延迟初始化的支持

延迟初始化 就是在第一次使用的时候在 进行类的初始化 public class Student{public Student(){this.Name "DefaultName";this.Age 0;Console.WriteLine("Student is init...");}public string Name { get; set; }public int Age { get; set; }} public…

264标准中高复杂度的三方面

一、运功估计搜索 二、码率控制 三、滤波算法 在264中&#xff0c;这三方面占据了绝大部分的计算复杂度。具体原因或是优化的具体步骤有时间补上。

ie浏览器不支持多行隐藏显示省略号

平时在写页面过程中&#xff0c;相信大家都遇到过文本显示多行后用省略号代替的问题&#xff0c;来看看代码&#xff1a; p{display: -webkit-box;overflow: hidden;text-overflow: ellipsis;-webkit-line-clamp:12;//表示显示12行之后用省略号代替-webkit-box-orient:vertical…

API设计原则 - Qt官网的设计实践总结

原文链接&#xff1a;API Design Principles - Qt Wiki 基于Gary的影响力上 Gary Gao 的译文稿&#xff1a;C的API设计指导 译文发在酷壳 - CoolShell&#xff1a;API设计原则&#xff0c; 2017-07-25 API设计原则 - Qt官网的设计实践总结 &#x1f34e; 译序 Qt的设计水准在业…

python带参装饰器的改良版

简单点就是这种 def deco2(param1):def _deco2(fun):def __deco2(*args, **kwargs):print (param)fun(*args, **kwargs)return __deco2return _deco2deco2 # 错误的写法 def f2(strx):print (strx)f2(hello) 运行上面这个&#xff0c;期待打印1和hello 实际上是不…

H.264边缘块进行帧内预测时,上边缘和左边缘块的预测情况。

仅仅介绍上边缘块需要用到上面的像素&#xff08;不存在&#xff09;&#xff08;例如垂直模式&#xff09;&#xff0c;左边缘快需要用到左边的像素&#xff08;不存在&#xff09;&#xff08;例如水平模式&#xff09;的情况。 H.264 I帧边缘块的处理 I帧的第一个左上的边缘…

P1021 邮票面值设计

P1021 邮票面值设计 题目描述 给定一个信封&#xff0c;最多只允许粘贴N张邮票&#xff0c;计算在给定K&#xff08;NK≤15&#xff09;种邮票的情况下&#xff08;假定所有的邮票数量都足够&#xff09;&#xff0c;如何设计邮票的面值&#xff0c;能得到最大值MAX&#xff0c…

第七章:XAML vs. code(3)

属性元素语法这里有一些C&#xff03;与第4章中的FramedText代码相似。在一个语句中&#xff0c;它实例化一个Frame和一个Label&#xff0c;并将Label设置为Frame的Content属性&#xff1a; new Frame {OutlineColor Color.Accent,HorizontalOptions LayoutOptions.Center,Ve…

QtCreator5.12.6安装图文教程

前言接触过Qt的同学肯定用过QtCreator,本id最近常用&#xff0c;也就写个教程记录一下安装的过程。可能比较少人学过Qt&#xff0c;感觉Qt还是挺不错的&#xff0c;做出来的界面还算好看&#xff0c;关键是跨平台。说明&#xff1a;安装的系统&#xff1a;win10专业版QtCreator…

H.264学习(一)——帧和场的概念

一、何谓场&#xff1f; 每个电视帧都是通过扫描屏幕两次而产生的&#xff0c;第二个扫描的线条刚好填满第一次扫描所留下的缝隙。每个扫描即称为一个场。因此 25 帧/秒的电视画面实际上为 50 场/秒 (若为 NTSC 则分别为 30 & 60 - 因为我是中国人&#xff0c;因此我采用 P…