Утечка памяти в Android приложениях
Утечка памяти в Android приложениях
Прочитав статью - 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 из них заняты массивом который описан в ошибке.
К сообщению внизу я прикрепил три скриншота с разбором кучи. Подскажите что это может быть? Может это из за того что я использую боковую навигацию?
заинтересовался нет ли в моем приложении утечки памяти. Нашел ее, но не могу понять что это:
Мне выдается сообщение:
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 из них заняты массивом который описан в ошибке.
К сообщению внизу я прикрепил три скриншота с разбором кучи. Подскажите что это может быть? Может это из за того что я использую боковую навигацию?
Re: Утечка памяти в Android приложениях
и что мы здесь понять должны? ну текут битмапы, рефактори код и смотри где идёт утечка, смотри по хипу в каком месте растёт, стримы может где не закрываешь и т.д.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Утечка памяти в Android приложениях
Сходу не скажу, но что мешает сделать два дампа памяти и посмотреть, где проблема?
Это вроде как MAT? А стандартными средствами не пробовали что-либо найти? Например посмотреть Method Profiling, действительно ли GC зверствует или вы что-то перепутали.
Практически все, но не все я так понимаю. Может немного подебажить данные куски кода, где осталось создание картинок?Я начал искать причину, убрал практически все картинки из приложения, загрузка памяти все равно остается 11-12мб и 10 из них заняты массивом который описан в ошибке.
Это вроде как MAT? А стандартными средствами не пробовали что-либо найти? Например посмотреть Method Profiling, действительно ли GC зверствует или вы что-то перепутали.
Re: Утечка памяти в Android приложениях
Где-то здесь было чудное видео, щас пороюсь, а вот собственно и оно: http://www.youtube.com/watch?v=_CruQY55HOk
Среди прочего там прозвучала мысль что быстрее все утечку памяти исправит тот кто хорошо разбирается в том что у него происходит в проекте.
Среди прочего там прозвучала мысль что быстрее все утечку памяти исправит тот кто хорошо разбирается в том что у него происходит в проекте.
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.
Re: Утечка памяти в Android приложениях
Спасибо всем за советы) я начинающий поэтому сразу все понять не могу, первый раз попробовал проверить на утечку памяти. Проэтк представляет собой просто список элементов в листвьев с картинками. При изменение количества элементов в списке с 10 до 1000 использование памяти увеличилось незначительно. Даже когда открыта активити с картиной одной и кнопкой используемая память 11мб. Как то сраннно.
Re: Утечка памяти в Android приложениях
неплохо было бы знать, тогда, как работает листвью, тогда это тебе не показалось бы странным.hard писал(а):Спасибо всем за советы) я начинающий поэтому сразу все понять не могу, первый раз попробовал проверить на утечку памяти. Проэтк представляет собой просто список элементов в листвьев с картинками. При изменение количества элементов в списке с 10 до 1000 использование памяти увеличилось незначительно. Даже когда открыта активити с картиной одной и кнопкой используемая память 11мб. Как то сраннно.
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Утечка памяти в Android приложениях
Не удивляйся, это обычная черная андроидовская магияhard писал(а):Спасибо всем за советы) я начинающий поэтому сразу все понять не могу, первый раз попробовал проверить на утечку памяти. Проэтк представляет собой просто список элементов в листвьев с картинками. При изменение количества элементов в списке с 10 до 1000 использование памяти увеличилось незначительно. Даже когда открыта активити с картиной одной и кнопкой используемая память 11мб. Как то сраннно.
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.
Re: Утечка памяти в Android приложениях
покажи адаптер свой и view которое используешь в качестве айтем листа
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Утечка памяти в Android приложениях
Код: Выделить всё
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>Код: Выделить всё
<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 приложениях
вот на первый взгляд так не скажешь, существенного ничего, но есть сомнения и догадки:
1) лейауты не оптимизированы, можно обойтись меньшей вложенностью, но это не существенно а лишь замечания...
2) что это за картинки: m8 и umk - сколько они весят и какое разрешение и формат?
3) используется устаревший конструктор CursorLoader который уже с 11 api deprecated;
4) исходя из 3-го пункта, наверняка не правильно используешь курсоры, которые следует грузить в LoaderManager с CursorLoader.
P.S. видишь как много вариантов... к тому же это ещё не весь код ты показал
1) лейауты не оптимизированы, можно обойтись меньшей вложенностью, но это не существенно а лишь замечания...
2) что это за картинки: m8 и umk - сколько они весят и какое разрешение и формат?
3) используется устаревший конструктор CursorLoader который уже с 11 api deprecated;
4) исходя из 3-го пункта, наверняка не правильно используешь курсоры, которые следует грузить в LoaderManager с CursorLoader.
P.S. видишь как много вариантов... к тому же это ещё не весь код ты показал
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Утечка памяти в Android приложениях
спасибо, за подсказку, на счет третьего пункта задумывался. Получается это нужно создавать свой контент менеджер?! Пункт 2 - картинки маленькие. Сейчас запустил программу на эмуляторе а не на телефоне, загрузка памяти 4мб!!!!

Re: Утечка памяти в Android приложениях
да, там пару строк кодаhard писал(а):Получается это нужно создавать свой контент менеджер?!
не стоит сравнивать и тестировать производительность на эмулятореhard писал(а):Сейчас запустил программу на эмуляторе а не на телефоне, загрузка памяти 4мб!!!!![]()
![]()
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Утечка памяти в Android приложениях
спасибо,буду копать
Re: Утечка памяти в Android приложениях
Разрешения экрана на телефоне и эмуляторе какие?hard писал(а):спасибо, за подсказку, на счет третьего пункта задумывался. Получается это нужно создавать свой контент менеджер?! Пункт 2 - картинки маленькие. Сейчас запустил программу на эмуляторе а не на телефоне, загрузка памяти 4мб!!!!![]()
![]()
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.
Re: Утечка памяти в Android приложениях
Разные...но как связанно сколько жрет мое приложение с разрешением экрана? Размер картинок и тд один и тот же остается?!
Re: Утечка памяти в Android приложениях
нет)hard писал(а):Размер картинок и тд один и тот же остается?!
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Утечка памяти в Android приложениях
[offtopic]Киньте ссылку, плиз, почитать базовое про "рефактори код"[/offtopic]
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Утечка памяти в Android приложениях
Судя по всему имелся ввиду Рефакторинг. Фиг поймешь когда английские понятия русскими буквами пишут.
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Утечка памяти в Android приложениях
А, я внимательно не прочитал и отправил инфу в соответствии с названием темы =)
Рефакторинг?
1. Java Code convention - обязательна!
2. Стив Макконнелл - Совершенный код, 2-е издание
Рефакторинг?
1. Java Code convention - обязательна!
2. Стив Макконнелл - Совершенный код, 2-е издание
