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. 09_java之面向对象概述

    01面向对象和面向过程的思想 * A: 面向过程与面向对象都是我们编程中,编写程序的一种思维方式 * a: 面向过程的程序设计方式,是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程. * b: ...

  2. [转] C# 获取程序运行目录

    来自 莫等闲也,原文 // 获取程序的基目录.  System.AppDomain.CurrentDomain.BaseDirectory // 获取模块的完整路径. System.Diagnosti ...

  3. 什么是事件代理?DOM2.0标准事件模型的三个阶段

    体验更优排版请移步原文:http://blog.kwin.wang/programming/js-event-delegation.html 事件代理,又称事件委托(Delegation),就是将处理 ...

  4. Delphi IOS class_addMethod

    class_addMethod 学习FMX.Platform.iOS.pas文件的处理办法 d:\program files (x86)\embarcadero\studio\17.0\source\ ...

  5. e s6 知识点

    http://es6.ruanyifeng.com/#docs/reflect 1.资料对es6箭头函数中的this总结:箭头函数中的this指向的是 定义时的this,而不是 执行时的this.

  6. LUA使用虚函数与使用回调函数

    ------------------虚函数overload-------------------------- --回调:寻路中格子坐标改变 CHero.OnSearchToCellsChange = ...

  7. Linux 如何杀死僵尸进程

    问题描述: shell > top top - :: up days, :, user, load average: 0.23, 0.81, 1.07 Tasks: total, running ...

  8. 【308】Python os.path 模块常用方法

    参考:Python os.path 模块 参考:python3中,os.path模块下常用的用法总结 01   abspath 返回一个目录的绝对路径. 02   basename 返回一个目录的基名 ...

  9. apktool.bat

    @echo off if "%PATH_BASE%" == "" set PATH_BASE=%PATH% set PATH=%CD%;%PATH_BASE%; ...

  10. 阿里巴巴Java开发规约扫描插件-Alibaba Java Coding Guidelines 在idea上安装使用教程

    经过247天的持续研发,阿里巴巴于10月14日在杭州云栖大会上,正式发布众所期待的<阿里巴巴Java开发规约>扫描插件!该插件由阿里巴巴P3C项目组研发.P3C是世界知名的反潜机,专门对付 ...