15

カタログに次のメッセージがあります。

GC_CONCURRENT freed 456K, 19% free 2753K/3360K, paused 5ms+9ms, total 378ms

最後の値の合計を理解しようとしています。サイトで他の GC 関連の質問を確認しましたが、同時 GC に関連する 2 つの一時停止、または非同時 GC の合計一時停止が 1 つあります。なぜ私は2つ持っているのですか?アプリは 5+9 ミリ秒または 378 ミリ秒停止しましたか? 合計とは正確には何ですか?

4

5 に答える 5

6

GC_CONCURRENT: ヒープが成長しているときにトリガーされます。そのため、時間内にメモリを再利用できるため、ヒープを拡大する必要はありません

GC_CONCURRENT解放された 456K

この部分は、この GC スイープによってどれだけのメモリが解放されたかを示します

GC_CONCURRENT解放された 456K、19% 解放された 2753K/3360K

この部分は、ヒープの空き率、生きているオブジェクトのサイズ、およびヒープの合計サイズを示します。したがって、上記の例では 19% の空き容量があり、2753K のメモリが使用されており、合計ヒープ サイズは 3360K です。

ログの最後の部分は、GC にかかった時間を示しています。GC_CONCURRENTコレクションでは 2 回表示されます。コレクションの先頭に 1 つ、最後に 1 つ。

同時 GC イベントの場合n、一時停止時間は 1 回だけで、通常ははるかに長くなります。例: 一時停止 378ms

ソース:

https://sites.google.com/site/pyximanew/blog/androidunderstandingddmslogcatmemoryoutputmessages

物事が明確に説明されている別の場所...

http://www.youtube.com/watch?v=_CruQY55HOk

于 2013-04-03T11:15:12.610 に答える
6

決定的な答えはありませんが、私が得たものから、GC_CONCURRENT は別のスレッドで実行されるガベージ コレクションです。これは、実行に合計 X ミリ秒 (この場合は 378 ミリ秒) かかる場合がありますが、実際に実行中のスレッドはそれほど長くブロックされないことを意味します。同時ガベージ コレクション プロセスの開始時と終了時に少しだけブロックされます (この例では 5+9=14ms)。

このタイプのガベージ コレクションは、JVM がそれを行うのに適した時期であると判断した場合 (通常はヒープが危険なほど高くなった場合) に、自動的にトリガーされます。GC_EXPLICIT (名前を間違えていなければ) などの他のタイプの GC は、

System.gc();

あなたのコードで。このタイプのガベージ コレクションでは、1 回 (Y ミリ秒など) しか報告されません。この場合、スレッドは、このタイプの GC プロセスが終了するまで、実際にはその時間ブロックされます。

于 2013-04-03T11:20:30.320 に答える
2

私が取得したいくつかの systraces を見ると、合計 (378ms) は、GC が実際にアプリケーションを一時停止した時間を反映していないようです。ガベージ コレクションにかかった時間を反映しています。一時停止時間は、そのために見るべきものです。

于 2015-02-10T01:12:06.350 に答える