Android:如何在运行时增加堆大小?

JBM*_*JBM 16 heap size android

我的应用程序中有一个图像缓存,它使用SoftReferences实现.Dalvik以相对较小的堆启动应用程序,然后在需求的情况下增加它.但我想从一开始就让我的堆大小更大.这是因为当我已经在缓存中有一些图像,并且活动开始(例如)或其他峰值内存需求发生时,我的缓存被清除,以便为该峰值需求提供内存.结果,在峰值消失后,我仍然有2-3 MB的可用空间,但我的缓存是空的!

我看到这个问题的解决方案是预先分配一个更大的正式堆,所以即使峰值消耗为2-3 MB,它仍然有一些空间,所以我的SoftReferences不会被清除.

我发现这VMRuntime.getRuntime().setMinimumHeapSize(BIGGER_SIZE)会有所帮助.尤其是,谷歌使用,在他们的应用程序,如提到这里.但是,VMRuntime类已标记为已弃用,并且在将来的版本中表示将从公共API中删除.所以setMinimumHeapSize不是一个永久的解决方案.

然后我如何让Dalvik在启动时增加我的堆?

目前,我通过分配一个大型数组并释放它来使用一种非常简单和俗气的技术.这使得Dalvik成长为我想要的堆.但是,我确信必须有更优雅的方式.你能告诉我吗?

Sur*_*uru 6

而不是增加堆大小,你可以做更好的事情.正如您所说,您在使用SoftReferences实现的应用程序中维护缓存.最好的事情是使用LruCache你可以做这样的事情:

private LruCache<String, Bitmap> bitmapCache;
final int memClass;
int cacheSize;

memClass = ((ActivityManager) context.getSystemService(
    Context.ACTIVITY_SERVICE)).getMemoryClass();
Run Code Online (Sandbox Code Playgroud)

返回当前设备的近似每应用程序内存类.这可以让您了解应该对应用程序施加的内存限制有多难,以使整个系统最佳运行.返回值以兆字节为单位; 基线Android内存类是16(恰好是这些设备的Java堆限制); 一些具有更多内存的设备可能会返回24或更高的数字.

cacheSize = 1024 * 1024 * memClass / 10;
bitmapCache = new LruCache<String, Bitmap>(cacheSize) {
  @Override
  protected int sizeOf(String key, Bitmap value) {
    return value.getHeight() * value.getRowBytes();
 }
};
Run Code Online (Sandbox Code Playgroud)

如果内存超过LruCache的内存并加载新图像,它将从LruCache中删除位图图像.