之前在看深入理解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)的更多相关文章

  1. 【Java思考】Java 中的实参与形参之间的传递到底是值传递还是引用传递呢?

    科普: 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数. 引用传递(pass by reference)是指在 ...

  2. Java中的强引用,软引用,弱引用

    作者:winterSunshine链接:https://www.zhihu.com/question/37401125/answer/100981172来源:知乎著作权归作者所有.商业转载请联系作者获 ...

  3. java中的强引用、软引用、弱引用、虚引用

    1.强引用(Strong Reference):指程序代码中普遍存在的,类似“Object obj = new Object()”这类的引用,只要对象存在强引用关联,JVM必定不会回收这个对象: 2. ...

  4. java中的强,软,弱,虚引用

    引用的应用场景 我们都知道垃圾回收器会回收符合回收条件的对象的内存,但并不是所有的程序员都知道回收条件取决于指向该对象的引用类型.这正是Java中弱引用和软引用的主要区别. 如果一个对象只有弱引用指向 ...

  5. java 中 Cannot make a static reference to the non-static 解决方法

    今天敲代码的时候遇到了这个问题,大体这个问题可以简化成这样: public class Test1 { public String get() { return "123"; } ...

  6. Java中的强引用和弱引用

    旭日Follow_24 的CSDN 博客 ,全文地址请点击: https://blog.csdn.net/xuri24/article/details/81114944 一.强引用 如下是强引用的经典 ...

  7. java中list强转为map类型

    起因:读取数据库文件的测试用例,测试用例需要存放到一个map中,方便下次调用, 读取的内容返回的内容存放在一个list中,并且数据内容是key=value的形式,最开始使用切片方式,做了很多无用功,后 ...

  8. Java中弱引用、软引用、虚引用及强引用的区别

    Java中弱引用VS软引用 Java中有如下四种类型的引用: 强引用(Strong Reference) 弱引用(WeakReference) 软引用(SoftReference) 虚引用(Phant ...

  9. Java中的四种引用(强引用、软引用、弱引用、虚引用)

    以下内容摘自<深入理解Java虚拟机 JVM高级特性与最佳实践>第2版,强烈推荐没有看过的同学阅读,读完的感觉就是"原来学的都是些什么瘠薄东西(╯‵□′)╯︵┴─┴" ...

随机推荐

  1. 用 Java 训练深度学习模型,原来可以这么简单!

    本文适合有 Java 基础的人群 作者:DJL-Keerthan&Lanking HelloGitHub 推出的<讲解开源项目> 系列.这一期是由亚马逊工程师:Keerthan V ...

  2. 购买GPRS DTU时应该怎么选择

    GPRS DTU如今是一种被广泛应用的物联网无线数据终端,主要是利用GPRS网络为用户提供无线长距离数据透传功能,在电力.环保.物流.气象等行业领域有着广泛应用.目前市场上的GPRS DTU产品眼花缭 ...

  3. @Transactional 注意事项、方法调用

    1.同一个类中,即A与B在同一类中,A()调用B()方法,A不加 @Transactional 事务注解,B加 @Transactional 事务注解,则B中的事务不起作用,A加事务,才会起作用,B中 ...

  4. Python爬虫练习(多线程,进程,协程抓取网页)

    详情点我跳转 关注公众号"轻松学编程"了解更多. 一.多线程抓取网页 流程:a.设置种子url b.获取区域列表 c.循环区域列表 d.创建线程获取页面数据 e.启动线程 impo ...

  5. #10053 L 语言

    L 语言 dalao 看来是水题?我可不这么认为. 很多人都写了我认为不怎么正确的贪心,那就是直接看到一个单词就减去. 那么这组数据就可以 hack 掉了: 2 1 whatis what whati ...

  6. Ros中创建msg和srv遇到的问题

    在创建msg和srv文件之后,使用srv和msg文件时候需要对xml文件进行修改,如下: <build_depend>message_generation</build_depend ...

  7. 关于ubuntu出现的一些问题的解决方法

    1. (1)现象: dpkg: 处理软件包 linux-image-4.15.0-36-generic (--configure)时出错: 子进程 已安装 post-installation 脚本 返 ...

  8. 谈谈对不同I/O模型的理解 (阻塞/非阻塞IO,同步/异步IO)

    一.关于I/O模型的问题 最近通过对ucore操作系统的学习,让我打开了操作系统内核这一黑盒子,与之前所学知识结合起来,解答了长久以来困扰我的关于I/O的一些问题. 1. 为什么redis能以单工作线 ...

  9. reids 入门

    1.reids 服务的安装有两种 1.1 exe文件安装,安装完成后,就直接在 "服务"列表中可以查看,并可以停止或启动 1.2 命令行安装:将文件解压至指定文件夹,CMD命令进入 ...

  10. Hadoop2.6伪分布式按照官网指点安装(1)

    参考:http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-common/SingleCluster.html 照抄:安装成功 ...