Java内存管理之软引用(Soft Reference)

软引用(Soft  Reference)的主要特点是具有较强的引用功能。只有当内存不够的时候才回收这类内 存,因此在内存足够的时候,他们通常不被回收。另外,这些引用对象还能保证在Java  抛出 OutOfMemory异常之前,被设置为null。他可以用于实现一些常用资源的缓存,实现Cache的功能,保证最大限 度的使用内存而不引起OutOfMemory异常。

下面是软引用的实现代码:

import java.lang.ref.SoftReference;  

public class softReference {  

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        A a = new A();  

        //使用a
        a.test();  

        //使用完了a,将它设置为soft引用类型,并且释放强引用
        SoftReference sr = new SoftReference(a);
        a = null;  

        //下次使用
        if (sr != null) {
            a = (A)sr.get();
            a.test();
        } else {
            //GC由于低内存,已释放a,因此需要重新装载
            a = new A();
            a.test();
            a = null;
            sr = new SoftReference(a);
        }
    }  

}  

class A {
    public void test() {
        System.out.println("Soft Reference test");
    }
}

软引用技术的引进使Java应用可以更好的管理内存,稳定系统,防止系统内存溢出,避免系统崩溃 。因此在处理一些占用内存大而且声明周期较长,但使用并不频繁的对象时应尽量应用该技术。但事物总带有 两面性的,有利也有弊,在某些时候对软引用的使用会降低应用的运行效率与性能,例如:应用软引用的对象 的初始化过程较为耗时,或者对象的状态在程序的运行过程中发生了变化,都会给重新创建对象与初始化对象 带来不同程度的麻烦,有些时候我们要权衡利弊择时应用。

这篇文章来自JAVA天下: http://www.blogjava.net/ajie/archive/2005/12/18/24435.html

下面来看下怎样在Android中使用软 引用

Java中的SoftReference
即对象的软引用。如果一个对象具有软引用,内存空间足够,垃 圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对 象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。使用软引用能防止内存泄露,增强程序的健壮 性。  
SoftReference的特点是它的一个实例保存对一个Java对象的软引用,该软引用的存在不 妨碍垃圾收集线程对该Java对象的回收。也就是说,一旦SoftReference保存了对一个Java对象的软引用后, 在垃圾线程对这个Java对象回收前,SoftReference类所提供的get()方法返回Java对象的强引用。另外,一旦 垃圾线程回收该Java对象之后,get()方法将返回null

用Map集合缓存软引用的Bitmap对象

Map<String, SoftReference<Bitmap>> imageCache = new new HashMap<String, 

SoftReference<Bitmap>>();
//强引用的Bitmap对象
Bitmap bitmap = BitmapFactory.decodeStream(InputStream);
//软引用的Bitmap对象
SoftReference<Bitmap> bitmapcache = new SoftReference<Bitmap>(bitmap);
//添加该对象到Map中使其缓存
imageCache.put("1",softRbitmap);
..
.  

//从缓存中取软引用的Bitmap对象
SoftReference<Bitmap> bitmapcache_ = imageCache.get("1");
//取出Bitmap对象,如果由于内存不足Bitmap被回收,将取得空  

Bitmap bitmap_ = bitmapcache_.get();

如果程序中需要从网上加 载大量的图片 这时就考虑采用在sdcard上建立临时文件夹缓存这些图片了

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, 内存
, 对象
, 缓存
, bitmap
, outofmemory
, bitmap回收异常
, java outofmemory
, 软引用
, java中reference
, java中的reference
, java防止内存泄露
, SoftReference
Bitmap缓存池
soft reference、webreference 引用、reference引用格式、文章内引用reference、指令引用内存不能read,以便于您获取更多的相关知识。

时间: 2025-01-21 12:48:47

Java内存管理之软引用(Soft Reference)的相关文章

Java内存管理

版权声明:本文为博主原创文章,转载注明出处http://blog.csdn.net/u013142781 前一段时间粗略看了一下<深入Java虚拟机 第二版>,可能是因为工作才一年的原因吧,看着十分的吃力.毕竟如果具体到细节的话,Java虚拟机涉及的内容太多了.可能再过一两年去看会合适一些吧. 不过看了一遍<深入Java虚拟机>再来理解Java内存管理会好很多.接下来一起学习下Java内存管理吧. 请注意上图的这个: 我们再来复习下进程与线程吧: 进程是具有一定独立功能的程序关于某

java内存管理(堆、栈、方法区)

