Проблема использования памяти Android при возможном использовании ActivityGroup
Это немного длинная история, в которой я в конечном итоге связался с проблемами с памятью. Я разработал очень глубокое приложение для Android, используя очень много Деятельности и Структур. Прежде всего я должен сказать, что я использовал ActivityGroups для основных категорий, чтобы легко обрабатывать действия. И я могу выполнить все действия через getLocalActivityManager()
. И я получаю это сообщение об ошибке:
02-25 11:34:13.749:
ERROR/dalvikvm-heap(3042):
2764800-byte external allocation too
large for this process.
02-25 11:34:13.749:
ERROR/GraphicsJNI(3042): VM won't let
us allocate 2764800 bytes
тогда мое приложение будет аварийно завершать работу с различными исключениями, например;
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): FATAL EXCEPTION: main
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.turkcell.seyahat/com.matriksdata.ui.schedule.MessageDetail}: android.view.InflateException: Binary XML file line #2: Error inflating class <unknown>
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.app.ActivityThread.startActivityNow(ActivityThread.java:2503)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at com.matriksdata.app.XActivityGroup.goForward(XActivityGroup.java:122)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at com.matriksdata.ui.parents.ScheduleActivityGroup.goForward(ScheduleActivityGroup.java:143)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at com.matriksdata.ui.schedule.MessageBox.onItemClick(MessageBox.java:81)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.widget.AdapterView.performItemClick(AdapterView.java:284)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.widget.ListView.performItemClick(ListView.java:3730)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.widget.AbsListView$PerformClick.run(AbsListView.java:1808)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.os.Handler.handleCallback(Handler.java:587)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.os.Handler.dispatchMessage(Handler.java:92)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.os.Looper.loop(Looper.java:123)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.app.ActivityThread.main(ActivityThread.java:4627)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at java.lang.reflect.Method.invokeNative(Native Method)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at java.lang.reflect.Method.invoke(Method.java:521)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at dalvik.system.NativeStart.main(Native Method)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class <unknown>
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.view.LayoutInflater.createView(LayoutInflater.java:513)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.view.LayoutInflater.inflate(LayoutInflater.java:385)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:210)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.app.Activity.setContentView(Activity.java:1647)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at com.matriksdata.ui.schedule.MessageDetail.onCreate(MessageDetail.java:33)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): ... 18 more
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): Caused by: java.lang.reflect.InvocationTargetException
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.widget.LinearLayout.<init>(LinearLayout.java:115)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at java.lang.reflect.Constructor.constructNative(Native Method)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at java.lang.reflect.Constructor.newInstance(Constructor.java:446)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.view.LayoutInflater.createView(LayoutInflater.java:500)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): ... 28 more
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.graphics.Bitmap.nativeCreate(Native Method)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.graphics.Bitmap.createBitmap(Bitmap.java:468)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.graphics.Bitmap.createBitmap(Bitmap.java:435)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:340)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:590)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:564)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:425)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.content.res.Resources.loadDrawable(Resources.java:1709)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.view.View.<init>(View.java:1885)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.view.View.<init>(View.java:1834)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): at android.view.ViewGroup.<init>(ViewGroup.java:285)
02-25 11:34:13.772: ERROR/AndroidRuntime(3042): ... 32 more
Конечно, у меня нет 2764800 байт png изображения, но я думаю, что его декодированный размер. Поэтому я подумал, что у меня проблемы с обработкой изображений, и я проверил и исправил свой проект в каждой детали, чтобы правильно обрабатывать изображения. Я проверил все, что описано в android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html. Я проверил нулевые объекты рисования, следую инструкциям по повторному использованию модели, изменил методы загрузки, описанные в: stackoverflow.com/questions/477572/android-strange-out-of-memory-issue/823966#823966.
Также у меня есть несколько битмапов для загрузки с диска. Мои все макеты, созданные с помощью файлов макета Android xml. У меня есть много растровых изображений, описанных в файлах XML также.
Потом я увидел, что у меня большие статические классы в приложении с анализатором памяти. я освободил эти статические свойства, загружая по требованию и освобождая после использования. Итак, наконец я получил подозреваемых утечки памяти в MAT;
Проблема Подозреваемый 1
3 043 экземпляра класса "java.lang.Class", загруженного "", занимают 871 304 (17,97%) байта.
Самые большие экземпляры:
класс com.ibm.icu4jni.util.Resources $ DefaultTimeZones @ 0x4014c3b0 - 166 768 (3,44%) байт.
class android.text.Html $ HtmlParser @ 0x400fe448 - 126 592 (2,61%) байтов.
класс com.google.googlenav.proto.GmmMessageTypes @ 0x4835d450 - 56 944 (1,17%) байта.
class org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool @ 0x47caea20 - 51 872 (1,07%) байта.
класс org.apache.harmony.security.fortress.Services @ 0x4008c4d0 - 51 456 (1,06%) байт.
Проблема Подозреваемый 2
8,721 экземпляра java.lang.String, загруженного загрузчиком системного класса, занимают 549,624 (11,33%) байта. Keywordsjava.lang.String
Проблема Подозреваемый 3
60 экземпляров "org.bouncycastle.jce.provider.X509CertificateObject", загруженных "системным загрузчиком классов", занимают 300 024 (10,76%) байта. На эти экземпляры ссылаются из одного экземпляра «java.util.Hashtable $ HashtableEntry []», загруженного «системным загрузчиком классов» Keywordsorg.bouncycastle.jce.provider.X509CertificateObjectjava.util.Hashtable $ HashtableEntry []
Этот третий встречается не каждый раз. Вообще, когда я использую диспетчер памяти в GalaxyTab.
Это мои самые большие классы Доминатора высшего уровня. http://www.matriks.mobi/arge/android/Screen%20shot%202011-02-25%20at%2012.19.08%20PM.png
У меня всего 2 или 3 мероприятия в прямом эфире, а остальные приостановлены. Я получаю это сообщение в компоненте отчета. Конечно, это не объяснение того, что я использую только 1,5 МБ оперативной памяти, потому что согласно диспетчеру памяти мое приложение использует 48 МБ оперативной памяти по сравнению с примерно 20 МБ.
Возможные потери памяти
*  Дубликаты строк *
Найдено 0 вхождений char [], по крайней мере, 10 экземпляров с одинаковым содержанием. Общий размер 0 байтов.
я думаю, что это не то, что я хочу :) Файл hprof находится в http://www.matriks.mobi/arge/android/android5706014442078310727.hprof.zip
Я предполагаю, что у меня проблема с классом ActivityGroup. По крайней мере, я храню действия и идентификаторы активности в LocalActivityManager в стеках. Но даже если я не создаю новые действия и не перехожу между загруженными, память увеличивается.
Я знаю, что это не способ поиска утечек, и, возможно, у меня есть проблема с кодом, вызывающая утечки памяти. Но любая идея, которую я должен проверить, будет очень приветствоваться здесь, потому что я как бы застрял здесь.