問題タブ [android-memory]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - アクティビティへの長期参照を避ける
私は持っていActivity
ます。これActivity
には がListView
付属BaseAdapter
しています。ではonDestroy
、アダプタはクラスに格納され、onCreate
では新しい に再接続されActivity
ます。アダプターはインターネットからデータを読み込みViews
、ListView
. AsyncTask
アダプターから (データをロードするために) を開始できるようにするには、 LoaderManager
. Activity
の を使用して、からアダプタに渡しgetSupportLoaderManager()
ますActivity
。
次は正しいですか: アダプターが保持され、に再接続されているため、最初に渡し
Activities
た古いものへの参照が常に保持され、メモリ リークが発生する可能性がありますか?Activity
どうすればこれを防ぐことができますか?
LoaderManager
アダプターを新しいものに付け直すたびに、新しいものにActivity
交換することを考えましたActivity
。getSupportLoaderManager()
これは安全/一般的ですか?一般的に、 'old' への危険な参照を見つけるにはどうすればよい
Activities
ですか?
android - AccessibilityManager を使用した Android アクティビティ リークの解決策を探しています
GT-N8000 および GT-N7000 シリーズの Android デバイスでのみ発生するメモリ リークに気付きました。そうするデバイスでは、アプリ内のすべてのアクティビティがリークされます。
これは私のコードとは無関係のようで、解読できません。
何か案が?
例: ガベージ コレクションのアクティビティを妨げている GC へのパス。活動はすでに死んでいます。(Eclipse Memory Analyzer で表示)。
android - MAT を使用して Android のメモリ使用量を追跡する
アプリのメモリ使用量の一部が MAT の使用によるものかどうかを突き止めようとしています。
多くのヒープを保持しているように見えるビットマップへの参照がいくつかあります。それらが実際のリソースであると判断する方法はありますか? 通常、画像はアプリ内のドローアブルから取得されます。オブジェクト参照がありますが、ドリルダウンして実際にどのドローアブルがメモリを占有している可能性があるかを判断する方法がわかりません。
たとえば、1MB を超える保持ヒープと 300k を超えるロットを持つビットマップがあります。
android - gridadapter のメモリ リークがどこで見つかりませんか? また、GC 呼び出しを回避するためにロジックを改善するにはどうすればよいですか?
GC 呼び出しのためにスクロール中に遅延が発生するため、ロジックを改善してメモリ消費を減らし、UI を高速化するにはどうすればよいですか。
私はEclipse MATを使用しており、3つの容疑者を見つけました:
問題の容疑者 1
「」によってロードされる「android.graphics.Bitmap」の 1 つのインスタンスは、500,464 (14.70%) バイトを占有します。メモリは、"" によってロードされた "byte[]" の 1 つのインスタンスに蓄積されます。
問題の容疑者 2
"" によってロードされた "java.lang.Class" の 2,906 インスタンスが 1,121,048 (32.92%) バイトを占めています。
最大のインスタンス:
問題の容疑者 3
"" によってロードされた "java.lang.String" の 8,040 インスタンスは、514,408 (15.11%) バイトを占有します。
私のアダプターコード
ログキャット
御時間ありがとうございます...
android - Debug.getNativeHeapFreeSize の本当の意味
次のコードを使用して、アプリのメモリ使用量をダンプします。
そして、Nexus (2011 モデル) と Galaxy Note 1 の 2 つの異なるデバイスで実行します。Galaxy Note にはメモリの問題があり、1 ~ 2 ビットマップを追加するとすぐにメモリの問題で頻繁に失敗します。
ダンプは次のとおりです:
Nexus:
ギャラクシーノート:
Debug.getNativeHeapFreeSize() 呼び出しは、nexus では 1377480.000000 を返し、galaxy では 155648.000000 のみを返すことに注意してください。そんなことがあるものか。この電話の本当の意味は何ですか?アプリによる作業を行わずに、アプリの新規インストールで両方のテストを行いました-いくつかのTextViewとボタンがほとんどない最初の画面を表示するだけです。Galaxy Note 1 のメモリ クラスは 64MB なので、その限界に達しているとは思いません。画面に多くのビットマップを追加しても、Nexus でメモリの問題はないので、メモリを使いすぎているとは思いません。
android-asynctask - Android コンテキストの弱参照
私のアプリのいくつかでは、いくつかのシングルトン オブジェクトを「マネージャー」として使用しています。それらを でインスタンス化し、に格納してApplication.onCreate
に渡します。ApplicationContext
WeakReference
一部の「マネージャーの」メソッドは、 から呼び出された後にバックグラウンド タスクを開始するため、 をメソッドActivity
に渡し、をそのメソッドにも保持します (そして、 内で使用します)。その参照は、 が新しい に設定されている場合、バックグラウンドに移行するメソッドを次に呼び出すまで保持されます。Activity
context
WeakReference
AsyncTask
Activity
WeakReference
Activity
context
私の質問は、ApplicationContext
を に保持する必要がありますか? をそのようWeakReference
に保持することに問題はありますActivity
かcontext
?