2015-12-14 29 views
7

メモリリークの可能性があります。 バックグラウンドで重労働をしているアクティビティがあります。Androidスタジオはどのようにガベージコレクタを起動し、どのように動作しますか?

一部のタスクを実行すると、アプリがあまりにも多くのメモリを消費します。それは適切にクリーンアップされないようです。

は、これがデフォルトの状態での活動です:

enter image description here

私が活動を行っているタスクを実行する場合、より多くのメモリが割り当てられています。いくつかの仕事の後

活動:まず enter image description here

私は、これはGCが適切にメモリを解放することができない原因と、メモリの問題でなければならないと思いました。限り、私は知っている限り、オブジェクトに参照が残っていない場合、GCはメモリを解放することができます。あれは正しいですか?

は今私を混乱させる部分が来る:

私は、Android StudioからGCを実行する場合、メモリが正しくクリーンアップされ、私の活動が閉じれることは決してありません。私は多くのメモリが割り当てられるときにAndroid Studio GCを使用する必要があります。 enter image description here

これは私が意味するものです。一般的には疑問がある

enter image description here

なぜAndroidのメーカーGCが適切にメモリをクリーンアップすることができ、なぜありません自動アンドロイドGCで正常に動作しますか?

これはかなり一般的な質問です。私はちょうどガベージコレクションのようなものがあるかどうか知りたい。

System.gc();とも呼ばれますが、メモリは正しくクリーンアップされません。

追加情報:

モトG第2世代

アンドロイド5.0.2。

+0

"時々、アクティビティやアプリケーションが終了します。私はそれがメモリの問題によって引き起こされたと考えました。"アプリがメモリ不足になった場合、メモリ不足の例外が発生し、Logcatで明瞭に確認できます。私の勘違いはあなたのアプリが別の理由でクラッシュしていることです。クラッシュの理由を調べるには、logcatを調べてみてください。 – Shmuel

+1

同時GCは、顕著な一時停止を引き起こさないように部分的な収集のみを行います。 Studioによってトリガされたような明示的なGCでは、完全なGCスイープが実行されます。いくつかの読書:https://source.android.com/devices/tech/dalvik/gc-debug.html – laalto

+0

@Shmuel例外はありません。警告さえありません。 – FlanschiFox

答えて

2

おそらく、あなたは明示的に重い処理のコードのどこかで定期的にSystem.gc();を呼び出そうとすることができますか?

+0

私はそれを忘れて申し訳ありません。私はそれを試してみました、そして、それは仕事をしません。 – FlanschiFox

+0

本当にメモリリークがあった場合、System.gc()を呼び出すことはb/cに役立ちません。メモリは引き続きコードのどこかの参照を介して保持されます。 – Shmuel

+0

@Shmuel True、しかしOPはアンドロイドスタジオのGCボタンを押したときにアプリケーションがクラッシュしないと言っています。これは私が想像するところでは、System.gc()を呼び出すことです。 –

4

メモリリークがあるため、いくつかの理由により発生する可能性があります。 1つの一般的な理由は、正しくリサイクルされないビットマップです。メモリリークの他のシードは、オブジェクトにコンテキストを保持しています。たとえば、あなたは、非同期タスクを起動して、あとでそれを必要とするので、コンテキストを渡します。非同期タスクが実行されているものの、それは、コンテキストへの参照を保持しますので、全体の活動は、メモリ内にあります。また、これは通常、フラグメントまたは、活動である親クラスへの参照を持っている匿名内部クラスと非常に頻繁にあります。

ライブラリリークカナリアを使用してメモリリークを検出し、メモリリークが発生している場所を正確に検出するためにAndroidツールを使用して割り当てを追跡することをお勧めします。

+0

答えをありがとう。あなたは一般的な理由、メモリリークがどのように発生するかを述べました。基本的には、残っている参照が正しいことです。しかし、私の場合は、Android Studio GCコールがすべてを適切にクリーンアップしています。だから、奇妙な参照があるとすれば、GCはそれらをきれいにすることができないはずですか? – FlanschiFox

+0

正確ではありません。 1つのアクティビティを終了しても、数秒間は参照を保持することができます。したがって、数秒後にGCを実行すると、そのメモリが消去されます。 ビットマップがリサイクルされ、メモリを解放するためにGCが遅れてメモリが不足したため、いくつかのアクティビティから戻ってメモリオーバーフローが発生した状況に直面しました。 デフォルトでは、必要でない場合(許容される最大メモリ量に達していない場合)、GCはメモリを解放しません。それはあなたの他の問題でもあります。 – jorgemf

+0

私はこのスレッドを見てうれしいです、そして、それはかなり最近です。あなたはなぜアンドロイドスタジオのGCがうまく動作するのかを@oberflanschが見つけましたか?私はアプリケーションが私をメモリから捨て、プログラムがクラッシュする同じ状況に取り組んでいます。私がアプリケーションでメモリの問題を引き起こしたことの1つは、リソースで使用するすべてのPNG画像が大きすぎるためです。私は、なぜ活動が閉じられた後にも、アンドロイドがGC自体を閉じない理由を疑問に思っています...新しいアクティビティが作成されるたびにメモリが増加し続けます。 –

関連する問題