簡體   English   中英

Android:如何在運行時增加堆大小?

[英]Android: how to increase heap size at runtime?

我的應用程序中有一個圖像緩存,它使用SoftReferences實現。 Dalvik以相對較小的堆啟動應用程序,然后在需求的情況下增加它。 但我想從一開始就讓我的堆大小更大。 這是因為當我已經在緩存中有一些圖像,並且活動開始(例如)或其他峰值內存需求發生時,我的緩存被清除,以便為該峰值需求提供內存。 結果,在峰值消失后,我仍然有2-3 MB的可用空間,但我的緩存是空的!

我看到這個問題的解決方案是預先分配一個更大的正式堆,所以即使峰值消耗為2-3 MB,它仍然有一些空間,所以我的SoftReferences不會被清除。

我發現VMRuntime.getRuntime().setMinimumHeapSize(BIGGER_SIZE)會有所幫助。 尤其是,谷歌使用,在他們的應用程序,如提到這里 但是, VMRuntime類已標記為已棄用,並且在將來的版本中表示將從公共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中刪除位圖圖像。

如果您說的緩存通常很小,您可以自己決定應用程序的有效占用空間,並在沒有SoftReferences的情況下維護自己的緩存。

例如,通過一個簡單的總字節計數器:只需添加或移動用於列表頂部的任何元素,如果它是新的,則將其大小添加到計數器。 如果總字節數超過了經驗法則限制,則從底部刪除,從而減少計數器。 也許LinkedHashMap類對此很有用:它可以像HashMap一樣用作緩存,但它的順序也很像列表。

問題是SoftReferences對於在Java堆空間中完成的分配很有用,但是圖像是本機分配的,因此這種緩存類型在Android上不會真正起作用。

您無法動態增加堆大小。

您可以在清單中使用android:largeHeap =“true”請求使用更多,但是您可能不會獲得比正常更多的堆大小,因為它只是一個請求。

另外,您可以使用本機內存,因此實​​際上可以繞過堆大小限制。

這里有一些關於它的帖子:

這是我為它制作的圖書館:

我不認為你可以或者應該在這個級別影響設備的內存。 讓系統做它的事情,不要反對它。 即使活動開始,您是否需要使用SoftReferences來保存這么大的圖像緩存?

您想檢查貨架上的工作方式:請參閱http://code.google.com/p/shelves/source/browse/trunk/Shelves/src/org/curiouscreature/android/shelves/util/ImageUtilities中的第82行的.java R = 26

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM