0

これを検索しましたが、これに対する直接的な答えが見つからないようです。

基本的に、配列のコピーを作成するコードがいくつかあり( Arrays.copyOfcreate を使用int[])、いくつかの作業を行い、結果を出力するかArrays.copyOf、さらに処理するためにキューに送信します。

私の結果のコピーを変更すると、もはや正しくないので必要だと思いますが、私のメモリプロファイリングによると、すべてのメモリとガベージコレクションが役立つため、完了後に何かできるかどうか疑問に思っていますが、それは再び構築されます。これが役立つかどうかは本当にわかりませんが、プログラムをint[]キューに送信した後に何らかの形で削除した場合、プログラムがより小さなメモリフットプリントで機能するかどうかをテストしたかったのです。

私はJavaが初めてなので、このロジックに完全に欠陥がある場合、同じ結果を達成する別の方法はありますか? 要点は、新しい配列を作成していて、少し使用されていますが、不要になったときに残ります(最大メモリの15Gが必要です。ガベージコレクタが入ってそれを減らしていると思いますが、数分以内に最大値に戻ります)秒)。たぶん、変数をnullまたは何かに設定することはできますか?

ここに私が何を意味するかを示すためのいくつかのコードがあります(その種類はくだらないですが、コードでのセットアップ方法を理解できることを願っています。これはすべてマルチスレッド呼び出し可能オブジェクト内にあります):

 while(!queue.isEmpty()) {
                int[] data_list = Arrays.copyOf(current.list, current.list.length);

                    if (things work) {
                        Sysout("print results");
                    } else if (current.k > 0) {
                        queue.add(new Queue(data_list)); 

                    }
                }
            }
4

1 に答える 1

1

一般に、ここで行うことは、「ガベージコレクターが何をしているのかを知っていることを信頼すること」です。JVMは、オブジェクトが不要になったとき、特にオブジェクトが作成されたメソッドを「エスケープ」しないことを証明できる場合は特に、それを把握するのに非常に優れています。

Javaは、オブジェクトへのすべての参照を削除することを除いて、オブジェクトによって使用されているメモリを削除する方法さえ提供しません。これはまさにあなたがしていることです。

于 2012-04-12T15:38:01.290 に答える