`
vyloy
  • 浏览: 80399 次
  • 性别: Icon_minigender_1
  • 来自: 佛山
社区版块
存档分类
最新评论

SoftReference的回收条件

阅读更多
当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
分享到:
评论

相关推荐

    深入探讨 java.lang.ref 包1

    这些引用类的设计允许开发者在特定条件下控制对象的生命周期,尤其是在处理缓存、大型数据结构或者避免内存泄漏时显得尤为重要。本文将深入探讨这个包中的四种主要引用类型:StrongReference、SoftReference、...

    拓胜技术专家教你如何深入理解Java四种引用类型

    当我们希望对象在某些条件下可以被自动回收,但又不依赖这个条件是否被满足时,可以使用弱引用;当我们需要在对象生命周期结束时执行一些特定操作,而不关心对象的具体回收时间时,虚引用就成了我们的选择。 Java中...

    Android内存管理

    - **触发条件**: 垃圾回收通常在内存压力较大或者显式调用System.gc()时发生,但在Android中并不推荐开发者手动触发垃圾回收。 **1.7 Android内存分配小结** Android的内存分配机制相对复杂,涉及到多种内存管理...

    Java中的内存泄漏详解编程小技巧共3页.pdf.zip

    4. 使用弱引用(WeakReference)、软引用(SoftReference)或虚引用(PhantomReference):这些引用类型可以在满足特定条件时让GC自动回收对象。 5. 注意线程和并发:多线程环境下,不正确的同步可能导致内存泄漏,...

    Node.js-MemoryMonitorAndroidApp内存监控器

    - 使用WeakReference和SoftReference:对于可能引发内存泄漏的对象,考虑使用弱引用或软引用。 - 注意静态变量:静态变量会持续存在应用生命周期,可能导致内存泄漏。 - 及时释放资源:例如关闭数据库连接、释放...

    基于Android防止内存溢出浅析

    WeakReference和SoftReference可以创建对对象的弱引用和软引用,它们不会阻止垃圾回收器清理对象。在需要临时存储对象但又不希望影响其生命周期的情况下,可以考虑使用这两种引用类型。 **避免无限制的递归** 无限...

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

    4. **使用WeakReference和SoftReference**:这两种引用类型可以允许GC在内存紧张时回收对象,防止内存溢出。 5. **监控内存使用**:利用Android提供的Memory Profiler工具,分析应用运行时的内存状况,及时发现潜在...

    anroid memory less test

    5. **使用WeakReference和SoftReference**:这些引用类型可以帮助防止内存泄漏,因为它们不会阻止垃圾回收器回收对象。 6. **避免全局大对象**:尽量减少全局变量的使用,特别是那些大对象,如大型数组或复杂的对象...

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

    - 处理API级别的差异,使用条件编译指令或条件语句。 通过学习和研究这个源码,开发者可以深入了解Android UI动画、3D图像处理以及手势识别等技术,同时还能提升在性能优化和资源管理方面的实践能力。

    Java[1].Bug模式详解.rar

    合理使用` WeakReference`和`SoftReference`,及时清理不再使用的对象,可以帮助防止内存泄漏。 5. **异常处理不当**:忽略异常或者使用`Exception`作为捕获所有异常的类型,会隐藏问题,阻碍调试。应精确捕获和...

    Java的GC机制探微.pdf

    - SoftReference、WeakReference和PhantomReference的使用不当。 - 大对象直接进入老年代,可能导致频繁的Major GC。 - 类加载器未正确卸载,导致方法区内存泄漏。 7. **JVM内存监控工具** - **jconsole**:...

    突破程序员基本功的16课.part2

    4.4.8 考虑使用SoftReference 4.5 小结 第5课 表达式中的陷阱 5.1 关于字符串的陷阱 5.1.1 JVM对字符串的处理 5.1.2 不可变的字符串 5.1.3 字符串比较 5.2 表达式类型的陷阱 5.2.1 表达式类型的自动提升 ...

    Android:回购Android实践

    理解不同类型的GC模式(如:Minor GC、Major GC、Full GC)和触发条件,可以帮助开发者避免不必要的内存抖动和应用卡顿。 4. 性能优化:内存优化是Android性能优化的重要部分。通过使用轻量级数据结构、避免大数据...

    阿里巴巴&字节抖音 面试题汇总(精华版).pdf

    - **软引用**:通过SoftReference类创建,垃圾回收器只有在内存不足时才会回收该对象。 - **虚引用**:通过PhantomReference类创建,几乎不占用内存,主要用于跟踪对象的回收状态。 #### 13. HTTP/HTTPS协议 - **...

    java内存模型和一些多线程的资料

    例如,当不再需要对象时,没有正确地释放其引用,导致垃圾收集器无法回收。使用WeakReference、SoftReference等特殊引用类型可以有效防止内存泄漏。 10. **线程池** Java的ExecutorService和ThreadPoolExecutor类...

    Android应用性能优化

    2. **使用WeakReference和SoftReference**:在处理大对象或可能导致内存泄漏的数据结构时,可以使用WeakReference和SoftReference来防止内存泄漏。 3. **减少对象创建**:过多的对象创建会增加内存分配和回收的压力...

    【05-面向对象(下)】

    •对一个final变量来说,不管它是类变量、实例变量,还是局部变量,只要该变量满足3个条件,这个final变量就 不再是一个变量,而是相当于一个直接量。  –使用final修饰符修饰;  –在定义该final变量时指定...

    Android编程使用缓存优化ListView的方法

    软引用在内存不足时会被自动回收,从而避免内存溢出。例如: ```java Map, SoftReference&lt;Bitmap&gt;&gt; map; ``` 其次,我们来讨论SD卡缓存。SD卡缓存是将数据存储在外部存储设备(如SD卡)上,以便在下次需要时直接从...

Global site tag (gtag.js) - Google Analytics