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

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
hard
Сообщения: 44
Зарегистрирован: 13 сен 2013, 14:21

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

Сообщение hard » 01 окт 2013, 09:46

Прочитав статью - 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 КБ) 12327 просмотров
2.jpg
2.jpg (215.64 КБ) 12327 просмотров
3.jpg
3.jpg (251.78 КБ) 12327 просмотров

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

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

Сообщение rezak90 » 01 окт 2013, 09:50

и что мы здесь понять должны? ну текут битмапы, рефактори код и смотри где идёт утечка, смотри по хипу в каком месте растёт, стримы может где не закрываешь и т.д.
R.id.team
Политика на форуме запрещена

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

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

Сообщение Mikhail_dev » 01 окт 2013, 10:19

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

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

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

Сообщение anber » 01 окт 2013, 16:30

Где-то здесь было чудное видео, щас пороюсь, а вот собственно и оно: http://www.youtube.com/watch?v=_CruQY55HOk
Среди прочего там прозвучала мысль что быстрее все утечку памяти исправит тот кто хорошо разбирается в том что у него происходит в проекте.
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

hard
Сообщения: 44
Зарегистрирован: 13 сен 2013, 14:21

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

Сообщение hard » 02 окт 2013, 12:42

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

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 02 окт 2013, 12:52

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

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

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

Сообщение anber » 02 окт 2013, 12:55

hard писал(а):Спасибо всем за советы) я начинающий поэтому сразу все понять не могу, первый раз попробовал проверить на утечку памяти. Проэтк представляет собой просто список элементов в листвьев с картинками. При изменение количества элементов в списке с 10 до 1000 использование памяти увеличилось незначительно. Даже когда открыта активити с картиной одной и кнопкой используемая память 11мб. Как то сраннно.
Не удивляйся, это обычная черная андроидовская магия :lol:
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

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

Сообщение rezak90 » 02 окт 2013, 14:49

покажи адаптер свой и view которое используешь в качестве айтем листа
R.id.team
Политика на форуме запрещена

hard
Сообщения: 44
Зарегистрирован: 13 сен 2013, 14:21

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

Сообщение hard » 02 окт 2013, 20:54

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

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>

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

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

Сообщение rezak90 » 02 окт 2013, 21:22

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

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

hard
Сообщения: 44
Зарегистрирован: 13 сен 2013, 14:21

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

Сообщение hard » 02 окт 2013, 21:33

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

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

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

Сообщение rezak90 » 02 окт 2013, 21:49

hard писал(а):Получается это нужно создавать свой контент менеджер?!
да, там пару строк кода
hard писал(а):Сейчас запустил программу на эмуляторе а не на телефоне, загрузка памяти 4мб!!!! :?: :?: :?:
не стоит сравнивать и тестировать производительность на эмуляторе
R.id.team
Политика на форуме запрещена

hard
Сообщения: 44
Зарегистрирован: 13 сен 2013, 14:21

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

Сообщение hard » 02 окт 2013, 21:54

спасибо,буду копать

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

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

Сообщение anber » 02 окт 2013, 22:16

hard писал(а):спасибо, за подсказку, на счет третьего пункта задумывался. Получается это нужно создавать свой контент менеджер?! Пункт 2 - картинки маленькие. Сейчас запустил программу на эмуляторе а не на телефоне, загрузка памяти 4мб!!!! :?: :?: :?:
Разрешения экрана на телефоне и эмуляторе какие?
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

hard
Сообщения: 44
Зарегистрирован: 13 сен 2013, 14:21

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

Сообщение hard » 03 окт 2013, 08:13

Разные...но как связанно сколько жрет мое приложение с разрешением экрана? Размер картинок и тд один и тот же остается?!

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

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

Сообщение rezak90 » 03 окт 2013, 10:30

hard писал(а):Размер картинок и тд один и тот же остается?!
нет)
R.id.team
Политика на форуме запрещена

Rumlin
Сообщения: 32
Зарегистрирован: 08 июл 2013, 12:32

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

Сообщение Rumlin » 14 ноя 2013, 17:32

[offtopic]Киньте ссылку, плиз, почитать базовое про "рефактори код"[/offtopic]

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

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

Сообщение Mikhail_dev » 14 ноя 2013, 17:56

Как вариант
http://habrahabr.ru/post/116163/
Оттуда сможешь понять как дальше гуглить

Rumlin
Сообщения: 32
Зарегистрирован: 08 июл 2013, 12:32

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

Сообщение Rumlin » 14 ноя 2013, 18:22

Судя по всему имелся ввиду Рефакторинг. Фиг поймешь когда английские понятия русскими буквами пишут.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

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

Сообщение Mikhail_dev » 14 ноя 2013, 19:09

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

Ответить