Страница 1 из 2

Утечка памяти в Android приложениях

Добавлено: 01 окт 2013, 09:46
hard
Прочитав статью - http://habrahabr.ru/post/116163/
заинтересовался нет ли в моем приложении утечки памяти. Нашел ее, но не могу понять что это:

Мне выдается сообщение:

One instance of "android.graphics.Bitmap" loaded by "<system class loader>" occupies 7 179 280 (59,65%) bytes. The memory is accumulated in one instance of "byte[]" loaded by "<system class loader>".

Я начал искать причину, убрал практически все картинки из приложения, загрузка памяти все равно остается 11-12мб и 10 из них заняты массивом который описан в ошибке.

К сообщению внизу я прикрепил три скриншота с разбором кучи. Подскажите что это может быть? Может это из за того что я использую боковую навигацию?
1.jpg
1.jpg (222.57 КБ) 12328 просмотров
2.jpg
2.jpg (215.64 КБ) 12328 просмотров
3.jpg
3.jpg (251.78 КБ) 12328 просмотров

Re: Утечка памяти в Android приложениях

Добавлено: 01 окт 2013, 09:50
rezak90
и что мы здесь понять должны? ну текут битмапы, рефактори код и смотри где идёт утечка, смотри по хипу в каком месте растёт, стримы может где не закрываешь и т.д.

Re: Утечка памяти в Android приложениях

Добавлено: 01 окт 2013, 10:19
Mikhail_dev
Сходу не скажу, но что мешает сделать два дампа памяти и посмотреть, где проблема?
Я начал искать причину, убрал практически все картинки из приложения, загрузка памяти все равно остается 11-12мб и 10 из них заняты массивом который описан в ошибке.
Практически все, но не все я так понимаю. Может немного подебажить данные куски кода, где осталось создание картинок?
Это вроде как MAT? А стандартными средствами не пробовали что-либо найти? Например посмотреть Method Profiling, действительно ли GC зверствует или вы что-то перепутали.

Re: Утечка памяти в Android приложениях

Добавлено: 01 окт 2013, 16:30
anber
Где-то здесь было чудное видео, щас пороюсь, а вот собственно и оно: http://www.youtube.com/watch?v=_CruQY55HOk
Среди прочего там прозвучала мысль что быстрее все утечку памяти исправит тот кто хорошо разбирается в том что у него происходит в проекте.

Re: Утечка памяти в Android приложениях

Добавлено: 02 окт 2013, 12:42
hard
Спасибо всем за советы) я начинающий поэтому сразу все понять не могу, первый раз попробовал проверить на утечку памяти. Проэтк представляет собой просто список элементов в листвьев с картинками. При изменение количества элементов в списке с 10 до 1000 использование памяти увеличилось незначительно. Даже когда открыта активити с картиной одной и кнопкой используемая память 11мб. Как то сраннно.

Re: Утечка памяти в Android приложениях

Добавлено: 02 окт 2013, 12:52
Foenix
hard писал(а):Спасибо всем за советы) я начинающий поэтому сразу все понять не могу, первый раз попробовал проверить на утечку памяти. Проэтк представляет собой просто список элементов в листвьев с картинками. При изменение количества элементов в списке с 10 до 1000 использование памяти увеличилось незначительно. Даже когда открыта активити с картиной одной и кнопкой используемая память 11мб. Как то сраннно.
неплохо было бы знать, тогда, как работает листвью, тогда это тебе не показалось бы странным.

Re: Утечка памяти в Android приложениях

Добавлено: 02 окт 2013, 12:55
anber
hard писал(а):Спасибо всем за советы) я начинающий поэтому сразу все понять не могу, первый раз попробовал проверить на утечку памяти. Проэтк представляет собой просто список элементов в листвьев с картинками. При изменение количества элементов в списке с 10 до 1000 использование памяти увеличилось незначительно. Даже когда открыта активити с картиной одной и кнопкой используемая память 11мб. Как то сраннно.
Не удивляйся, это обычная черная андроидовская магия :lol:

