web-dev-qa-db-ja.com

単純なアプリでなぜそんなに多くのGC_FOR_ALLOCなのですか?

Dalvikvmから取得するGC_FOR_ALLOCが多すぎます。 RESTサービスからXMLを取得しています。1つのアクティビティではプログラムで約100行を解析し、他のアクティビティではSimpleXMLを使用して約200行を解析しています。

最初のものでは、50 GC_FOR_ALLOCを取得します。二回目は300枚!! (私はそれをすべて投稿することもできません。本文は29579文字で、許可されるのは30kのみです)

私は検索しましたが、ほとんどすべての人がgc_for_ "A" llocではなく、gc_for_ "M" allocについて不満を言っています。

インスタンスが作成されたため、SimpleXMLに問題がありますか?

Dalvikvmによってlogcatダンプを投稿します。おそらく値にいくつかの情報があります。

ご助力ありがとうございます。

12-11 06:13:49.564: D/dalvikvm(6759): GC_FOR_ALLOC freed 362K, 13% free 4116K/4688K, paused 181ms, total 182ms
12-11 06:13:50.074: D/dalvikvm(6759): GC_FOR_ALLOC freed 303K, 13% free 4134K/4708K, paused 142ms, total 142ms
.... repeated many times .....
12-11 06:14:06.254: D/dalvikvm(6759): GC_FOR_ALLOC freed 73K, 13% free 4159K/4768K, paused 53ms, total 53ms
12-11 06:14:06.314: D/dalvikvm(6759): GC_FOR_ALLOC freed 103K, 13% free 4159K/4768K, paused 56ms, total 57ms
12-11 06:14:06.374: D/dalvikvm(6759): GC_FOR_ALLOC freed 29K, 12% free 4203K/4768K, paused 54ms, total 54ms
12-11 06:14:06.424: D/dalvikvm(6759): GC_FOR_ALLOC freed 73K, 13% fre
15
Rui Campião

DDMS割り当てトラッカーを使用して、最近割り当てられたオブジェクトを表示できます( メモリデバッグドキュメント 、古い ブログ投稿ddms docs )。これにより、何が割り当てられているかが示され、割り当てが行われている場所のスタックトレースが表示されます。

別のブログ投稿 はMATと他の関連ツールについて説明していますが、ヒープダンプ分析は一般に持っていないオブジェクトを表示するため、この種の問題にはあまり役立ちませんが解放され、areが解放されているオブジェクトに関心が集まっています。

10
fadden

Android Dalvik VM、GC_FOR_ALLOC is invoked in object alloc step when when dlmalloc footprint space is notuff for new or heap->bytesAllocated + n > hs->softLimit。You can can空きヒープ領域を増やすには、dalvik.system.setTargetHeapUtilizationを低く設定します。

6
QJGui

複数取得した場合GC_FOR_ALLOCアプリが遅れている間、バグがループしている可能性が非常に高くなります。コードの行がどこでGCをトリガーし始めたかを確認し、そこからコードのトレースを開始します。私の経験では、プログラムが無限ループを作成する原因となる内部ループ反復子を誤って入力しました。私はこのようなバグを作成しました:

for(int i=0; i<list.size(); i++) {
     for(int j=i+1 j<list.size(); i++) {

     // I mistyped the iterator of integer j with i
     // making an infinite loop which triggered the GC.
     //appears many times

     }
}
2
jonh

あなたはMATを使うことができます MATチュートリアル

作成されているオブジェクトとガベージコレクションされているオブジェクトの数を見つける。コードを最適化できるように

2
nitesh goel

今日も同じ問題に遭遇しました。 while(i <xx)などのコードで終了していないループを見つけましたが、while本体にi ++ステートメントを実装していません。だから、会うようなメッセージが出ました。まずコードを確認してください。

1
ZhanZF

私のログ:

D/dalvikvm: GC_FOR_ALLOC freed 549K, 9% free 7878K/8596K, paused 30ms, total 34ms

...freed 539K, 9% free 7888K/8596K, paused 30ms, total 30ms
...freed 1856K, 21% free 8083K/10108K, paused 51ms, total 51ms
...freed 582K, 9% free 7845K/8596K, paused 38ms, total 38ms

説明:

アプリがメモリを取得すると、アプリごとの制限が増えます。 Dalvik/Antはガベージコレクターを呼び出します。

アプリのメモリを制限するものがDalvik/Antを決定します。私のアプリで見たように、Dalvikは8596K(2つのケース)と8083K(1つのケース)を決定します。

実行時に制限が変更されます。

そして、これがいつ発生するかはわかりません。しかし、可能性を減らすことができます。アプリケーションが消費するメモリの量を減らします。

PS:GCがDalvik/Antを呼び出すタイミングを決定します。そして、これがいつ発生するかはわかりません。しかし、可能性を減らすことができます。アプリケーションが消費するメモリの量を減らします。

PS:「Androidの監視」のタブ「モニター」、グラフィックス「メモリ」を参照してください。ボタンを使用します:「一時停止(有効)」、GCの開始、「ダンプJavaヒープ」「位置追跡の開始(非常に便利)」、およびこのための公式ガイドを使用します。

https://developer.Android.com/studio/profile/am-memory.html?utm_source=Android-studio

私が理解している限り、VM call GCの場合、アプリは動作を停止/一時停止してはならず、クラッシュしません。

0
Fortran