java内存管理 简介 首先我们要了解我们为什么要学习java虚拟机的内存管理,不是java的gc垃圾回收机制都帮我们释放了内存了吗?但是在写程序的过程中却也往往因为不懂内存管理而造成了一些不容易察觉到的内存问题,并且在内存问题出现的时候,也不能很快的定位并解决.因此,了解并掌握Java的内存管理是我们必须要做的是事,也只有这样才能写出更好的程序,更好地优化程序的性能. 概述 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干不同的数据区域,这些区域都有各自的用途以及创建和销毁

java内存管理和回收机制

java类文件是以 .java为后缀的文件,经过javac命令编译后,编译成class文件,class文件中都是二进制格式的数据,所以想要看编译后的内容是什么,可以采用jdk自带的javap命令查看. JVM中有个组成部分为类加载器(ClassLoader),负责java文件编译后class文件的加载,加载到哪呢,加载到内存.那下面来说一下JVM的内存管理. java通过类加载器来加载class文件,加载到内存后,会把类.方法.常变量放到堆内存中.因为java是自动进行垃圾回收的,所以放入堆内存

JAVA 内存管理总结

1. java是如何管理内存的 Java的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 (基本类型除外),所有的对象都在堆 (Heap)中分配空间. 释放 :对象的释放是由垃圾回收机制决定和执行的,这样做确实简化了程序员的工作.但同时,它也加重了JVM的工作.因为,GC为了能够正确释放对象,GC必须监控每一个对象的运行状态,包括对象的申请.引用.被引用.赋值等,GC都需要进行监控. 2. 什么叫java的内存泄

Java内存管理和垃圾回收

笔记,深入理解java虚拟机   Java运行时内存区域 程序计数器,线程独占,当前线程所执行的字节码的行号指示器,每个线程需要记录下执行到哪儿了,下次调度的时候可以继续执行,这个区是唯一不会发生oom的 栈,线程独占,包含虚拟机栈或native method stack,用于存放局部变量的 堆,线程共享,用于分布对象实例的,后面说的内存管理和垃圾回收基本都是针对堆的 方法区,线程共享,用于存放被虚拟机加载的类,常量,静态变量; Java虚拟机规范,把方法区描述为堆的逻辑部分,所以也被称为"永久

Java内存管理及GC算法

概述 内存划分 虚拟机规范中将内存分为六大部分,分别为PC寄存器.JAVA虚拟机栈.JAVA堆.方法区.运行时常量及本地方法栈. 1.PC寄存器:线程独占: 2.JAVA虚拟机栈:线程独有:JAVA虚拟机栈是在创建线程的同时创建的,用于存储栈帧,JAVA虚拟机栈也是线程独有的. 3.JAVA堆:全局共享: 4.方法区:全局共享:它主要存储的是 运行时常量池 字段信息 方法信息 构造方法 普通函数的字节码内容以及一些特殊方法. 5.本地方法栈:线程独有,本地方法栈是一个传统的栈,它用来支持nati

内存管理4Aotorelease自动引用计数

Student.h: #import <Foundation/Foundation.h> @interface Student : NSObject @property(nonatomic,unsigned)int age; +(id)student; +(id)initWithAge:(int)age; @end Student.m: #import "Student.h" @implementation Student +(id)student{ return [[[S

深入java面向对象五:Java的内存管理

一. Java对象的引用种类 Java内存管理包括内存分配和内存回收, 这个动作都是由JVM自动完成,所以过多的内存分配增加了内存的消耗,且垃圾回收线程的不断运行会给后台增加压力,降低系统的性能.   1.1  对象在内存中的状态     · 可达状态: 当一个对对象被创建后,有一个以上的引用变量引用它,在它处于可达状态. ·可恢复状态: 如果程序中的某个对象不再有任何引用变量引用它,它将先进入可恢复状态. · 不可达状态: 当对象的所有关联都被切断,且系统调用所有对象的finalize方法依然

浅谈Android系统的基本体系结构与内存管理优化

Android运行环境一览 Android基于linux内核,面向移动终端的操作系统.主要包括以下几个方面: Application Framework: 这一层为应用开发者提供了丰富的应用编程接口,如 Activity Manager,Content Provider,Notification Manager,以及各种窗口 Widget 资源等.所有的APP都是运行在这一层之上. Dalvik 虚拟机: Dalvik VM采用寄存器架构,而不是JVM的栈架构,更适于移动设备.java源代码经过