装载自:http://flyneil.iteye.com/blog/1345177
WeakReference与SoftReference都可以用来保存对象的实例引用,这两个类与垃圾回收有关。
WeakReference是弱引用,其中保存的对象实例可以被GC回收掉。这个类通常用于在某处保存对象引用,而又不干扰该对象被GC回收,通常用于Debug、内存监视工具等程序中。因为这类程序一般要求即要观察到对象,又不能影响该对象正常的GC过程。
最近在JDK的Proxy类的实现代码中也发现了Weakrefrence的应用,Proxy会把动态生成的Class实例暂存于一个由Weakrefrence构成的Map中作为Cache。
SoftReference是强引用,它保存的对象实例,除非JVM即将OutOfMemory,否则不会被GC回收。这个特性使得它特别适合设计对象Cache。对于Cache,我们希望被缓存的对象最好始终常驻内存,但是如果JVM内存吃紧,为了不发生OutOfMemoryError导致系统崩溃,必要的时候也允许JVM回收Cache的内存,待后续合适的时机再把数据重新Load到Cache中。这样可以系统设计得更具弹性。
WeakReference的一个测试程序:
- import java.lang.ref.WeakReference;
-
-
public class WeakReferenceTest {
-
-
-
-
-
public static void main(String[] args) {
-
A a = new A();
-
a.str = "Hello, reference";
-
WeakReference<A> weak = new WeakReference<A>(a);
-
a = null;
-
int i = 0;
-
while (weak.get() != null) {
-
System.out.println(String.format("Get str from object of WeakReference: %s, count: %d", weak.get().str, ++i));
-
if (i % 10 == 0) {
- System.gc();
-
System.out.println("System.gc() was invoked!");
- }
-
try {
-
Thread.sleep(500);
-
} catch (InterruptedException e) {
-
- }
- }
-
System.out.println("object a was cleared by JVM!");
- }
-
- }
import java.lang.ref.WeakReference;
public class WeakReferenceTest {
/**
* @param args
*/
public static void main(String[] args) {
A a = new A();
a.str = "Hello, reference";
WeakReference<A> weak = new WeakReference<A>(a);
a = null;
int i = 0;
while (weak.get() != null) {
System.out.println(String.format("Get str from object of WeakReference: %s, count: %d", weak.get().str, ++i));
if (i % 10 == 0) {
System.gc();
System.out.println("System.gc() was invoked!");
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
}
System.out.println("object a was cleared by JVM!");
}
}
程序运行结果:
- Get str from object of WeakReference: Hello, reference, count: 1
-
Get str from object of WeakReference: Hello, reference, count: 2
-
Get str from object of WeakReference: Hello, reference, count: 3
-
Get str from object of WeakReference: Hello, reference, count: 4
-
Get str from object of WeakReference: Hello, reference, count: 5
-
Get str from object of WeakReference: Hello, reference, count: 6
-
Get str from object of WeakReference: Hello, reference, count: 7
-
Get str from object of WeakReference: Hello, reference, count: 8
-
Get str from object of WeakReference: Hello, reference, count: 9
-
Get str from object of WeakReference: Hello, reference, count: 10
- System.gc() was invoked!
- object a was cleared by JVM!
Get str from object of WeakReference: Hello, reference, count: 1
Get str from object of WeakReference: Hello, reference, count: 2
Get str from object of WeakReference: Hello, reference, count: 3
Get str from object of WeakReference: Hello, reference, count: 4
Get str from object of WeakReference: Hello, reference, count: 5
Get str from object of WeakReference: Hello, reference, count: 6
Get str from object of WeakReference: Hello, reference, count: 7
Get str from object of WeakReference: Hello, reference, count: 8
Get str from object of WeakReference: Hello, reference, count: 9
Get str from object of WeakReference: Hello, reference, count: 10
System.gc() was invoked!
object a was cleared by JVM!
SoftReference的一个测试程序:
- import java.lang.ref.SoftReference;
-
-
public class SoftReferenceTest {
-
-
-
-
-
public static void main(String[] args) {
-
A a = new A();
-
a.str = "Hello, reference";
-
SoftReference<A> sr = new SoftReference<A>(a);
-
a = null;
-
int i = 0;
-
while (sr.get() != null) {
-
System.out.println(String.format("Get str from object of SoftReference: %s, count: %d", sr.get().str, ++i));
-
if (i % 10 == 0) {
- System.gc();
-
System.out.println("System.gc() was invoked!");
- }
-
try {
-
Thread.sleep(500);
-
} catch (InterruptedException e) {
-
- }
- }
-
System.out.println("object a was cleared by JVM!");
- }
-
- }
import java.lang.ref.SoftReference;
public class SoftReferenceTest {
/**
* @param args
*/
public static void main(String[] args) {
A a = new A();
a.str = "Hello, reference";
SoftReference<A> sr = new SoftReference<A>(a);
a = null;
int i = 0;
while (sr.get() != null) {
System.out.println(String.format("Get str from object of SoftReference: %s, count: %d", sr.get().str, ++i));
if (i % 10 == 0) {
System.gc();
System.out.println("System.gc() was invoked!");
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
}
System.out.println("object a was cleared by JVM!");
}
}
程序运行结果:
- Get str from object of SoftReference: Hello, reference, count: 1
-
Get str from object of SoftReference: Hello, reference, count: 2
-
Get str from object of SoftReference: Hello, reference, count: 3
-
Get str from object of SoftReference: Hello, reference, count: 4
-
Get str from object of SoftReference: Hello, reference, count: 5
-
Get str from object of SoftReference: Hello, reference, count: 6
-
Get str from object of SoftReference: Hello, reference, count: 7
-
Get str from object of SoftReference: Hello, reference, count: 8
-
Get str from object of SoftReference: Hello, reference, count: 9
-
Get str from object of SoftReference: Hello, reference, count: 10
- System.gc() was invoked!
-
Get str from object of SoftReference: Hello, reference, count: 11
-
Get str from object of SoftReference: Hello, reference, count: 12
-
Get str from object of SoftReference: Hello, reference, count: 13
-
Get str from object of SoftReference: Hello, reference, count: 14
-
Get str from object of SoftReference: Hello, reference, count: 15
-
Get str from object of SoftReference: Hello, reference, count: 16
-
Get str from object of SoftReference: Hello, reference, count: 17
-
Get str from object of SoftReference: Hello, reference, count: 18
-
Get str from object of SoftReference: Hello, reference, count: 19
-
Get str from object of SoftReference: Hello, reference, count: 20
- System.gc() was invoked!
-
Get str from object of SoftReference: Hello, reference, count: 21
-
Get str from object of SoftReference: Hello, reference, count: 22
-
Get str from object of SoftReference: Hello, reference, count: 23
-
Get str from object of SoftReference: Hello, reference, count: 24
-
Get str from object of SoftReference: Hello, reference, count: 25
-
Get str from object of SoftReference: Hello, reference, count: 26
-
Get str from object of SoftReference: Hello, reference, count: 27
-
Get str from object of SoftReference: Hello, reference, count: 28
自己的标注 写道
上面的打印结果会一直持续下去。 因为soft.get()一直不会为空
SoftReference比WeakReference生命力更强,当JVM的内存不吃紧时,即使引用的对象被置为空了,Soft还可以保留对该对象的引用,此时的JVM内存池实际上还保有原来对象,只有当内存吃紧的情况下JVM才会清除Soft的引用对象,并且会在未来重新加载该引用的对象。
而WeakReference则当清理内存池时会自动清理掉引用的对象。
分享到:
相关推荐
SoftReference、WeakReference和PhantomRefrence分析和比较
StrongReference,SoftReference, WeakReference的使用实例,请参照博客:http://blog.csdn.net/To_be_Designer/article/details/72673421
该Demo主要原理: 加载图片时先查看缓存中时候存在该图片,如果存在则返回该图片,否则先加载载一个...并且处理的多个细节,包括使用WeakReference、SoftReference防止内存溢出、解决使用Handler时context泄露问题 登
3.1 强引 3.2 软引 3.3 弱引 3. 4 假象引
周期无法控制可以采用SoftReference,WeakReference,PhantomReference这三种对象来执行(看了Ibatis的缓存机制才发现JDK居然还提供了PhantomReference这玩意儿,得恶补基础啊),这三种都是弱引用,区别在于强度...
1.强引用1.强引用 2.软引用(SoftReference) 3.弱引用(WeakReference) 4.虚引用(PhantomReference) 等等;
ava有四种引用类型,strongreference,softreference,weakreference,phantomreference。本篇文档主要的就是进阶的介绍和了解这四种引用类型的异同点,助于你对java的更好的学习理解
├─Google Guava 第29讲-SoftReference,WeakReference,PhantomReference精讲.wmv ├─Google Guava 第30讲-SoftReference加LRU算法实现InMemoryCache.wmv ├─Google Guava 第31讲-Guava之CacheLoader,...
他们分别是强引用(StrongReference),软引用(SoftReference),弱引用(WeakReference)以及PhantomReference(虚引用),他们被 GC回收的可能性从小到大排列。 强引用(StrongReference) 只要强引用存在,垃圾回收器将...
前述:除了强引用外,其他引用不是我们所常见的 new出来的对象,而是需要借用3个类SoftReference软引用,WeakReference弱引用,PhantomReference虚引用 1.强引用 概述:即发生OOM(Out Of Memory)内存空间满了也...
很早Java API就添加了弱引用(WeakReference)和软引用(SoftReference),但并不是所有的程序员都熟悉这两个概念
软引用(SoftReference) 23 弱引用(WeakReference) 23 虚引用(PhantomReference) 24 【基础】final, finally, finalize的区别 24 【基础】Java 中定义常量的几种方法 25 【基础】什么时候使用字节流?什么时候...
•接口定义的是多个类共同的行为规范,这些行为是与外部交流的通道,这就意味着接口里通常是定义一组公用的 方法。 •接口体现了规范与实现分离的设计。 接口的定义 •和类定义不同,定义接口不再...