Утечка статической памяти в контексте - PullRequest
4 голосов
/ 07 декабря 2011

Я проводил некоторые исследования и до сих пор не уверен на 100%, может ли это привести к утечке памяти.Я использую кнопку просмотра (v.context).Я думаю, что я в порядке, так как контекст не хранится как статический, но я хотел бы получить некоторую обратную связь, если это возможно.Основная проблема, которую я вижу, связана с OSMonitor ... значение (M) идет вверх и вверх и вверх.С каждым открытием / закрытием виджета и поворотом экрана.

32M 43M 61M 77M и т. Д ...

Я не уверен, является ли (M) мегабайтами или мегабитами.Если это основано на стеке, я предполагаю мегабиты perhpas, так как большинство высокопроизводительных устройств ограничено 32/48 МБ в стеке (или что-то).

Спасибо за отзыв / дополнительные глаза!

Это приложение Banner на Маркете, кстати ...

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;
}

1 Ответ

2 голосов
/ 15 января 2012

Не должно быть утечки. Из-за особенностей Dalvik VM, куча продолжает расти, когда она используется, пока не достигнет максимального размера кучи. Тем не менее, может быть достаточно места в куче для ваших объектов. Я бы предложил ограничить память процесса (кучу) в образе эмулятора и посмотреть, действительно ли вы получили ошибку OutOfMemoryError. При создании эмулятора вы хотите установить свойство «Максимальный размер кучи приложения виртуальной машины», например, до 32 (измеряется в мегабайтах).

Если вы получили ошибку OutOfMemoryError, вы должны более внимательно посмотреть на Eclipse MAT.

P.S .: Просто понял, что вы, вероятно, должны использовать контекст приложения в вашем случае, а не Activity. Если вы запускаете его из действия, рассмотрите getApplicationContext вместо передачи действия в качестве контекста. Статические вещи могут пережить экземпляры Activity.

...