0

おそらくActivityGroupを使用する際のAndroidのメモリ使用量の問題

これは私がメモリの問題を台無しにしてしまった少し長い話です。非常に多くのアクティビティとフレームワークを使用して、非常に深い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に記載されているすべてをチェックしました。nullのドローアブルをチェックし、モデルの再利用性の指示に従い、stackoverflow.com / questions / 477572 / android-strange-out-of-memory-issue / 823966#823966で説明されている読み込み方法を変更しました。

また、ディスクからロードするビットマップがほとんどありません。私のすべてのレイアウトは、Androidxmlレイアウトファイルによって作成されました。xmlファイルにもたくさんのビットマップが記述されています。

次に、メモリアナライザを使用したアプリケーションに大きな静的クラスがあることを確認しました。オンデマンドでロードし、使用後に解放することで、静的プロパティを解放しました。だからついに私はMATでこのメモリリークの疑いを持った。

問題の疑い1

「」によってロードされた「java.lang.Class」の3,043インスタンスは、871,304(17.97%)バイトを占有します。

最大のインスタンス:
クラスcom.ibm.icu4jni.util.Resources $ DefaultTimeZones @ 0x4014c3b0-166,768(3.44%)バイト。
クラスandroid.text.Html$HtmlParser @ 0x400fe448-126,592(2.61%)バイト。
クラスcom.google.googlenav.proto.GmmMessageTypes@0x4835d450-56,944(1.17%)バイト。
クラス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

「システムクラスローダー」によってロードされた「java.lang.String」の8,721インスタンスは、549,624(11.33%)バイトを占有します。キーワードjava.lang.String

問題の疑い3

「システムクラスローダー」によってロードされた「org.bouncycastle.jce.provider.X509CertificateObject」の60インスタンスは、300,024(10.76%)バイトを占有します。これらのインスタンスは、「システムクラスローダー」キーワードorg.bouncycastle.jce.provider.X509CertificateObject java.util.Hashtable $HashtableEntry[]によってロードされる「java.util.Hashtable$HashtableEntry[]」の1つのインスタンスから参照されます。

この3つ目は、毎回発生するわけではありません。一般的に、GalaxyTabでメモリマネージャーを使用する場合。

私の最大のトップレベルのドミネータークラスはこれらです。http://www.matriks.mobi/arge/android/Screen%20shot%202011-02-25%20at%2012.19.08%20PM.png

ライブのアクティビティは2つか3つだけで、残りは中断されています。このメッセージはコンポーネントレポートに表示されます。もちろん、これは私が1.5 MBのRAMを使用しているという説明ではありません。メモリマネージャによると、私のアプリケーションは約20MBから48MBのRAMを使用しているからです。

メモリの浪費の可能性 * 文字列の重複*同一のコンテンツを持つ少なくとも10個のインスタンスでchar[]が0回検出されました。合計サイズは0バイトです。

私はそれが私が望むものではないと思います:) http://www.matriks.mobi/arge/android/android5706014442078310727.hprof.zipにあるhprofファイル

ActivityGroupクラスに問題があると思います。少なくとも、LocalActivityManagerのアクティビティとアクティビティIDをスタックに保持しています。しかし、新しいアクティビティを作成せず、ロードされたアクティビティ間を通過しても、メモリは増加します。

私はこれがリークを検索する方法ではないことを知っています、そしておそらく私はこのメモリリークを引き起こすコードベースの問題を抱えています。しかし、私がここで立ち往生しているので、私がチェックすべき単一のアイデアはここで非常に歓迎されます。

4

3 に答える 3

2

アプリケーションの使用中にメモリ割り当てを追跡してみてください。

また、Bitmap Drawablesへの参照を保持すると、メモリリークが発生する可能性があります。DrawableがViewに追加されると、循環参照が作成されます。したがって、ビットマップドローアブルへの参照を保持すると、さらにビューへの参照が保持され、このビューをGCすることはできません。

これを回避する最も簡単な方法は、ビットマップDrawableからビットマップを抽出し、それへの参照を保持することです。次に、アクティビティが再起動/再ロードされたときに、このビットマップから新しいビットマップDrawableを作成します。これがPhotostreamの例の仕組みです(最後に説明されています): 画面の向きの変更が速くなります

于 2011-02-25T11:58:31.293 に答える
0

ListViewの行にこのレイアウトを使用しますか?

于 2011-02-25T12:06:21.910 に答える
0

によって作成されたアクティビティグループごとに背景画像をリセットしていました。

 background.setBackgroundResource(R.drawable.background); 

これを削除して説明をxmlに残したので、問題は解決しました。この方法では、メモリリークが発生します。

于 2011-03-02T08:28:49.787 に答える