SoftReference一般可以用来创建缓存的,缓存我们经常使用,例如:我们在浏览器中浏览了一个网页后,点击跳转到新的网页,我们想回去看之前的网页,一般是点击回退按钮,那么这个时候之前的网页一般就是放在缓存中了。如果网页太多,有时候就会造成回不去的情形,这说明如果内存不够用了,就删除了这些缓存。

类似这种情形就可以用SoftReference来实现,SoftReference的GC机制是这样的,如果内存够用,它不会被GC,但如果内存不够用,且内存中的对象只被一个SoftRerence类型的引用指向的话(一个对象也可以被一个强引用和软引用同时指向),那么它就会被GC。

那么这个时候有一个疑问,如果用SoftReference引用指向的对象内部有强引用指向的复杂对象,那么当内存不足时的会如何处理呢?

看下面代码:

 1 import java.lang.ref.*;
 2
 3 public class Test {
 4
 5     static final int MB = 1024 * 1024;
 6
 7     byte[] b = new byte[4 * MB];
 8
 9     public static void main(String[] args) {
10
11         SoftReference<Test> test = new SoftReference<Test>(new Test());
12         // Test test = new Test();
13         byte[] c = new byte[4 * MB];
14     }
15 }

我们调整运行参数:

则个运行结果是:

 1 [GC [PSYoungGen: 313K->288K(2368K)] 4409K->4384K(7872K), 0.0006568 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
 2 [GC [PSYoungGen: 288K->288K(2368K)] 4384K->4384K(7872K), 0.0002187 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
 3 [Full GC [PSYoungGen: 288K->0K(2368K)] [PSOldGen: 4096K->4293K(5504K)] 4384K->4293K(7872K) [PSPermGen: 2952K->2952K(21248K)], 0.0029254 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
 4 [GC [PSYoungGen: 0K->0K(2368K)] 4293K->4293K(7872K), 0.0000939 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
 5 [Full GC [PSYoungGen: 0K->0K(2368K)] [PSOldGen: 4293K->192K(4544K)] 4293K->192K(6912K) [PSPermGen: 2952K->2949K(21248K)], 0.0033466 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
 6 Heap
 7  PSYoungGen      total 2368K, used 41K [0x000000000aed0000, 0x000000000b170000, 0x000000000b170000)
 8   eden space 2048K, 2% used [0x000000000aed0000,0x000000000aeda478,0x000000000b0d0000)
 9   from space 320K, 0% used [0x000000000b0d0000,0x000000000b0d0000,0x000000000b120000)
10   to   space 320K, 0% used [0x000000000b120000,0x000000000b120000,0x000000000b170000)
11  PSOldGen        total 4544K, used 4288K [0x000000000a970000, 0x000000000ade0000, 0x000000000aed0000)
12   object space 4544K, 94% used [0x000000000a970000,0x000000000ada00c8,0x000000000ade0000)
13  PSPermGen       total 21248K, used 2989K [0x0000000005570000, 0x0000000006a30000, 0x000000000a970000)
14   object space 21248K, 14% used [0x0000000005570000,0x000000000585b6f8,0x0000000006a30000)

虚拟机堆区大小被限制在7MB,然后分配了一个含有4MB的SoftReference类,然后当继续申请4MB堆区时,JVM就会回收掉test所指向的对象。

如果按下面这样去写代码,就会报出OutOfMemoryError。

import java.lang.ref.*;public class Test {static final int MB = 1024 * 1024;byte[] b = new byte[4 * MB];public static void main(String[] args) {//SoftReference<Test> test = new SoftReference<Test>(new Test());Test test = new Test();byte[] c = new byte[4 * MB];}
}

内纯回收日志:

[GC [PSYoungGen: 313K->272K(2368K)] 4409K->4368K(7872K), 0.0006490 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC [PSYoungGen: 272K->288K(2368K)] 4368K->4392K(7872K), 0.0001820 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC [PSYoungGen: 288K->0K(2368K)] [PSOldGen: 4104K->4296K(5504K)] 4392K->4296K(7872K) [PSPermGen: 2952K->2952K(21248K)], 0.0028587 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC [PSYoungGen: 0K->0K(2368K)] 4296K->4296K(7872K), 0.0001105 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC [PSYoungGen: 0K->0K(2368K)] [PSOldGen: 4296K->4288K(5504K)] 4296K->4288K(7872K) [PSPermGen: 2952K->2948K(21248K)], 0.0036936 secs] [Times: user=0.02 sys=0.00, real=0.00 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceat Test.main(Test.java:13)
HeapPSYoungGen      total 2368K, used 82K [0x000000000af70000, 0x000000000b210000, 0x000000000b210000)eden space 2048K, 4% used [0x000000000af70000,0x000000000af84868,0x000000000b170000)from space 320K, 0% used [0x000000000b170000,0x000000000b170000,0x000000000b1c0000)to   space 320K, 0% used [0x000000000b1c0000,0x000000000b1c0000,0x000000000b210000)PSOldGen        total 5504K, used 4288K [0x000000000aa10000, 0x000000000af70000, 0x000000000af70000)object space 5504K, 77% used [0x000000000aa10000,0x000000000ae400a8,0x000000000af70000)PSPermGen       total 21248K, used 2990K [0x0000000005610000, 0x0000000006ad0000, 0x000000000aa10000)object space 21248K, 14% used [0x0000000005610000,0x00000000058fbb60,0x0000000006ad0000)

转载于:https://www.cnblogs.com/chaiwentao/p/4773247.html

关于SoftReference的使用相关推荐

  1. SoftReference

    本文介绍对象的强.软.弱和虚引用的概念.应用及其在UML中的表示. 1.对象的强.软.弱和虚引用    在JDK 1.2曾经的版本号中,若一个对象不被不论什么变量引用,那么程序就无法再使用这个对象.也 ...

  2. SoftReference的用法

    本文介绍对象的强.软.弱和虚引用的概念.应用及其在UML中的表示. 1.对象的强.软.弱和虚引用    在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说 ...

  3. Android学习笔记之SoftReference软引用,弱引用WeakReference

    SoftReference可以用于bitmap缓存 WeakReference 可以用于handler 非静态内部类和匿名内部类容易造成内存泄漏 private Handler mRemoteHand ...

  4. Java 引用分类:StrongReference、SoftReference、WeakReference、PhantomReference

    一,定义 在Java中,引用的定义是:如果reference类型的数据中存储的数值代表的是另一块内存的起始地址,就称这块内存代表着一个引用.后面在JDK1.2开始,引用的概念被扩充,引用被分为强引用( ...

  5. java弱引用(WeakReference)和SoftReference的区别以及在android内存处理的作用

    http://mingnjintian-163-com.iteye.com/blog/1120472 weakReference一般用来防止内存泄漏,要保证内存被VM回收 softReference的 ...

  6. java中的softreference_Java中的SoftReference和WeakReference有什么区别?

    问题 Java中的SoftReference和WeakReference有什么区别?它们有什么不同? #1 热门回答(806 赞) 弱引用弱引用,简单地说,是一个不足以强制对象保留在内存中的引用.弱引 ...

  7. SoftReference和WeakReference

    Java2增强了内存管理功能, 增加了一个java.lang.ref包,其中定义了三种引用类.这三种引用类分别为SoftReference.WeakReference和PhantomReference ...

  8. weakreference_Java中WeakReference,SoftReference,PhantomReference和Strong Reference之间的区别...

    weakreference 很长一段时间以来,WeakReference和SoftReference都已添加到Java API中,但是并不是每个Java程序员都熟悉它. 这意味着在Java中使用Wea ...

  9. Java中WeakReference,SoftReference,PhantomReference和Strong Reference之间的区别

    很长一段时间以来,WeakReference和SoftReference都已添加到Java API中,但是并不是每个Java程序员都熟悉它. 这意味着在Java中使用WeakReference和Sof ...

  10. WeakReference与SoftReference

    WeakReference与SoftReference都可以用来保存对象的实例引用,这两个类与垃圾回收有关. WeakReference是弱引用,其中保存的对象实例可以被GC回收掉.这个类通常用于在某 ...

最新文章

  1. RabbitMQ 延迟队列实现定时任务的正确姿势,你学会了么?
  2. AtCoder AGC034D Manhattan Max Matching (网络流)
  3. php实现享元模式,php设计模式 flyweight (享元模式)
  4. 计算机主机主要构成,台式电脑主机的硬件组成部分简介
  5. 今晚8点直播丨 经典知识库:性能优化那些事
  6. 马斯克与SEC再次达成和解协议 未被罚款也未被削权
  7. 源代码加密几种简单方法
  8. retrofit 响应时间_HTTP Retrofit 网络传输
  9. 数字人正走进现实!AI大脑+高颜值
  10. JAVA——对当前时间进行输出
  11. C语言和python实现——公鸡5文钱一只, 母鸡3文钱一只,小鸡3只一文钱,用100文钱买100只鸡
  12. (CVE-2014-0160) OpenSSL 心脏滴血漏洞
  13. 利用cloudflare works搭建个人网盘站——免费免服务器搭建基于onedrive的网盘站(2021版)
  14. linux动态压缩硬盘,VirtualBox 压缩VDI硬盘
  15. 查找论文对应开源代码的神器(Papers with Code)
  16. 个人电脑厂商艰难涉水家庭娱乐市场
  17. 读书笔记—《销售铁军》随记6
  18. 安全标准ISO7498-2(Security Architecture)名词定义
  19. 2022.4.11-4.17 AI行业周刊(第93期):AI行业的困局
  20. Office365 - 修改用户密码Teams无法登陆的解决方案

热门文章

  1. 代码随想录算法训练营day07| 454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和
  2. 性能测试——性能测试中的专业术语
  3. (二)性能测试的常用术语
  4. 计算机网络课程设计ipv6,实验:IPv6协议的配置和使用
  5. radio取消选中并能再次选中
  6. 调用百度翻译接口c++api
  7. 本地项目连接远程gitLab
  8. 切比雪夫求积分法(附全过程代码)
  9. R语言做文本挖掘:基于网购评论提炼电热水器的差异化卖点
  10. Hbase—分布式数据库