如果你想写一个 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 这类的程序时常会用到,因为这类程序需要取得某对象的信息,但是不可以 影响此对象的垃圾收集。
1 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);
}
分享到:
相关推荐
3. **使用弱引用和软引用**: WeakReference和SoftReference是Java提供的两种特殊引用类型,它们不会阻止GC回收对象。弱引用在GC运行时会立即清除,而软引用则在系统内存紧张时才会被回收。合理使用这两种引用,可以...
本篇文章将深入探讨Android内存管理的两个核心概念:堆(Heap)和栈(Stack),以及如何理解和解决Android内存溢出问题。 1. 堆与栈 堆和栈是Java虚拟机(JVM)中的两种主要内存区域,它们各自具有特定的用途和...
- 使用WeakReference或SoftReference:这两种引用类型不会阻止GC回收对象,可以避免内存泄漏。 - 控制Bitmap使用:使用BitmapFactory.Options来控制解码时的大小,避免加载过大图片导致内存溢出。 - 适当使用内存...
WeakReference在对象没有其他强引用时会自动被GC回收,而SoftReference则在系统内存紧张时才回收。 4. **Activity管理**:确保正确处理Activity的生命周期,特别是在onPause()和onStop()方法中释放可重用的资源,如...
在安卓应用开发中,图片加载和内存管理是两个至关重要的环节。Android系统作为一个开放源码的平台,提供了丰富的API和工具来帮助开发者处理这些问题。本资料包“安卓Android源码——图片下载以及内存处理防OOM.zip”...
- **比较视图(Comparison)**:对比两个不同的heap dump,找出内存消耗的变化。 - **碎片分析(Shallow Heap / Retained Heap)**:区分对象自身占用的内存(Shallow Heap)和其间接导致的内存占用(Retained ...
- 使用WeakReference或SoftReference来存储可能长时间存在的对象。 - 注意广播接收器、服务和ContentProvider的生命周期管理。 6. **与其他内存分析工具的比较**: - LeakCanary:轻量级的内存泄漏检测库,适合...
5. **使用WeakReference和SoftReference**:这两类引用可以帮助我们创建一种“弱连接”,让对象在不再被其他强引用时能够被GC回收。在处理大对象或者需要延迟回收的场景下,可以考虑使用。 6. **避免内存抖动**:...
5. **使用BitmapFactory.decodeStream**或**BitmapRegionDecoder**: 这两个方法可以从输入流或文件中按需解码图片,避免一次性加载整个图片到内存中。 6. **利用硬件加速**: 在Android 3.0及以上版本,可以开启硬件...
在Android开发中,图片下载和内存管理是两个关键的环节,尤其对于性能优化和避免内存溢出(Out of Memory, OOM)问题至关重要。本文将深入探讨这些知识点,并结合源码学习来提升Android应用的效率。 一、图片下载 ...
内存溢出(Memory Overflow)和内存泄露(Memory Leak)是两个常见的问题,它们会导致程序性能下降,甚至崩溃。了解并解决这些问题对于优化Java应用程序至关重要。 内存溢出是指程序在申请内存时,无法在堆内存中...
在Android开发中,内存管理是至关重要的一个环节,因为不当的内存使用可能导致应用程序崩溃或性能下降,最常见的问题就是内存溢出(Out Of Memory,简称OOM)。本文将深入浅析如何在Android环境中预防和处理内存溢出...
使用WeakReference、SoftReference等可以帮助识别和处理这类问题。 4. **数据结构选择**:根据实际需求选择合适的数据结构,避免使用占用内存较大的数据结构如ArrayList代替LinkedList。 5. **使用内存分析工具**...
1. 适当地使用弱引用(WeakReference)、软引用(SoftReference)和虚引用(PhantomReference)。 2. 避免使用静态集合类,尤其是在不需要长期存储数据的情况下。 3. 使用完线程局部变量后及时清理。 4. 及时解除...
Android系统基于Dalvik或ART(Android RunTime)虚拟机,这两种虚拟机都对内存管理有特定的规定。由于Android设备的内存有限,理解内存机制有助于优化应用性能,防止内存溢出(Memory Leak)等问题。 首先,Android...
但在某些情况下,如使用了WeakReference、SoftReference等弱引用,或者有线程局部变量(ThreadLocal)未正确清理,就可能导致类加载器无法被回收,从而引发内存泄露。 三、内存泄露的诊断方法 1. **使用工具辅助...
1. 使用弱引用(WeakReference)和软引用(SoftReference):这两种引用不会阻止对象被GC回收,可以在不再需要对象时使用它们来保持对对象的引用。 2. 注意集合类的使用:确保在不再需要集合中的元素时,从集合中移...
这两个区域由所有线程共享,GC会关注这些区域的内存管理。 - **直接内存**:不在JVM规范的运行时数据区内,但使用NIO可以直接分配,以提升性能,减少Java堆与本地堆间的数据复制。 10. **程序计数器**:记录当前...
- **合理使用`WeakReference`、`SoftReference`和`PhantomReference`**:这些引用类型可以帮助更好地控制对象的生命周期,从而减少内存泄漏的风险。 - **监控和分析内存使用情况**:使用工具如VisualVM等来监控内存...