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

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

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

看下面代码:

 import java.lang.ref.*;

 public class Test {

     static final int MB =  * ;

     byte[] b = new byte[ * MB];

     public static void main(String[] args) {

         SoftReference<Test> test = new SoftReference<Test>(new Test());
// Test test = new Test();
byte[] c = new byte[ * MB];
}
}

我们调整运行参数:

则个运行结果是:

 [GC [PSYoungGen: 313K->288K(2368K)] 4409K->4384K(7872K), 0.0006568 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC [PSYoungGen: 288K->288K(2368K)] 4384K->4384K(7872K), 0.0002187 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[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]
[GC [PSYoungGen: 0K->0K(2368K)] 4293K->4293K(7872K), 0.0000939 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[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]
Heap
PSYoungGen total 2368K, used 41K [0x000000000aed0000, 0x000000000b170000, 0x000000000b170000)
eden space 2048K, % used [0x000000000aed0000,0x000000000aeda478,0x000000000b0d0000)
from space 320K, % used [0x000000000b0d0000,0x000000000b0d0000,0x000000000b120000)
to space 320K, % used [0x000000000b120000,0x000000000b120000,0x000000000b170000)
PSOldGen total 4544K, used 4288K [0x000000000a970000, 0x000000000ade0000, 0x000000000aed0000)
object space 4544K, % used [0x000000000a970000,0x000000000ada00c8,0x000000000ade0000)
PSPermGen total 21248K, used 2989K [0x0000000005570000, 0x0000000006a30000, 0x000000000a970000)
object space 21248K, % used [0x0000000005570000,0x000000000585b6f8,0x0000000006a30000)

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

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

import java.lang.ref.*;

public class Test {

    static final int MB =  * ;

    byte[] b = new byte[ * MB];

    public static void main(String[] args) {

        //SoftReference<Test> test = new SoftReference<Test>(new Test());
Test test = new Test();
byte[] c = new byte[ * 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 space
at Test.main(Test.java:)
Heap
PSYoungGen total 2368K, used 82K [0x000000000af70000, 0x000000000b210000, 0x000000000b210000)
eden space 2048K, % used [0x000000000af70000,0x000000000af84868,0x000000000b170000)
from space 320K, % used [0x000000000b170000,0x000000000b170000,0x000000000b1c0000)
to space 320K, % used [0x000000000b1c0000,0x000000000b1c0000,0x000000000b210000)
PSOldGen total 5504K, used 4288K [0x000000000aa10000, 0x000000000af70000, 0x000000000af70000)
object space 5504K, % used [0x000000000aa10000,0x000000000ae400a8,0x000000000af70000)
PSPermGen total 21248K, used 2990K [0x0000000005610000, 0x0000000006ad0000, 0x000000000aa10000)
object space 21248K, % used [0x0000000005610000,0x00000000058fbb60,0x0000000006ad0000)

关于SoftReference的使用的更多相关文章

  1. Softreference | WeakReference

    转自:http://blog.csdn.net/kavendb/article/details/5935577 本文介绍对象的强.软.弱和虚引用的概念.应用及其在UML中的表示. 1.对象的强.软.弱 ...

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

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

  3. android WeakReference(弱引用 防止内存泄漏)与SoftReference(软引用 实现缓存机制(cache))

    在Android开发中,基本上很少有用到软引用或弱引用,这两个东东若用的很好,对自己开发的代码质量的提高有很大的帮助.若用的不好,会坑了自己.所以,在还没有真正的去了解它们之前,还是慎用比较好. 下面 ...

  4. Java中引用类 strong reference .SoftReference 、 WeakReference 和 PhantomReference的区别

      当在 Java 2 平台中首次引入 java.lang.ref 包,其中包含 SoftReference . WeakReference 和 PhantomReference 三个引用类,引用类的 ...

  5. 软引用SoftReference异步加载图片

    HashMap<String, SoftReference<Drawable>> imageCache 关于SoftReference这个类多少知道些机制,会用就ok了. 机制 ...

  6. Java引用总结--StrongReference、SoftReference、WeakReference、PhantomReference

    Java引用总结--StrongReference.SoftReference.WeakReference.PhantomReference 1 Java引用介绍 Java从1.2版本开始引入了4种引 ...

  7. 【转】Java之WeakReference与SoftReference使用讲解

    Java 2 平台引入了 java.lang.ref 包,其中包括的类可以让您引用对象,而不将它们留在内存中.这些类还提供了与垃圾收集器(garbage collector)之间有限的交互. 1.先“ ...

  8. Android学习笔记之SoftReference软引用...

    PS:其实这一篇和上一篇很类似,都是为了解决内存不足(OOM)这种情况的发生... 学习内容: 1.对象的引用类....   最近也是通过项目中知道了一些东西,涉及到了对象的引用类,对象的引用类分为多 ...

  9. Java中的 WeakReference 和 SoftReference

    我们知道Java语言中没有指针,取而代之的是引用reference.Java中的引用又可以分为四种:强引用,弱引用(WeakReference),软引用(SoftReference),虚引用(Phan ...

  10. (转)SoftReference

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

随机推荐

  1. 03——微信小程序官方demo讲解——page部分

    一个page由一个文件夹以及文件夹下四个文件组成. 比如一个页面叫index.则需要在pages目录下新建一个index目录,且包含由index+类型(js\wxml\wxss\json)为名组成的若 ...

  2. rownum, row_number(), rank() , dense_rank(), partition by ,max() keep 语句的区别与用法

    rownum,rownumber(), rank(),dense_rank()都是用来为记录分配序号的, rownum只能在orderby语句排完序后,在外层嵌套查询才能获得正确的行号,用起来相当复杂 ...

  3. 爬虫之 图片懒加载, selenium , phantomJs, 谷歌无头浏览器

    一.图片懒加载 懒加载 :    JS 代码  是页面自然滚动    window.scrollTo(0,document.body.scrollHeight)   (重点) bro.execute_ ...

  4. Windbg基本命令应用总结

    .cordll -ve -u -l //reload core dlls ------加载下载系统文件符号的URL---------- .sympath SRV*C:\Symbols*http://m ...

  5. 11.redis连接

    转自:http://www.runoob.com/redis/redis-tutorial.html Redis 客户端连接 Redis 通过监听一个 TCP 端口或者 Unix socket 的方式 ...

  6. autofs文件自动挂载系统

    为了自己使用方便,利用iso文件制作了自己的rhel6.4的yum源,每次都手动进行mount,十分不便 后来在/etc/rc.local中写入了mount命令,方便多了. 时间一久,发现新的问题出现 ...

  7. Python进程监控-MyProcMonitor

    psutil api文档: http://pythonhosted.org/psutil/ api 测试 #! /usr/bin/env python # coding=utf-8 import ps ...

  8. Dreamweaver安装与破解

    1.下载Dreamweaver cs6破解版解压包 打开下载网址http://pan.baidu.com/s/1jGr8pbK,点击下载,保存到自己想要保存的位置. 2.下载Dreamweaver c ...

  9. cas-client单点登录客户端拦截请求和忽略/排除不需要拦截的请求URL的问题

    http://blog.csdn.net/eguid_1/article/details/73611781

  10. 后端生成二维码 - C#生成二维码(QR)

    最近在github上找到一个相对比较好的C#二维码生成类库.在这里和大家分享一下. github地址:https://github.com/codebude/QRCoder 把解决方案下载下来,编译生 ...