2012-02-10 7 views
1

私はツリーの作成を含むシミュレーションを実行しています。 私のツリーの分岐係数は2/3から7/8です。ガベージコレクタとプール

私はそれを展開する必要があるたびに、私は子供のための配列を割り当てます。 私は1つのブランチを新しいツリーにします(ルートの子をルートとして設定することによって)ので、残りのツリーはゴミになります。

ガベージコレクタに自分の仕事をさせる方がいいかどうか(私はツリールートを変更するとSystem.gc()を使って収集を開始することを提案します)私がルートを変更すると、現在無駄なノードをすべてリサイクルします。

答えは:アンドロイドガベージコレクタが非常に最適化されているか、これがかなり消費されていても、オブジェクトの作成/破壊を制限する方が望ましいですか(私はすべてのツリーをたどり、私のプールのための各無駄なノード)

私は、アンドロイドGCは "進化"(それは基本的にあなたが低メモリを持っているときに実行されていません)と読んでいます。ツリーのルートはgcのガーベジが単一のパスですべてのツリーを集めるようにします。そうしないと、ノードだけが表示され、そのノードの子ノードは次のパスなどになります。

答えて

1

GCがevであるかどうかを理解する必要があるあなたの心配ですだから-verbosegcであなたのアプリを走らせてください。 GCがパフォーマンスの問題やメモリの蓄積を報告している場合は、それを心配することができます。そうでなければあなたのやり方から排除してください。

GCは世代ごとに機能します。基本的にあなたの割り当ては世代に分かれています。あなたのアプリケーションがロードされると、すべての割り当ては世代0になります。そして、アプリケーションが進むにつれて、割り当ては第1世代と第2世代になります。実行時のGCは第1世代と同じくジェネレーション0ではあまり頻繁に機能しません。これは、ロード時に割り当てたオブジェクトが、後で作成されるオブジェクトと同じくらい頻繁に解放される必要がないという前提で行われます。任意のアプリケーションでhttp://chaoticjava.com/posts/how-does-garbage-collection-work/

  • から

    興味深い引用、オブジェクトは ライフラインに基づいて分類することができます。

  • ほとんどのローカル変数 などの一部のオブジェクトは短期間であり、一部は アプリケーションのバックボーンのように長命です。世代別ガベージコレクションについて
  • の思考は は€アプリケーションで€™sの 寿命は、ほとんどのインスタンス化されたオブジェクトが短命であることを、そして は短命に長命のオブジェクト間のいくつかの接続があることを理解して可能になりました オブジェクト
+0

私は既にこの記事を読んでいますが(そして、それは本当に面白いですが)、私は特にアンドロイドgcについて話しています。私のアプリケーションでは、頻繁に実行するように継ぎ目があります(logcatはGC_Concurrentを印刷し、x%y/zを解放し、5ms + 6msとします)。アプリケーションはパフォーマンス上の問題ではありません(まだ60fpsで動作しています)、アンドロイド(モバイル版)**プラットフォームのベストプラクティス**については、ほとんど疑問に思っています(記事は2008年のものですから、アンドロイドgcに加えて、私はアンドロイドgcがそれ以降のバージョンで大きく変わったと思う) –

+0

あなた自身のtreenodesを実装することは実際にはそれを解決する興味深い方法です。質問はここで何を測定しているのですか?パフォーマンスを測定していない場合は、メモリの使用率ですか?あなたがここで何を測定しているかを知っていない限り、どちらの利点が得られるかは分かりません。GCがあまりにも多くの時間を費やしているのですか?あなたがあなたのアプリから期待する回答を得ていませんか?それはあまりにも多くの記憶を占めていますか?あなた自身のプールを書くことによって、あなたはGCを改善するだろうと思いますか? gcが問題の場合は、gcがどれくらいの時間を使い果たしているかを測定し、プールを書き、再度測定してください。測定していますか? – Siddharth

+0

私はすでにジェネリックプールを持っているので、TreeNodeのプールを書くことは、TreeNodeをリクエストするときに値を修正し、TreeNodeをリサイクルするときにすべての子をリサイクルするようにツリーをトラバースするという問題です。メモリは今のところ縫い目がない(私はまだ私のコードで解決するいくつかのバグを持っているので、私はまだ長い時間のシミュレーションを試していない)、そしてCPUはあまりではないが、私はモバイルで実行しているので私のコードが効率的になればなるほど、バッテリーを節約してユーザーを浪費させることになります。アンドロイドはこの件に関して残酷です(アプリがどれだけのバッテリーを消費するかをはっきりと示しています)。いいえ、私は測定していません..(良い点) –

関連する問題