2

q(さておき-作成されたが変数に格納されていないオブジェクトの用語が何であるかわかりません)。

私の質問をうまく表現する方法がよくわからないので、説明します。

2 つのオブジェクトが宣言されている例 1:

Random random = new Random();
for (int i = 0; i < 10000000; i += 1){
    Integer integer = new Integer(random.nextInt());
    String string = integer.toString();
}

宣言されたオブジェクトが 1 つだけの例 2:

Random random = new Random();
for (int i = 0; i < 10000000; i += 1){
    String string = (new Integer(random.nextInt())).toString();
}

2 番目の例では、Integer オブジェクトは引き続き作成されますが、メモリ内のその場所は保存されません (と思います)。オブジェクトの作成を 1 つ減らすことは重要ではないように思えますが、反復回数が多い大規模なループでは、オブジェクト参照を半分にすることは確かに有益です。この手法はメモリを節約しますか (つまり、ガベージ コレクションを最小限に抑えますか)?

編集:質問をよりよく説明するために例を変更しました。

4

4 に答える 4

1

この手法はメモリを節約しますか (つまり、ガベージ コレクションを最小限に抑えますか)?

実際、あなたは2つの異なる質問をしています。答えは「いいえ(実際には)」と「いいえ」です。

(これは、質問の元のバージョンと更新されたバージョンの両方に適用されます。)


最初の答えは少し説明が必要です。

最初の例では、これがループ内にある場合、変数stringinteger変数は何度も範囲外になるか、何度も上書きされます。(あなたの例では、それらは範囲外になります。)

これらのいずれかが発生した場合、変数の現在の値は「忘れられ」、対応するオブジェクトに到達できなくなります。

2 番目の例では、オブジェクトを変数に入れていないIntegerため、対応するオブジェクトは数ナノ秒早く到達不能になる可能性があります。ただし、このコードはループ内にあるため、違いはごくわずかです。実際、それはおそらく測定不可能です。


2番目の答えは説明が簡単です。コードは、2 つの割り当てのいずれか (つまり、 を作成するステートメントまたは を作成する内部のステートメント) がすぐに使用できるよりも多くのメモリを必要とする場合にのみ、ガベージ コレクションをトリガーします。コードの両方のビットが同じ割り当てを行うため、GC が実行される回数に違いはありません。newIntegerInteger.toString()String


もう 1 つのポイントは、これらのことを Java でこのレベルの詳細で考えるのは時間の無駄だということです。一般に、ガベージ コレクターは処理を行うだけです。この特定の例では、「最適化」の最大の理論的利点は、1 つのIntegerオブジェクトが以前のガベージ コレクション サイクルで解放される可能性があることです。そのオブジェクトは 16 バイトのオーダーで占有します。考えるだけの価値はありません。

あなたがしていることは、業界では「時期尚早の最適化」として知られています。それに時間を無駄にしないでください。最適化する必要がある場合は、プログラムが動作するまで待ってからプロファイルを作成します。次に、プロファイラーが問題だと言っている部分にエネルギーを注ぎます。

于 2013-07-21T05:02:21.703 に答える
1

2 つのアプローチのいずれであるかに関係なく、どちらのアプローチでも、1 回の反復の範囲内で作成される 2 つのオブジェクトがあります。反復が完了すると、両方が の対象となりgcます。

現在、IMO GC minor cycle(この特定の短命オブジェクトのケース) は反復ごとではなく、関連するスペースが GCed オブジェクトでいっぱいになったときに発生します ( で確認してくださいjstat -gcutil)。同様のメモリ統計。

于 2013-07-21T05:03:31.663 に答える
0

これは時期尚早の最適化であり、おそらく実際にこれを行う必要はありません。

でも、はい。スコープ外に出ない限り、integerガベージ コレクションされることはありません。

于 2013-07-21T04:27:55.503 に答える
0

到達できないオブジェクトは、ガベージ コレクションの対象となります (あなたの場合new Integer(5))

ガベージ コレクションのチューニングを参照してください。

于 2013-07-21T04:31:13.210 に答える