-1

私は現在 Java でプログラムを書いていますが、プログラミングを行ってから長い時間が経ち、動的メモリ割り当てを行ってからさらに長くなり、Java でプログラミングしてからさらに長くなりました!

教えてください: dataBytes 配列を削除/解放/etc する必要がありますか、それともガベージ コレクションのために残すべきですか、それとも myFunc() スコープを終了するときにメモリを自動的に削除/解放しますか?

PS myFunc が頻繁に呼び出されない場合、メモリは問題にならない可能性が高いことはわかっていますが、アプリの起動が近づくにつれ、将来的に動的メモリ割り当てをより多く使用することがわかっているので、冗談を言ってください。

public void myFunc() {
    byte[] dataBytes = null;

    try {
        // Open data file and read contents to byte array buffer
        InputStream inputFile= parent.getAssets().open("myFile.txt");

        dataBytes = new byte[inputFile.available()];

        taxesFile.read(dataBytes);
        taxesFile.close();

        return;
    } catch (IOException e) {
        System.err.println("Failed to open myFile.txt");
        e.printStackTrace();
    }
}

ご協力いただきありがとうございます!

4

2 に答える 2

1

Java の GC は、GC ルートから始まるチェーンを介してオブジェクトに到達できない場合、オブジェクトを「ガベージ」と見なします。

Java には 4 種類の GC ルートがあります。

  1. ローカル変数は、スレッドのスタックによって維持されます。これは実際のオブジェクトの仮想参照ではないため、表示されません。すべての意図と目的において、ローカル変数は GC ルートです。

  2. アクティブな Java スレッドは常にライブ オブジェクトと見なされるため、GC ルートです。これは、スレッド ローカル変数の場合に特に重要です。

  3. 静的変数は、そのクラスによって参照されます。この事実により、それらは事実上の GC ルートになります。クラス自体をガベージ コレクションすることができます。これにより、参照されているすべての静的変数が削除されます。これは、アプリケーション サーバー、OSGi コンテナー、またはクラス ローダーを一般的に使用する場合に特に重要です。

  4. JNI 参照は、ネイティブ コードが JNI 呼び出しの一部として作成した Java オブジェクトです。このようにして作成されたオブジェクトは、ネイティブ コードによって参照されているかどうかを JVM が認識できないため、特別に扱われます。このようなオブジェクトは、GC ルートの非常に特殊な形式を表します。

dataBytes 配列を削除/解放/etc する必要がありますか、ガベージ コレクションのためにそのままにしておくべきですか、それとも myFunc() スコープを終了するときにメモリを自動的に削除/解放する必要がありますか

dataBytes配列参照を設定しnullたり、GC を要求したりしSystem.gc()ても、保証されません。メソッドが戻り、そのスタックがクリアされると、その配列オブジェクトへの参照を保持しているローカル変数は消去されます。その配列オブジェクトが他のアクティブな参照変数によって参照されていない場合、ガベージ コレクションの対象になります。JVMに任せてください。

于 2013-07-17T04:38:46.483 に答える
1

In Java, you do not need to manually free/delete memory. The garbage collector will take care.

Also, whenever you create a new object, it is created on the heap. Again, you will never need to free any memory, even the heap memory.

于 2013-07-17T04:39:38.940 に答える