我正在开发一个需要加载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
最近我看到这篇文章,它对 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 中的软引用”文章来研究软引用的含义:
https://www.baeldung.com/java-soft-references
我理解这篇文章的问题是它通过术语“软可达对象”定义了术语“软引用”,但我不知道“软可达对象”是什么意思。
也就是说,堆中的对象要么有对它的引用,要么没有,对吗?
引用要么指向有效对象,要么为空,对吗?
什么时候对象变得“软可及”?
还是我弄错了?
当我在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) 我知道软引用只会在 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)有解决方案吗?
我有一个类,它的实例被底层 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)