首页 技术 正文
技术 2022年11月11日
0 收藏 375 点赞 3,508 浏览 1340 个字

之前在看深入理解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),所以软引用所指对象被最终收回。果然软引用存活时间够长,只有堆内存足够。

上一篇: .NET笔记(一)
下一篇: Java中的弱引用
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,501
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,915
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,748
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,505
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,143
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,306