gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:34:21 24 4
gpt4 key购买 nike

我的应用程序中有一个使用 SoftReferences 实现的图像缓存。 Dalvik 使用相对较小的堆启动应用程序,然后在需要时增加它。但我想从一开始就让我的堆大小更大。那是因为当我在缓存中已经有一些图像,并且 Activity 开始(例如)或发生其他峰值内存需求时,我的缓存被清除以让内存满足该峰值需求。结果,高峰期过去后,我还有 2-3 MB 的可用空间,但我的缓存是空的!

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

我发现 VMRuntime.getRuntime().setMinimumHeapSize(BIGGER_SIZE) 会很有帮助。特别是,谷歌在他们的应用程序中使用了它,正如提到的 here .但是,VMRuntime该类被标记为已弃用,并在未来的版本中从公共(public) API 中删除。所以 setMinimumHeapSize 并不是永久的解决方案。

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

目前我通过分配一个大数组并释放它来使用一种非常直接和俗气的技术。这使得 Dalvik 可以随心所欲地增长堆。但是,我确信必须有更优雅的方式来做到这一点。请告诉我好吗?

最佳答案

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

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

memClass = ((ActivityManager) context.getSystemService(
Context.ACTIVITY_SERVICE)).getMemoryClass();

返回当前设备的每个应用程序的近似内存类。这让您了解应该对应用程序施加多大的内存限制才能让整个系统发挥最佳作用。返回值以兆字节为单位;基准 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();
}
};

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

关于Android:如何在运行时增加堆大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4119405/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com