Re: Утечка памяти в Android приложениях

Добавлено: 02 окт 2013, 14:49
rezak90
покажи адаптер свой и view которое используешь в качестве айтем листа

Re: Утечка памяти в Android приложениях

Добавлено: 02 окт 2013, 20:54
hard

Код: Выделить всё

public class CustomCursorAdapter extends CursorAdapter {

	public CustomCursorAdapter(Context context, Cursor c) {
		super(context, c);
	}

	@Override
	public View newView(Context context, Cursor cursor, ViewGroup parent) {

		LayoutInflater inflater = LayoutInflater.from(parent.getContext());
		View retView = null;
		
		if(parametr.equals("list")){
			retView = inflater.inflate(R.layout.elements_list, parent, false);
		}else{
			retView = inflater.inflate(R.layout.elements_grid, parent, false);
		}
		return retView;
	}

	@Override
	public void bindView(View view, Context context, Cursor cursor) {
		
			TextView textViewPersonName = (TextView) view.findViewById(R.id.textElement);
			textViewPersonName.setText(cursor.getString(cursor.getColumnIndex("name")));
			
			TextView fakyltet = (TextView)view.findViewById(R.id.textView1);
			fakyltet.setVisibility(View.VISIBLE);
			
			TextView kyrs = (TextView)view.findViewById(R.id.textView2);
			kyrs.setVisibility(View.VISIBLE);
			kyrs.setText("Курс: "+cursor.getString(cursor.getColumnIndex("kyrs")));
			
			ImageView image = (ImageView) view.findViewById(R.id.imageView2);
			if (new File(cursor.getString(cursor.getColumnIndex("path")))
					.exists()) {
				image.setVisibility(View.VISIBLE);
			} else {
				image.setVisibility(View.GONE);
			}
		
		
	}
}

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <RelativeLayout
        android:layout_width="100dp"
        android:layout_height="110dp"
        android:layout_marginBottom="5dp"
        android:layout_marginTop="5dp" >

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="130dp"
            android:layout_height="130dp"
            android:src="@drawable/umk" />

        <ImageView
            android:id="@+id/imageView2"
            android:layout_width="35dp"
            android:layout_height="35dp"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:src="@drawable/dow"
            android:visibility="gone" />
    </RelativeLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="5dp"
        android:layout_marginTop="10dp"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/textElement"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="TextView"
            android:textAppearance="?android:attr/textAppearanceListItemSmall"
            android:textSize="@dimen/itemSize" />

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TextView" />

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TextView" />

    </LinearLayout>


</LinearLayout>
появились сомнения что это листвьев виноват потому что вот обычный лейаут как заставка для приложения - на нем и то занято 11мб памяти. и как сказал при загрузки в листвьев не 10 а 1000 элементов загрузка памяти увеличивается всего то на 500кб.

Код: Выделить всё

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#4682B4"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:orientation="vertical" >

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="center_horizontal"
            android:gravity="center_horizontal"
            android:orientation="horizontal" >

            <ImageView
                android:id="@+id/imageView1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:src="@drawable/m8" />

        </LinearLayout>

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:orientation="horizontal" >

        <EditText
            android:id="@+id/editText1"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_gravity="center_horizontal"
            android:background="#F0F8FF"
            android:ems="10"
            android:hint="Логин"
            android:paddingLeft="10dp"
            android:textColor="#808080"
            android:visibility="gone" />

        <View
            style="@style/Divider"
            android:visibility="gone" />

        <EditText
            android:id="@+id/editText2"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_gravity="center_horizontal"
            android:background="#F0F8FF"
            android:ems="10"
            android:hint="Пароль"
            android:inputType="textPassword"
            android:paddingLeft="10dp"
            android:textColor="#808080"
            android:visibility="gone" >

            <requestFocus />
        </EditText>

        <Button
            android:id="@+id/button1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_marginTop="5dp"
            android:background="@drawable/butsel"
            android:onClick="onClick"
            android:padding="10dp"
            android:text="Войти"
            android:textColor="#808080"
            android:textSize="@dimen/buttonSize" />

    </LinearLayout>

