Утечка статической памяти с Context

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

32 м 43 м 61 м 77 м и т. д...

Я не уверен, является ли (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;
}

person kenyu73    schedule 07.12.2011    source источник
comment
Если вы считаете, что происходит утечка памяти, используйте DDMS для создания дампа кучи и анализа результатов с помощью утилиты Eclipse MAT.   -  person CommonsWare    schedule 08.12.2011
comment
@CommonsWare Я следовал руководству по его использованию, но немного ошеломлен. я преобразовал и открыл его, используя eclipse, но я не мог использовать данные. путь ко многому.   -  person kenyu73    schedule 08.12.2011


Ответы (1)


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

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

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

person Markus Junginger    schedule 14.01.2012