java中的强引用(Strong reference),软引用(SoftReference),弱引用(WeakReference),虚引用(PhantomReference)
之前在看深入理解Java虚拟机一书中第一次接触相关名词,但是并不理解,只知道Object obj = new Object()类似这种操作的时候,obj就是强引用。强引用不会被gc回收直到gc roots不可达时。而对其他三个名词并不清楚,因为并没有被真正使用过。通过查看软引用,弱引用和虚引用的源码,可以看出这三个类都是继承自Reference。
一 概念
1.1软引用(SoftReference)
我理解的软引用的意思是,即使引用对象没有被使用了,gc也不会马上回收,而是只有当堆内存空间不够时才会回收。一般用于缓存对象,因为希望在内存中保留的越久越好。软引用所指向的引用对象停留在堆内存的时间由当前可用堆内存的大小来控制。软引用中有两个字段:clock和timestamp。clock记录初始化或gc的时间,而get引用对象时会更新timestamp与clock时间一致。如果clock和timestamp的间隔时间超过maxInternal,则认为该引用对象很久没有使用是时候回收该引用对象,否则会继续存在。maxInternal的时间有当前可用堆内存大小决定。具体jvm源码可以参考:https://mp.weixin.qq.com/s/pPXNeUI57GD-YnnfQWGXbg
1.2弱引用 (WeakReference)
弱引用的意思是如果引用对象gc roots不可达,gc就会进行回收。get操作可能返回引用对象(如果没有gc),否则返回空。
1.3虚引用 (PhantomReference)
虚引用不能返回引用对象,因为get操作返回的一直是null,感觉就是一个虚无缥缈的引用,所以这是称之为虚引用的原因吧。
二 实例
构造一个对象TestObj,它的大小为1M对一点。
JVM参数设置:
-Xms8M 初始堆大小
-Xmx8M 堆的最大值
-Xmn4M 年轻代的大小
-XX:+PrintGCDetails
-XX:SurvivorRatio=8 eden:survivor的比列为8:1
第一种情况:
gc过程:
分析:
Eden:3072k, from:512k, to:512k, ParOldGen:4096k
调用System.gc的时候对象强引用还存在,所以三个引用对象会进入到老年代。
第二种情况:
gc过程:
分析:
由于此时年轻代不能再分配一个1M多的空间,而老年代也放不下,所以会发生full gc, 弱引用和虚引用的对象会被回收,而软引用还存在。cost[0],cost[1]进入老年代,而此时年轻代应该只有一个cost[2]对象,为什么会占据eden:3072k空间的69%呢,这让人很疑惑???
第三种情况:
gc过程:
分析:
由于eden:3072k的空间已经被使用了69%,所以不能在放下一个1M的对象,只能full gc(当准备要触发一次young GC时,如果发现统计数据说之前young GC的平均晋升大小比目前old gen剩余的空间大,则不会触发young GC而是转为触发full GC。full gc 和 young gc关系参考:https://www.zhihu.com/question/41922036/answer/93079526),所以软引用所指对象被最终收回。果然软引用存活时间够长,只有堆内存足够。
java中的强引用(Strong reference),软引用(SoftReference),弱引用(WeakReference),虚引用(PhantomReference)的更多相关文章
- 【Java思考】Java 中的实参与形参之间的传递到底是值传递还是引用传递呢?
科普: 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数. 引用传递(pass by reference)是指在 ...
- Java中的强引用,软引用,弱引用
作者:winterSunshine链接:https://www.zhihu.com/question/37401125/answer/100981172来源:知乎著作权归作者所有.商业转载请联系作者获 ...
- java中的强引用、软引用、弱引用、虚引用
1.强引用(Strong Reference):指程序代码中普遍存在的,类似“Object obj = new Object()”这类的引用,只要对象存在强引用关联,JVM必定不会回收这个对象: 2. ...
- java中的强,软,弱,虚引用
引用的应用场景 我们都知道垃圾回收器会回收符合回收条件的对象的内存,但并不是所有的程序员都知道回收条件取决于指向该对象的引用类型.这正是Java中弱引用和软引用的主要区别. 如果一个对象只有弱引用指向 ...
- java 中 Cannot make a static reference to the non-static 解决方法
今天敲代码的时候遇到了这个问题,大体这个问题可以简化成这样: public class Test1 { public String get() { return "123"; } ...
- Java中的强引用和弱引用
旭日Follow_24 的CSDN 博客 ,全文地址请点击: https://blog.csdn.net/xuri24/article/details/81114944 一.强引用 如下是强引用的经典 ...
- java中list强转为map类型
起因:读取数据库文件的测试用例,测试用例需要存放到一个map中,方便下次调用, 读取的内容返回的内容存放在一个list中,并且数据内容是key=value的形式,最开始使用切片方式,做了很多无用功,后 ...
- Java中弱引用、软引用、虚引用及强引用的区别
Java中弱引用VS软引用 Java中有如下四种类型的引用: 强引用(Strong Reference) 弱引用(WeakReference) 软引用(SoftReference) 虚引用(Phant ...
- Java中的四种引用(强引用、软引用、弱引用、虚引用)
以下内容摘自<深入理解Java虚拟机 JVM高级特性与最佳实践>第2版,强烈推荐没有看过的同学阅读,读完的感觉就是"原来学的都是些什么瘠薄东西(╯‵□′)╯︵┴─┴" ...
随机推荐
- 快来,我悄悄的给你说几个HashCode的破事。
这是why技术的第 72 篇原创文章 Hash冲突是怎么回事 在这个文章正式开始之前,先几句话把这个问题说清楚了:我们常说的 Hash 冲突到底是怎么回事? 直接上个图片: 你说你看到这个图片的时候想 ...
- NB-IoT技术适合在哪些场景应用
LPWAN,Low Power Wide Area Network,低功耗广域网.名字里就有它的两个最重要的特点:低功耗.广覆盖.目前比较主流的有:NB-IoT.LoRa.Sigfox.eMTC.NB ...
- PHP百度地图开发之距离计算的实例分享
/** * 计算两个坐标之间的距离(米) * @param float $fP1Lat 起点(纬度) * @param float $fP1Lon 起点(经度) * @param float $fP2 ...
- Spring框架之beans源码完全解析
导读:Spring可以说是Java企业开发里最重要的技术.而Spring两大核心IOC(Inversion of Control控制反转)和AOP(Aspect Oriented Programmin ...
- hadoop使用实例
一.词频统计 1.下载喜欢的电子书或大量文本数据,并保存在本地文本文件中 2.编写map与reduce函数 3.本地测试map与reduce 4.将文本数据上传至HDFS上 5.用hadoop str ...
- CSS换行和省略号
换行 原地址:https://www.cnblogs.com/meowcool/p/10130103.html //强制不换行 div{ white-space:nowrap; } //自动换行 di ...
- 用spring-retry注解自动触发重试方法
原文地址:https://www.jianshu.com/p/ee02d6125113 需求背景: 有些时候我们再调用一些第三方服务的时候,从第三方那边拉数据. 但是第三方服务不是100%稳定的,有些 ...
- VirtualBox 6 安装 CentOS 7
1 安装环境 windows7 Oracle VM VirtualBox 6.0.24 CentOS 7 2 VirtualBox 6 - 虚拟机软件 2.1 下载 Oracle VM Virtual ...
- 性能工具-mem
1.目前valgrind . memleak .free .top .ps 中vsz Rss . buddy. slab 这些用的比较多,一般用于处理内存紧张问题
- tcp 接收被动关闭 fin
void tcp_rcv_established(struct sock *sk, struct sk_buff *skb, const struct tcphdr *th, unsigned int ...