`
nick714
  • 浏览: 26126 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

(转载)Java 和 Android 内存优化的两个类:SoftReference 和 WeakReference

 
阅读更多

如果你想写一个 Java 程序,观察某对象什么时候会被垃圾收集的执行绪清除,你必须要用一个 reference 记住此对象,以便随时观察,但是却因此造成此对象的 reference 数目一直无法为零, 使得对象无法被清除。

1 java.lang.ref.WeakReference

  不过,现在有了 Weak Reference 之后,这就可以迎刃而解了。如果你希望能随时取得某对象的信息,但又不想影响此对象的垃圾收集,那么你应该用 Weak Reference 来记住此对象,而不是用一般的 reference。

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 的技巧。

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 }

 

文章出处:飞诺网(www.firnow.com):http://dev.firnow.com/course/3_program/java/javajs/20090502/166222.html

分享到:
评论

相关推荐

    Android 内存溢出问题

    本篇文章将深入探讨Android内存管理的两个核心概念:堆(Heap)和栈(Stack),以及如何理解和解决Android内存溢出问题。 1. 堆与栈 堆和栈是Java虚拟机(JVM)中的两种主要内存区域,它们各自具有特定的用途和...

    Android的内存机制和溢出说明

    同时,遵循最佳实践,如使用Parcelable而非Serializable进行数据序列化,以及及时关闭Cursor、数据库连接和网络连接等,都有助于优化内存使用。 性能调优还包括避免一次性加载过多数据,使用列表视图(ListView)和...

    android内存分析工具

    MAT能够帮助开发者深入理解内存分配情况,检测内存泄漏和不必要的对象引用,从而有效地优化内存使用,防止OOM的发生。 1. **MAT的使用** - **下载与安装**:MAT通常以Eclipse插件的形式存在,开发者可以在Eclipse ...

    Java系统中内存泄漏测试方法的研究

    在Java中,内存分为堆(Heap)和栈(Stack)两部分。堆是存储对象实例的地方,而栈则存储方法调用时的局部变量。Java虚拟机(JVM)有自动垃圾回收机制(Garbage Collection, GC),用于回收不再使用的对象所占用的...

    安卓Android源码——防止内存溢出浅析.zip

    在安卓开发中,内存管理...通过理解和应用以上策略,开发者可以在源码层面优化内存管理,有效防止Android应用出现内存溢出,提升应用的稳定性和性能。深入研究Android源码,了解其内存管理机制,对开发者来说至关重要。

    Android应用源码之防止内存溢出浅析.zip

    5. **使用WeakReference和SoftReference**:这两类引用可以帮助我们创建一种“弱连接”,让对象在不再被其他强引用时能够被GC回收。在处理大对象或者需要延迟回收的场景下,可以考虑使用。 6. **避免内存抖动**:...

    内存清理案例(clean memory)

    在这个"clean memory"案例中,我们主要关注如何有效地管理和清理Android设备的内存。 首先,我们需要理解Android内存的类型。Android系统主要有两种内存:堆内存(Heap Memory)和 Dalvik/ART 运行时内存。堆内存...

    防止内存溢出浅析

    3. **使用弱引用和软引用**: WeakReference和SoftReference是Java提供的两种特殊引用类型,它们不会阻止GC回收对象。弱引用在GC运行时会立即清除,而软引用则在系统内存紧张时才会被回收。合理使用这两种引用,可以...

    AndroidApp定位和规避内存泄露方法研究

    在Android应用开发中,内存管理是至关重要的一个环节,尤其是对于大型、复杂的应用,内存泄露可能导致应用程序性能下降,甚至导致应用无响应(ANR)或崩溃。本文将深入探讨Android App中的内存泄露问题,以及如何...

    Android 3D相册图片滑动+倾斜+放大+倒影处理源码.zip

    - 使用WeakReference或SoftReference处理大对象,避免内存泄漏。 - 在适当的时候释放资源,如关闭数据库连接、释放网络连接等。 9. **版本兼容性**: - 使用Support Library或AndroidX库,确保代码兼容不同版本...

    Android中的软引用和弱引用

    当需要清理缓存时,只需要清空这两个映射即可,因为软引用和弱引用的对象会在垃圾收集时自动被回收。 总的来说,软引用和弱引用是Android开发者处理内存问题的有效工具。它们可以帮助我们实现智能的缓存策略,平衡...

    android bitmap outOfMemory解决方法

    6. **使用SoftReference或WeakReference**:使用这两种引用类型可以降低Bitmap的内存保留优先级,使系统在内存紧张时更容易回收Bitmap。 7. **监控内存使用**:利用Android的`ActivityManager`或第三方工具如MAT...

    Android 图片浏览功能源码.zip

    - ** Glide**:一个强大的图片加载库,支持从网络、文件系统或资源中加载图片,并进行高效的内存和磁盘缓存。源码中可能使用Glide进行图片的懒加载和尺寸适配,减少内存消耗,提高性能。 - **Picasso**:另一种...

    Android面试题

    - **内存优化**:讲述避免内存泄漏的方法,如使用WeakReference和SoftReference,以及如何使用内存分析工具进行调试。 - **绘制优化**:解释如何减少过度绘制,以及如何使用 Choreographer 和 ViewTreeObserver 来...

    图片下载以及内存处理防OOM.zip

    在Android开发中,图片下载和内存管理是两个关键的环节,尤其对于性能优化和避免内存溢出(Out of Memory, OOM)问题至关重要。本文将深入探讨这些知识点,并结合源码学习来提升Android应用的效率。 一、图片下载 ...

    安卓Android源码——图片下载以及内存处理防OOM.rar

    在安卓开发中,图片加载和内存管理是两个关键的领域,尤其对于防止应用程序出现内存溢出(Out Of Memory,简称OOM)至关重要。Android系统运行在有限的内存资源中,因此,开发者需要谨慎处理图片资源,避免过度消耗...

    BitmapFunc.rar

    在这个压缩包中,我们有两个主要的文件:项目说明.rar和BitmapFun。 项目说明.rar可能包含了对整个项目背景、目标以及Bitmap功能实现的具体细节的描述。它可能会涵盖如何在Android应用中加载、显示、操作和优化...

    Android 英语单词记忆程序源码 (2).zip

    1. **Android开发环境**:这个项目是用Java或Kotlin语言编写的,这是Android应用开发的两种主要语言。开发者可能使用了Android Studio作为集成开发环境(IDE),它提供了丰富的工具和功能来编写、调试和构建Android...

    Activity跳转时传递Bitmap对象

    - 使用SoftReference或WeakReference保存Bitmap,防止内存泄漏。 - 使用LruCache或其他内存缓存机制,复用Bitmap对象。 在提供的"ImageView转Bitmap"这个Demo中,可能涉及了从ImageView获取Bitmap的方法。通常,...

    Android异步加载图像小结 (含线程池,缓存方法).doc.zip

    "Android异步加载图像小结(含线程池,缓存方法)"这个文档详细讲解了如何在Android环境中高效、异步地加载图片,同时利用线程池和缓存策略优化性能。以下是对这些知识点的详细说明: 1. **异步加载**: - 异步...

Global site tag (gtag.js) - Google Analytics