</LinearLayout>

Re: Утечка памяти в Android приложениях

Добавлено: 02 окт 2013, 21:22
rezak90
вот на первый взгляд так не скажешь, существенного ничего, но есть сомнения и догадки:
1) лейауты не оптимизированы, можно обойтись меньшей вложенностью, но это не существенно а лишь замечания...
2) что это за картинки: m8 и umk - сколько они весят и какое разрешение и формат?
3) используется устаревший конструктор CursorLoader который уже с 11 api deprecated;
4) исходя из 3-го пункта, наверняка не правильно используешь курсоры, которые следует грузить в LoaderManager с CursorLoader.

P.S. видишь как много вариантов... к тому же это ещё не весь код ты показал

Re: Утечка памяти в Android приложениях

Добавлено: 02 окт 2013, 21:33
hard
спасибо, за подсказку, на счет третьего пункта задумывался. Получается это нужно создавать свой контент менеджер?! Пункт 2 - картинки маленькие. Сейчас запустил программу на эмуляторе а не на телефоне, загрузка памяти 4мб!!!! :?: :?: :?:

Re: Утечка памяти в Android приложениях

Добавлено: 02 окт 2013, 21:49
rezak90
hard писал(а):Получается это нужно создавать свой контент менеджер?!
да, там пару строк кода
hard писал(а):Сейчас запустил программу на эмуляторе а не на телефоне, загрузка памяти 4мб!!!! :?: :?: :?:
не стоит сравнивать и тестировать производительность на эмуляторе

Re: Утечка памяти в Android приложениях

Добавлено: 02 окт 2013, 21:54
hard
спасибо,буду копать

Re: Утечка памяти в Android приложениях

Добавлено: 02 окт 2013, 22:16
anber
hard писал(а):спасибо, за подсказку, на счет третьего пункта задумывался. Получается это нужно создавать свой контент менеджер?! Пункт 2 - картинки маленькие. Сейчас запустил программу на эмуляторе а не на телефоне, загрузка памяти 4мб!!!! :?: :?: :?:
Разрешения экрана на телефоне и эмуляторе какие?

Re: Утечка памяти в Android приложениях

Добавлено: 03 окт 2013, 08:13
hard
Разные...но как связанно сколько жрет мое приложение с разрешением экрана? Размер картинок и тд один и тот же остается?!

Re: Утечка памяти в Android приложениях

Добавлено: 03 окт 2013, 10:30
rezak90
hard писал(а):Размер картинок и тд один и тот же остается?!
нет)

Re: Утечка памяти в Android приложениях

Добавлено: 14 ноя 2013, 17:32
Rumlin
[offtopic]Киньте ссылку, плиз, почитать базовое про "рефактори код"[/offtopic]

Re: Утечка памяти в Android приложениях

Добавлено: 14 ноя 2013, 17:56
Mikhail_dev
Как вариант
http://habrahabr.ru/post/116163/
Оттуда сможешь понять как дальше гуглить

Re: Утечка памяти в Android приложениях

Добавлено: 14 ноя 2013, 18:22
Rumlin
Судя по всему имелся ввиду Рефакторинг. Фиг поймешь когда английские понятия русскими буквами пишут.

Re: Утечка памяти в Android приложениях

Добавлено: 14 ноя 2013, 19:09
Mikhail_dev
А, я внимательно не прочитал и отправил инфу в соответствии с названием темы =)
Рефакторинг?
1. Java Code convention - обязательна!
2. Стив Макконнелл - Совершенный код, 2-е издание