如果你想写一个 Java 程序,观察某对象什么时候会被垃圾收集的执行清除,你必须要用一个 reference 记住此对象,以便随时观察,但是却因此造成此对象的 reference 数目一直无法为零, 使得对象无法被清除。
java.lang.ref.WeakReference
不过,现在有了 Weak Reference 之后,这就可以迎刃而解了。如果你希望能随时取得某对象的信息,但又不想影响此对象的垃圾收集,那么你应该用 Weak Reference 来记住此对象,而不是用一般的 reference。
A obj = new A();
WeakReference wr = new WeakReference(obj);
obj = null;
//等待一段时间,obj对象就会被垃圾回收
...
if (wr.get()==null) {
System.out.println("obj 已经被清除了 ");
} else {
System.out.println("obj 尚未被清除,其信息是 "+obj.toString());
}
...
在此例中,透过 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 的技巧。
A obj = new A();
SoftRefenrence sr = new SoftReference(obj);
引用时
if(sr!=null){
obj = sr.get();
}else{
obj = new A();
sr = new SoftReference(obj);
}
文章出处:飞诺网(www.firnow.com):http://dev.firnow.com/course/3_program/java/javajs/20090502/166222.html
分享到:
相关推荐
本篇文章将深入探讨Android内存管理的两个核心概念:堆(Heap)和栈(Stack),以及如何理解和解决Android内存溢出问题。 1. 堆与栈 堆和栈是Java虚拟机(JVM)中的两种主要内存区域,它们各自具有特定的用途和...
同时,遵循最佳实践,如使用Parcelable而非Serializable进行数据序列化,以及及时关闭Cursor、数据库连接和网络连接等,都有助于优化内存使用。 性能调优还包括避免一次性加载过多数据,使用列表视图(ListView)和...
MAT能够帮助开发者深入理解内存分配情况,检测内存泄漏和不必要的对象引用,从而有效地优化内存使用,防止OOM的发生。 1. **MAT的使用** - **下载与安装**:MAT通常以Eclipse插件的形式存在,开发者可以在Eclipse ...
在安卓开发中,内存管理...通过理解和应用以上策略,开发者可以在源码层面优化内存管理,有效防止Android应用出现内存溢出,提升应用的稳定性和性能。深入研究Android源码,了解其内存管理机制,对开发者来说至关重要。
5. **优化内存管理策略**: - 及时释放不再需要的资源,如Bitmap、Cursor、View等。 - 避免使用静态变量持有Context或Activity引用。 - 使用WeakReference或SoftReference来存储可能长时间存在的对象。 - 注意...
5. **使用WeakReference和SoftReference**:这两类引用可以帮助我们创建一种“弱连接”,让对象在不再被其他强引用时能够被GC回收。在处理大对象或者需要延迟回收的场景下,可以考虑使用。 6. **避免内存抖动**:...
Android设备的内存资源相对有限,因此优化内存使用对于提升用户体验至关重要。 **内存泄漏** 内存泄漏是导致内存溢出的主要原因之一。当一个对象不再被程序使用但仍然保留在内存中,就发生了内存泄漏。例如,活动...
3. **使用软引用和弱引用**: 使用`SoftReference`或`WeakReference`保存Bitmap对象,这样在系统内存紧张时,这些引用的对象会被自动回收,有助于防止内存溢出。 4. **内存缓存策略**: 实现一个内存缓存机制,如...
在这个"clean memory"案例中,我们主要关注如何有效地管理和清理Android设备的内存。 首先,我们需要理解Android内存的类型。Android系统主要有两种内存:堆内存(Heap Memory)和 Dalvik/ART 运行时内存。堆内存...
在安卓应用开发中,图片加载和内存管理是两个至关重要的环节。Android系统作为一个开放源码的平台,提供了丰富的API和工具来帮助开发者处理这些问题。本资料包“安卓Android源码——图片下载以及内存处理防OOM.zip”...
综上所述,防止Android应用内存溢出需要从多个层面进行考虑和优化,包括但不限于理解GC机制、避免内存泄漏、合理使用资源、优化代码结构以及使用专业工具进行分析和调试。只有这样,才能确保应用在运行过程中保持...
6. **使用SoftReference或WeakReference**:使用这两种引用类型可以降低Bitmap的内存保留优先级,使系统在内存紧张时更容易回收Bitmap。 7. **监控内存使用**:利用Android的`ActivityManager`或第三方工具如MAT...
- ** Glide**:一个强大的图片加载库,支持从网络、文件系统或资源中加载图片,并进行高效的内存和磁盘缓存。源码中可能使用Glide进行图片的懒加载和尺寸适配,减少内存消耗,提高性能。 - **Picasso**:另一种...
- 使用WeakReference或SoftReference处理大对象,避免内存泄漏。 - 在适当的时候释放资源,如关闭数据库连接、释放网络连接等。 9. **版本兼容性**: - 使用Support Library或AndroidX库,确保代码兼容不同版本...
在Android开发中,图片下载和内存管理是两个关键的方面,尤其对于性能优化和用户体验有着直接的影响。"图片下载以及内存处理防OOM.zip"这个压缩包文件很可能包含了关于如何在Android应用中有效地处理图片下载和防止...
3. 使用WeakReference或SoftReference:当需要长期保存对象但又不想阻止其被回收时,可以使用这两种弱引用类型。 4. 检查单例和静态变量:确保它们不持有Activity的引用,或者使用Application Context替代Activity ...
这两个库都提供了高效的内存和磁盘缓存策略。例如,Glide库使用LruCache作为内存缓存,基于LRU(Least Recently Used)算法,当内存空间不足时,会优先移除最近最少使用的图片。磁盘缓存则通常采用SQLite数据库或...
本项目“Android应用源码之图片下载以及内存处理防OOM”专注于解决这两个问题,帮助开发者创建更加高效、流畅且内存友好的移动应用。 首先,让我们探讨一下图片下载。在Android应用中,图片通常从网络、本地存储或...
- **内存优化**:避免内存泄漏,减少对象创建,使用WeakReference、SoftReference等。 - **渲染优化**:减少过度绘制,使用硬件加速,优化UI性能。 - **启动速度优化**:减少冷启动时间,延迟非关键组件的初始化...