4

現在、GC_CONCURRENT 呼び出しを回避しようとしているため、メイン ループを実行しています。計算を行うために複雑なオブジェクトを作成することが多いことに気付きました。

だから私の質問は、そのオブジェクトをクラスのフィールドとして宣言するのではなく、それを使用するメソッドでそれを宣言するのがパフォーマンスに役立つでしょうか?

または、私の英語はおそらくあなたの脳を傷つけているので、フィールドとしてのコード例を次に示します

class myclass{
    private MyObject myObject;
    ...
    public void myLoopedMethod(...){
        myObject = new MyObject(...);
        myObject.dostuff;
    }

メソッドの例

class myclass{
    ...
    public void myLoopedMethod(...){
        MyObject myObject = new MyObject(...);
        myObject.dostuff;
    }

適切なスコープはメソッドになりますが、フィールドにすることで、メモリが常に解放され、同じ場所に割り当てられるのではないかと疑っています。これは本当で、GC 呼び出しを回避するのに役立ちますか?

また、おそらくこのようなことをする必要がありますが、上記のロジックが理にかなっている場合は興味があります。

class myclass{
    private MyObject myObject;
    ...
    public void myMethod(...){
        myObject.setNewValues(...);
        myObject.dostuff;
    }
}
4

2 に答える 2

5

しかし、フィールドにすることで、メモリが常に解放され、同じ場所に割り当てられるのではないかと疑っています。これは本当で、GC 呼び出しを回避するのに役立ちますか?

メモリが同じ場所に割り当てられるという保証はありません。実装詳細です。

あなたの例では、インスタンス変数の場合、このインスタンス変数によって参照されるすべてのオブジェクトは、インスタンス変数からの参照がまだある最後のオブジェクトを除いて、GC の対象になります (到達可能な参照がない場合、最後のオブジェクトは GC の対象になります)。

内部メソッドを定義する場合、この参照によって参照されるすべてのオブジェクトは、ループが完了するとすぐに GC の対象になります。

したがって、ループで識別されたオブジェクトへの参照が必要でない限り、メソッド内で定義することをお勧めします。

GC 呼び出しを回避することに疑問が生じると、両方のアプローチでほぼ同じ量の GC アクティビティが発生すると思います。メモリに実際の問題がない限り、メモリの割り当てと GC について心配しないことをお勧めします。VM はそのようなことを処理するのに十分なほどインテリジェントです。

于 2012-12-21T15:00:57.823 に答える
0
  1. はい、オブジェクトの作成が頻繁に呼び出されるメソッド内にある場合、ガベージ コレクターの作業が増えます。

  2. 推測するのではなく、常に測定してください... 理論上の利点は取るに足らないものかもしれません。

于 2012-12-21T15:00:51.883 に答える