Java 和 Android 内存优化的两个类:SoftReference 和 WeakReference
Posted on 2010-10-22 00:55 charley_yang 阅读(436) 评论(0) 编辑 收藏
如果你想写一个 Java 程序,观察某对象什么时候会被垃圾收集的执行绪清除,你必须要用一个 reference 记住此对象,以便随时观察,但是却因此造成此对象的 reference 数目一直无法为零, 使得对象无法被清除。
view sourceprint?
1 java.lang.ref.WeakReference
不过,现在有了 Weak Reference 之后,这就可以迎刃而解了。如果你希望能随时取得某对象的信息,但又不想影响此对象的垃圾收集,那么你应该用 Weak Reference 来记住此对象,而不是用一般的 reference。
view sourceprint?
01 A obj = new A();
02
03 WeakReference wr = new WeakReference(obj);
04
05 obj = null;
06
07 //等待一段时间,obj对象就会被垃圾回收
08 ...
09
10 if (wr.get()==null) {
11 System.out.println("obj 已经被清除了 ");
12 } else {
13 System.out.println("obj 尚未被清除,其信息是 "+obj.toString());
14 }
15 ...
在此例中,透过 get() 可以取得此 Reference 的所指到的对象,如果传出值为 null 的话,代表此对象已经被清除。
这类的技巧,在设计 Optimizer 或 Debugger 这类的程序时常会用到,因为这类程序需要取得某对象的信息,但是不可以 影响此对象的垃圾收集。
java.lang.ref.SoftReference
Soft Reference 虽然和 Weak Reference 很类似,但是用途却不同。 被 Soft Reference 指到的对象,即使没有任何 Direct Reference,也不会被清除。一直要到 JVM 内存不足时且 没有 Direct Reference 时才会清除,SoftReference 是用来设计 object-cache 之用的。如此一来 SoftReference 不但可以把对象 cache 起来,也不会造成内存不足的错误 (OutOfMemoryError)。我觉得 Soft Reference 也适合拿来实作 pooling 的技巧。
view sourceprint?
01 A obj = new A();
02
03 SoftRefenrence sr = new SoftReference(obj);
04
05 引用时
06
07 if(sr!=null){
08
09 obj = sr.get();
10
11 }else{
12
13 obj = new A();
14
15 sr = new SoftReference(obj);
16
17 }
分享到:
相关推荐
SoftReference、WeakReference和PhantomReference分析和比较 在 Java 中,引用类型分为强引用、软引用、弱引用和虚引用四种。强引用是我们最常用的引用类型,而软引用、弱引用和虚引用则是 Java 为我们提供的三种...
StrongReference,SoftReference, WeakReference的使用实例,请参照博客:http://blog.csdn.net/To_be_Designer/article/details/72673421
Java从1.2版本开始引入了四种引用,分别是强引用(StrongReference)、软引用(SoftReference)、弱引用(WeakReference)和虚引用(PhantomReference)。这四种引用的级别由高到低依次为:强引用 > 软引用 > 弱引用...
周期无法控制可以采用SoftReference,WeakReference,PhantomReference这三种对象来执行(看了Ibatis的缓存机制才发现JDK居然还提供了PhantomReference这玩意儿,得恶补基础啊),这三种都是弱引用,区别在于强度...
本文将深入探讨这个包中的四种主要引用类型:StrongReference、SoftReference、WeakReference 和 PhantomReference,以及它们的特性、用法和作用。 首先,强引用(StrongReference)是我们在日常编程中最常见的引用...
5. 使用WeakReference和SoftReference: WeakReference和SoftReference可以帮助开发者更好地管理应用程序中的对象生命周期。 OOM错误的常见解决方法 1. 使用System.gc():System.gc()可以强制垃圾回收器回收垃圾...
3. 使用软引用或弱引用:通过SoftReference或WeakReference持有Bitmap对象,帮助垃圾回收器更好地管理内存。 总结,大位图的二次采样处理是Android开发中解决内存问题的关键技术。开发者需要理解其原理,掌握计算...
4. 使用WeakReference和SoftReference,WeakReference和SoftReference可以帮助避免内存泄漏。 Java的垃圾回收机制可以自动回收内存中的垃圾,避免内存泄漏,但是程序员需要注意避免内存泄漏的几点,以确保程序的...
- **数据类型选择**:选择合适的数据类型,如StringBuilder代替String进行字符串拼接,使用SoftReference和WeakReference利于内存回收,final类型提高读取效率。 - **数据结构选择**:根据需求选择合适的数据结构...
总结,java.lang.ref 包中的四种引用类型——StrongReference、SoftReference、WeakReference 和 PhantomReference,提供了不同的内存管理策略,适应不同的场景需求。强引用是最常用的引用类型,但在处理大对象或...
7. 使用WeakReference和SoftReference: 对于那些可能引起内存泄漏的引用,可以考虑使用WeakReference或SoftReference。WeakReference在对象无其他强引用时会立即被回收,而SoftReference在系统内存紧张时才会被...
4. WeakReference 与 SoftReference: WeakReference 和 SoftReference 都可以用于提高 GC 和内存的效率,但是 WeakReference 一旦失去最后一个强引用,就会被 GC 回收,而软引用虽然不能阻止被回收,但是可以延迟到...
- SoftReference和WeakReference:对于内存敏感的应用,可以使用这些引用类型来管理Bitmap对象,防止内存泄漏,但需要注意它们并不保证在内存不足时一定会释放。 - 使用池化技术:通过BitmapPool回收和重用Bitmap...
另外,使用SoftReference或WeakReference来存储Bitmap,可以在内存紧张时自动释放内存。此外,使用内存池和复用策略可以降低内存分配和回收的开销。对于频繁加载和显示图片的场景,如瀑布流或网格布局,还可以利用...
- **使用软引用和弱引用**:通过使用SoftReference和WeakReference,可以在内存不足时自动清除引用对象,防止内存泄漏。 - **LruCache**:Android提供的Least Recently Used缓存策略,用于缓存Bitmap或其他对象,...
使用SoftReference或WeakReference存储Bitmap。 4. **进度显示**:提供上传进度反馈,提高用户体验。 5. **权限管理**:确保应用拥有访问文件和网络的权限。 通过以上步骤,开发者可以在Android应用中实现图片和...
Java提供了几种不同类型的引用,如SoftReference和WeakReference,来帮助管理对象的生命周期。SoftReference会在系统即将发生内存溢出之前才释放引用的对象,而WeakReference则会在GC发现对象不可达时立即释放。这些...
4. 载入Bitmap时使用SoftReference或WeakReference:这样在内存不足时,系统可以优先回收这些对象,降低OOM风险。 5. 使用内存和磁盘缓存:将图片保存到LRU Cache(最近最少使用)内存缓存和File Cache(文件缓存)...