4

私はJavaで巨大なプログラムで作業していますが、メモリ使用量を改善するために浮浪を避けようとしています.コンストラクターでいくつかのオブジェクトをインスタンス化し、プログラムの最後までインスタンス化したままにしますが、常に使用されるわけではありません. 私の質問は、特にオブジェクトのガベージ コレクション配列に関するものです。

たとえば、ユーザーがメニュー項目を押すと、多くのコンポーネントを含む JDialog が呼び出され、これらのコンポーネントはプログラムの実行時にインスタンス化されましたが、必要に応じてインスタンス化し、そうでない場合は解放したいと考えています。

例えば:

JRadioButton Options = new JRadioButton[20];
for (int i = 0; i < 20; i++) {
    Options[i] = new JRadioButton(Labels[i]);
}

配列を解放したい場合、どうすればよいですか?

これ:

for (int i = 0; i < 20; i++) {
    Options[i] = null;
    Labels[i] = null;
}

または単に:

Options = null;
Labels = null;

前もって感謝します

4

4 に答える 4

3

まず、Java オブジェクトは、到達できない場合にのみガベージ コレクションされます (また、配列以外の参照がある場合もあります)。その後、GC はほぼ予測不可能な時間に実行されます (そのため、メモリはかなり後で解放される可能性があります)。

配列の要素をクリアしても、配列全体は解放されませんが、各要素は解放される可能性があります (到達不能になった場合)。

変数を に設定するnullと、配列 (そしてもちろんすべての要素) が解放される可能性があります。

しかし、非常に小さなプログラムの場合、おそらく GC は発生しません。

ウィキペディアで少なくとも GC を読み、おそらくGC ハンドブックを読んでください。

一部のオブジェクトの活性は、プログラム全体のプロパティであることに注意してください (実際には、プロセス全体のプロパティです。値の活性は、ソース コードではなく、特定の実行に関連しています)。言い換えれば、他の参照パスによって到達可能Options = null;なオブジェクトを保持することができます。Options[24]

于 2012-10-14T07:32:04.043 に答える
2

やってる

Options = null;
Labels = null;

それらのオブジェクトを解放するのに十分なはずです。配列への別の参照がない限り、要素をnullにする必要はありません。ただし、配列への他の参照がある場合、要素をnullにするのは賢明ではないと思います。他の参照は理由のためにあります。配列とその内容が不要になったら、参照を解放する必要があります。

于 2012-10-14T07:47:26.127 に答える
2

が配列への唯一の参照を保持している場合Optionsは、オブジェクトを到達不能にし、オブジェクトをガベージ コレクターに解放します。

他の何かがまだ配列を参照している場合、それはとにかく解放されないため、最初のオプションが内容を解放する唯一のオプションです。最初のオプションは内容のみを解放し、nullに設定しない限りOptions実際の内容を参照することに注意してください。ArrayOptions

于 2012-10-14T07:35:05.633 に答える
1

どちらでも実行できますが、最初の方法をお勧めしてから、2 番目の方法を実行してください。

ArrayList clear()メソッドのソース コードは次のとおりです。

// Let gc do its work
for (int i = 0; i < size; i++)
    elementData[i] = null;

同じことを行う別の方法は

Arrays.fill(Options, null);

配列要素を反復して設定するのとは何の違いもありませんnull

于 2012-10-14T07:30:34.243 に答える