こんにちは。
私は、通常の60 fpsでループし、さまざまな不思議なことを行うAndroid用の小さなopenGLベースのアプリを作成しています。
私は自分のフレームレートを監視し、可能な限り最適化しようとしています。私は最近、私のプログラムが実行されている間、時々わずかな一時停止があることに気づきました。ガベージコレクターが実行されていて、LogCatを調べているのではないかとすぐに疑ったのですが、fpsのディップの前後にいくつかの疑わしいGCが表示されていました。
ただし、収集を引き起こしているのが私のアプリであるかどうかはわかりません。
それで、これらはGCについての私の質問です:
1)LogCatからログを取得すると、PID(プロセスID?)が含まれます。これは、私が受け取る典型的なGCの例です。
12-14 14:52:40.647: DEBUG/dalvikvm(492): GC_EXPLICIT freed 3831 objects / 203576 bytes in 32ms
492はPIDです。このPIDは、GCを実行するプロセスのものになりますか?それとも、GCを必要としているのは電話で実行されているプロセスですか?
たとえば、同じセッションからのLog.debugを使用したアプリからのログは次のとおりです。
12-14 13:50:42.717: DEBUG/Curve(2298): LIFECYCLE - OnStart
私のアプリのPIDは492ではなく2298です。これは、GCが私のアプリによるものではなかったことを意味しますか?
割り当てトラッカーを使用すると、発生する割り当てはほとんどありません。数行のロギングにより、いくつかの文字列が生成され、ユーザーが押すと時々Rectが生成されます(これを修正したので、今は1回だけ割り当てられます...)したがって、アプリ自体がどのように生成されるかわかりません。 GCの必要性。
2)それが私のアプリの割り当てではなく、単にメモリに食い込んでいる他のプロセスである場合、それは私のアプリにまったく影響を与えるべきですか?
3)私がddmsを使用しているという事実自体が、GCを引き起こしている可能性がありますか?
4)割り当てトラッカーを調べると、実行中/自分自身で実行しているコードに由来しないエントリがいくつかあります。そのうちの1つはスレッドの統計に関連していましたが、これはddmsでしょうか?
これが本当にいくつかの質問である場合は申し訳ありませんが、Logcatに表示されるGCログが実際にアプリケーションからのものであるかどうかにすべて関係しています。
現時点では、電話が座っていてアプリが実行されておらず、まだ小さなGCが5〜15秒かかっていることを念頭に置いてください。これらは通常33ミリ秒間実行され、非常に少量のメモリのようです。だから、これは彼らが私のせいではないことを意味すると思います。-ここでも基本的にPIDとそれが示すものについてです。