Hansı Android alətləri və üsulları yaddaş / resurs sızmalarını aşkar etmək üçün yaxşıdır?

Mənim bir Android app var və hər şeyin yaxşı işlədiyini və zəfəri bəyan etmək və göndərmək istədikləri bir telefon üçün tətbiqlər hazırlayıram, ancaq bilirsiniz ki, orada bir növ yaddaş və resurs sızması var; və Android-də yalnız 16 Mb yığın var və Android tətbiqində təəccüblü dərəcədə asan sızmalar var.

Ətrafına baxdım və hələ də yalnız 'hprof' və 'traceview' haqqında məlumat qazana bilər və çox müsbət rəy almadım.

Hansı alətlər və ya metodlarla rastlaşdınız və ya inkişaf etdiniz və bəlkə də bir OS layihəsində paylaşa bilərsiniz?

149
18 июля '09 в 13:10 2009-07-18 13:10 jottos tərəfindən qoyulub 18 iyul 'da 1:10' da 2009-07-18 13:10
@ 7 cavab

Android proqramlarını işləyərkən gördüyüm ən çox səhv olan səhvlərdən biri "java.>

Əvvəlki fəaliyyət planında olan raster şəkillər, onların fəaliyyətinə istinadlar keçdikdən sonra, düzgün şəkildə çöp toplayıcısı tərəfindən azad edilməmişdir. Bir çox təcrübədən sonra bu problemə yaxşı bir həll tapdım.

Birincisi, "id" öznitelikinizi XML düzeni üçün üst görünümdə təyin edin:

  <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/RootView" > ... 

Sonra əməliyyatınızın onDestroy () metodunda unbindDrawables () metodunu çağırın, üst görünüşü təsdiq edən bir bildirişdən keçin və sonra System.gc () əmrini çalıştırın

  @Override protected void onDestroy() { super.onDestroy(); unbindDrawables(findViewById(R.id.RootView)); System.gc(); } private void unbindDrawables(View view) { if (view.getBackground() != null) { view.getBackground().setCallback(null); } if (view instanceof ViewGroup) { for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { unbindDrawables(((ViewGroup) view).getChildAt(i)); } ((ViewGroup) view).removeAllViews(); } } 

Bu unbindDrawables () metodu, görünüşün ağacını təkrarlayır və:

  • Bütün fonları geri çağırır.
  • Uşaqları bütün baxış qruplarında qaldırır.
88
21 июля '11 в 19:06 2011-07-21 19:06 Cavab hp.android tərəfindən verilir 21 iyul 2011 19:06
29
20 апр. Kohlerm tərəfindən verilmiş cavab 20 aprel 2010-04-20 11:10 '10 at 11:10 2010-04-20 11:10

Əsasən gələcək Google səyahətçilər üçün:

Çox java alətləri, təəssüf ki, bu vəzifəyə uyğun deyil, çünki onlar yalnız JVM-yığını təhlil edirlər. Buna baxmayaraq, hər bir Android tətbiqinin öz yığınları var və bu da ~ 16 MB həddi təmin etməlidir. Məsələn, raster məlumat üçün adətən istifadə olunur. Bu yolla, çoxlu təsvirlər istifadə etsəniz, JVM yığınınız təxminən 3 MB chillin olsa da, asanlıqla yaddaş hatalarından qaçın.

28
09 мая '11 в 14:03 2011-05-09 14:03 Cavab Timo Ohr tərəfindən verilir May 09 '11 at 14:03 2011-05-09 14:03

Yalnız @ raster fonları ilə işləyərkən @ hp.android-dən cavab yaxşı işləyir, amma mənim vəziyyətimdə ImageView üçün GridView üçün BaseAdapter dəsti var idi. unbindDrawables() metodu göstərildiyi kimi unbindDrawables() , buna görə şərt:

 if (view instanceof ViewGroup  !(view instanceof AdapterView)) { ... } 

lakin problem təkrarlanan metod AdapterView in uşaqlarını heç vaxt AdapterView . Bu problemi həll etmək üçün aşağıdakıları etdim:

 if (view instanceof ViewGroup) { ViewGroup viewGroup = (ViewGroup) view; for (int i = 0; i < viewGroup.getChildCount(); i++) unbindDrawables(viewGroup.getChildAt(i)); if (!(view instanceof AdapterView)) viewGroup.removeAllViews(); } 

belə ki AdapterView uşaqları hələ də işlənir - üsul sadəcə bütün uşaqları silməyə çalışır (dəstəklənmir).

ImageView , onların arxa planı olmayan ImageView idarə etdiyindən, bu, problemi tam həll etmir. Buna görə mən aşağıdakıları əlavə etmişəm. Mükəmməl deyil, amma işləyir:

 if (view instanceof ImageView) { ImageView imageView = (ImageView) view; imageView.setImageBitmap(null); } 

Ümumiyyətlə, unbindDrawables() metodu:

 private void unbindDrawables(View view) { if (view.getBackground() != null) view.getBackground().setCallback(null); if (view instanceof ImageView) { ImageView imageView = (ImageView) view; imageView.setImageBitmap(null); } else if (view instanceof ViewGroup) { ViewGroup viewGroup = (ViewGroup) view; for (int i = 0; i < viewGroup.getChildCount(); i++) unbindDrawables(viewGroup.getChildAt(i)); if (!(view instanceof AdapterView)) viewGroup.removeAllViews(); } } 

Ümid edirəm ki, belə resursları azad etmək üçün daha prinsipial bir yanaşma var.

20
29 авг. cavab darrenp 29 aug tərəfindən verilir . 2013-08-29 18:15 '13 saat 18:15 'də 2013-08-29 18:15

Android'də Google I / O (2011) yaddaş idarəçiliyi ilə bağlı yaxşı məlumatlar, habelə yaddaşın profilləşdirilməsi üçün vasitələr + üsullar haqqında məlumatlar:
http://www.youtube.com/watch?v=_CruQY55HOk

12
17 апр. Cavab 17-də greg7gkb tərəfindən verilir 2012-04-17 01:30 '12 saat 01:30 'da 2012-04-17 01:30

Valgrind Android (Mozilla tərəfindən maliyyələşdirilir) ported. Mövcud statusAndroid üçün Valgrind-in ARM-də başlanması üçün dəstək üçün Android-də Valgrind-ə baxın (şərh 67).

4
19 окт. Cavab 19 oktyabrda verilir . 2011-10-19 05:39 '11 at 5:39 2011-10-19 05:39

Budur, bu Android istifadə etdiyi unikal formatlarla əlaqəli olan vasitələrdir. Hesab edirəm ki, test kodunun əsas strukturunun istifadə olunmasından narazı ola bilərsiniz.

Android Mock Framework-dən istifadə edərək kodların sahələrini test etməyə çalışdınızmı?

1
18 июля '09 в 19:46 2009-07-18 19:46 cavab Fred Grott tərəfindən 18 iyul '09 'da 19:46' da 2009-07-18 19:46 'də verilir

bağlı digər suallar və ya sual