当gc执行时,决定SoftReference回收有两个因素:
- SoftReference的timestamp
- 有多少空闲空间
在server模式下,会用-Xmx参数得到空闲空间大小。
在client模式下,会用当前heap最大空闲空间大小。
简单来说,server模式下会优先扩大heap大小,client模式下会优先回收垃圾。
SoftReference类中,有一个timestamp:
public class SoftReference<T> extends Reference<T> {
/* Timestamp clock, updated by the garbage collector
*/
static private long clock;
/* Timestamp updated by each invocation of the get method. The VM may use
* this field when selecting soft references to be cleared, but it is not
* required to do so.
*/
private long timestamp;
......
}
在新建SoftReference对象和调用SoftReference.get时都会使timestamp更新为clock的值。而clock代表的是上次gc的时间。
SoftRefLRUPolicyMSPerMB默认为1000,即1s。代表每1MB空闲空间大小SoftReference保留1s。
是否回收的条件:
clock - timestamp <= freespace * SoftRefLRUPolicyMSPerMB
举例来说,clock为1000,timestamp为300,空闲空间为1MB。
1000 - 300 <= 1000 * 1
所以不会被回收。
一个值得注意的地方是,SoftReference会至少经历1次gc而不被回收。
参考:http://jeremymanson.blogspot.com/2009/07/how-hotspot-decides-to-clear_07.html
分享到:
相关推荐
这些引用类的设计允许开发者在特定条件下控制对象的生命周期,尤其是在处理缓存、大型数据结构或者避免内存泄漏时显得尤为重要。本文将深入探讨这个包中的四种主要引用类型:StrongReference、SoftReference、...
当我们希望对象在某些条件下可以被自动回收,但又不依赖这个条件是否被满足时,可以使用弱引用;当我们需要在对象生命周期结束时执行一些特定操作,而不关心对象的具体回收时间时,虚引用就成了我们的选择。 Java中...
- **触发条件**: 垃圾回收通常在内存压力较大或者显式调用System.gc()时发生,但在Android中并不推荐开发者手动触发垃圾回收。 **1.7 Android内存分配小结** Android的内存分配机制相对复杂,涉及到多种内存管理...
4. 使用弱引用(WeakReference)、软引用(SoftReference)或虚引用(PhantomReference):这些引用类型可以在满足特定条件时让GC自动回收对象。 5. 注意线程和并发:多线程环境下,不正确的同步可能导致内存泄漏,...
- 使用WeakReference和SoftReference:对于可能引发内存泄漏的对象,考虑使用弱引用或软引用。 - 注意静态变量:静态变量会持续存在应用生命周期,可能导致内存泄漏。 - 及时释放资源:例如关闭数据库连接、释放...
WeakReference和SoftReference可以创建对对象的弱引用和软引用,它们不会阻止垃圾回收器清理对象。在需要临时存储对象但又不希望影响其生命周期的情况下,可以考虑使用这两种引用类型。 **避免无限制的递归** 无限...
4. **使用WeakReference和SoftReference**:这两种引用类型可以允许GC在内存紧张时回收对象,防止内存溢出。 5. **监控内存使用**:利用Android提供的Memory Profiler工具,分析应用运行时的内存状况,及时发现潜在...
5. **使用WeakReference和SoftReference**:这些引用类型可以帮助防止内存泄漏,因为它们不会阻止垃圾回收器回收对象。 6. **避免全局大对象**:尽量减少全局变量的使用,特别是那些大对象,如大型数组或复杂的对象...
- 处理API级别的差异,使用条件编译指令或条件语句。 通过学习和研究这个源码,开发者可以深入了解Android UI动画、3D图像处理以及手势识别等技术,同时还能提升在性能优化和资源管理方面的实践能力。
合理使用` WeakReference`和`SoftReference`,及时清理不再使用的对象,可以帮助防止内存泄漏。 5. **异常处理不当**:忽略异常或者使用`Exception`作为捕获所有异常的类型,会隐藏问题,阻碍调试。应精确捕获和...
- SoftReference、WeakReference和PhantomReference的使用不当。 - 大对象直接进入老年代,可能导致频繁的Major GC。 - 类加载器未正确卸载,导致方法区内存泄漏。 7. **JVM内存监控工具** - **jconsole**:...
4.4.8 考虑使用SoftReference 4.5 小结 第5课 表达式中的陷阱 5.1 关于字符串的陷阱 5.1.1 JVM对字符串的处理 5.1.2 不可变的字符串 5.1.3 字符串比较 5.2 表达式类型的陷阱 5.2.1 表达式类型的自动提升 ...
理解不同类型的GC模式(如:Minor GC、Major GC、Full GC)和触发条件,可以帮助开发者避免不必要的内存抖动和应用卡顿。 4. 性能优化:内存优化是Android性能优化的重要部分。通过使用轻量级数据结构、避免大数据...
- **软引用**:通过SoftReference类创建,垃圾回收器只有在内存不足时才会回收该对象。 - **虚引用**:通过PhantomReference类创建,几乎不占用内存,主要用于跟踪对象的回收状态。 #### 13. HTTP/HTTPS协议 - **...
例如,当不再需要对象时,没有正确地释放其引用,导致垃圾收集器无法回收。使用WeakReference、SoftReference等特殊引用类型可以有效防止内存泄漏。 10. **线程池** Java的ExecutorService和ThreadPoolExecutor类...
2. **使用WeakReference和SoftReference**:在处理大对象或可能导致内存泄漏的数据结构时,可以使用WeakReference和SoftReference来防止内存泄漏。 3. **减少对象创建**:过多的对象创建会增加内存分配和回收的压力...
•对一个final变量来说,不管它是类变量、实例变量,还是局部变量,只要该变量满足3个条件,这个final变量就 不再是一个变量,而是相当于一个直接量。 –使用final修饰符修饰; –在定义该final变量时指定...
软引用在内存不足时会被自动回收,从而避免内存溢出。例如: ```java Map, SoftReference<Bitmap>> map; ``` 其次,我们来讨论SD卡缓存。SD卡缓存是将数据存储在外部存储设备(如SD卡)上,以便在下次需要时直接从...