标签: soft-references

使用SoftReference在Android上缓存Bitmap会导致OOM

我正在开发一个需要加载Bitmap的应用程序.并使用一个SoftReference缓存.我将每个软引用与a相关联,ReferenceQueue并使用哈希映射来访问SoftReference.如下所示:

public static class MemCache {

    final private ReferenceQueue<Bitmap> queue = new ReferenceQueue<Bitmap>();
    private Map<String, SoftReference<Bitmap>> hash = null;

    public MemCache() {
        hash = Collections.synchronizedMap(
            new LinkedHashMap<String, SoftReference<Bitmap>>()
        );
    }

    public synchronized Bitmap put(String key, Bitmap value) {
        clean();
        SoftReference<Bitmap> ref = new SoftReference<Bitmap>(value, queue);
        SoftReference<Bitmap> res = hash.put(key, ref);
        if (res == null) return null;
        return res.get();
    }

    public synchronized Bitmap get(Object key) {
        clean();
        SoftReference<Bitmap> ref = hash.get(key);
        if (ref == null) …
Run Code Online (Sandbox Code Playgroud)

java android garbage-collection out-of-memory soft-references

2
推荐指数
1
解决办法
5117
查看次数

Soft Reference中GC在java中的作用

最近我看到这篇文章,它对 Jenkins 进行 GC 调整,其中讨论了这个参数:-XX:SoftRefLRUPolicyMSPerMB

https://jenkins.io/blog/2016/11/21/gc-tuning/

我理解它可以防止 OOM 错误,因为它在达到阈值时会清除软引用对象。

1) 这个阈值(-XX:SoftRefLRUPolicyMSPerMB 中默认 = 1000ms)是什么意思?这个值代表什么?

2)我的jenkins似乎有80%的软引用(使用HProf观察)

3)正如上面文章中所建议的,如果我将这个 -XX:SoftRefLRUPolicyMSPerMB 标志减少到 10ms 会产生什么后果?

注意:我们使用 G1GC

谢谢,
哈利

java garbage-collection soft-references g1gc jenkins

2
推荐指数
1
解决办法
5890
查看次数

什么是软可达对象?

我正在尝试通过这篇“Java 中的软引用”文章来研究软引用的含义:

https://www.baeldung.com/java-soft-references

我理解这篇文章的问题是它通过术语“软可达对象”定义了术语“软引用”,但我不知道“软可达对象”是什么意思。

也就是说,堆中的对象要么有对它的引用,要么没有,对吗?

引用要么指向有效对象,要么为空,对吗?

什么时候对象变得“可及”?

还是我弄错了?

java garbage-collection soft-references

2
推荐指数
1
解决办法
507
查看次数

软引用的行为与Android上的预期不同

当我在Android上使用软引用时遇到一个奇怪的问题。我为位图缓存实现了一个类,源代码如下:

public class ImageCache
{
    private static HashMap<String, SoftReference<Bitmap>> mCache = new HashMap<String, SoftReference<Bitmap>>();
    private static final String TAG = "ImageCache";
    public static Bitmap getBitmap(String url)
    {
        Bitmap bitmap = null;
        if (mCache.containsKey(url))
        {
            Log.d(TAG, "use cache: " + url);
            bitmap = mCache.get(url).get();
            if (bitmap != null)
            {
                return bitmap;
            }
            else
            {
                Log.w(TAG, "#######################soft ref was collected!!!");
            }
        }
        bitmap = BitmapFactory.decodeFile(url);

        if (bitmap == null)
        {
            Log.e(TAG, "#####jpg not found");
            return null;
        }
        bitmap = Bitmap.createScaledBitmap(bitmap, 320, 240, …
Run Code Online (Sandbox Code Playgroud)

android soft-references

1
推荐指数
1
解决办法
1163
查看次数

如何强制释放软引用

我知道软引用只会在 JVM 内存不足时释放。我怎样才能手动完成呢?

我的代码:

  Object object = new Object();
  ReferenceQueue queue = new ReferenceQueue();
  SoftReference softReference= new SoftReference(object, queue);
  object = null;
  System.gc();
  //now I force release soft reference.
Run Code Online (Sandbox Code Playgroud)

最新的java版本(8-11)有解决方案吗?

java garbage-collection soft-references

1
推荐指数
1
解决办法
1329
查看次数

WeakReference 的罕见用法?

我有一个类,它的实例被底层 flatform 初始化和使用。

class MyAttributeConverter implements AttributeConverter<XX, YY> {

    public YY convertToDatabaseColumn(XX attribute) { return null; }

    public XX convertToEntityAttribute(YY dbData) { return null; }
}
Run Code Online (Sandbox Code Playgroud)

没有错,我想我需要添加一些静态方法以用作方法引用。

    private static MyAttributeConverter instance;

    // just a lazy-initialization;
    // no synchronization is required;
    // multiple instantiation is not a problem;
    private static MyAttributeConverter instance() {
        if (instance == null) {
            instance = new MyAttributeConverter();
        }
        return instance;
    }

    // do as MyAttributeConverter::toDatabaseColumn(xx)

    public static YY toDatabaseColumn(XX attribute) {
        return instance().convertToDatabaseColumn(attribute);
    }

    public static …
Run Code Online (Sandbox Code Playgroud)

java weak-references soft-references

1
推荐指数
1
解决办法
72
查看次数