2011-12-07 106 views
4

我一直在做一些研究,如果這可能會導致內存泄漏 我仍然不是100%確定。我正在使用按鈕視圖(v.context)。我認爲我很好,因爲上下文不是以靜態方式存儲的,但如果可能的話,我想要一些反饋。我看到的主要問題是OSMonitor ...(M)值上升和上升。隨着每個打開/關閉的部件和屏幕旋轉。靜態內存泄漏與上下文

32M 43M 61M 77M 等等

我不知道如果(M)爲兆字節或Megebits。如果這是基於堆棧,我假設Megebits perhpas,因爲大多數高端設備被限制在堆棧上的32/48 MB(或某物)。

感謝您的反饋/額外的眼睛!

這是市場的旗幟應用,順便說一句...

public class Globals { 

public static final String PREF_NAME  = "BannerPreferences"; 
public static final int  MAX_TEXT_SIZE = 20; 

// refresh ALL widgets loaded on the user's screens 
// this could be for removing or adding 'pendingIntents or during bootup 
public static void refreshAllWidgets(Context context) { 
    Logger.d("BANNER", "Globals:refreshAllWidgets"); 

    invalidateWidgets(context, BannerWidget.class); // 1x4 
    invalidateWidgets(context, BannerWidget1x2.class); 
    invalidateWidgets(context, BannerWidget2x2.class); 
} 

// there has to be a API way to do this!! Until then, just loop thru all 
// widget_provider classes.. 
private static void invalidateWidgets(Context context, Class<?> cls) { 

    ComponentName comp = new ComponentName(context, cls); 
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 

    int[] appWidgetIds = appWidgetManager.getAppWidgetIds(comp); 

    for (int i = 0; i < appWidgetIds.length; i++) { 
     BannerWidgetBase.updateAppWidget(context, appWidgetManager, appWidgetIds[i]); 
    } 

    appWidgetIds = null; 
} 
+0

如果您認爲自己在泄漏內存,請使用DDMS生成堆轉儲並分析Eclipse MAT實用程序中的結果。 – CommonsWare

+0

@CommonsWare我遵循使用它的指南,但有點不知所措。我轉換並打開它使用eclipse,但我無法完全使用數據。方式很多。 – kenyu73

回答

2

有沒有被泄漏。由於Dalvik虛擬機的特性,堆在使用時會不斷增長,直到達到最大堆大小。但是,堆中可能有足夠的空間來存放對象。我建議限制進程內存(堆)在模擬器圖像,看看你是否真的得到一個OutOfMemoryError。創建模擬器時,您需要設置一個屬性「Max VM應用程序堆大小」,例如,到32(以兆字節度量)。

如果你得到一個OutOfMemoryError,你應該仔細看看Eclipse MAT。

P.S .:剛纔意識到你應該在你的情況下使用應用程序上下文,而不是活動。如果您從活動中觸發它,請考慮getApplicationContext,而不是將活動作爲上下文傳遞。靜態東西可能比活動實例長。