このJavaの例はメモリリークを引き起こしますか?

BachT:

簡単な例があります。この例では、10000000のランダムな整数を含むArrayList<Integer>ファイルからをロードしfます。

doLog("Test 2");
{
    FileInputStream fis = new FileInputStream(f);
    ObjectInputStream ois = new ObjectInputStream(fis);
    List<Integer> l = (List<Integer>) ois.readObject();
    ois.close();
    fis.close();
    doLog("Test 2.1");
    //l = null; 
    doLog("Test 2.2");
}
doLog("Test 2.3");
System.gc();
doLog("Test 2.4");

私が持っているときl = null、私はこのログを取得します:

Test 2                          Used Mem = 492 KB   Total Mem = 123 MB
Test 2.1                        Used Mem = 44 MB    Total Mem = 123 MB
Test 2.2                        Used Mem = 44 MB    Total Mem = 123 MB
Test 2.3                        Used Mem = 44 MB    Total Mem = 123 MB
Test 2.4                        Used Mem = 493 KB   Total Mem = 123 MB

しかし、それを削除すると、代わりにこのログが表示されます。

Test 2                          Used Mem = 492 KB   Total Mem = 123 MB
Test 2.1                        Used Mem = 44 MB    Total Mem = 123 MB
Test 2.2                        Used Mem = 44 MB    Total Mem = 123 MB
Test 2.3                        Used Mem = 44 MB    Total Mem = 123 MB
Test 2.4                        Used Mem = 44 MB    Total Mem = 123 MB

Used Memory によって計算されます: runTime.totalMemory() - runTime.freeMemory()

質問:ケースでl = null;存在している、メモリリークがありますか?lにアクセスできないのに、なぜそれを解放できないのですか?

ケッピル:

上記のコードにはメモリリークはありません。

コードブロックをで囲んだままにする{}と、変数lはスコープ外になり、最初にList設定したかどうかに関係なく、はガベージコレクションの候補になりますnull

ただし、コードブロックの後、メソッドが戻るまで、Listinvisibleと呼ばれる状態にあります。これは事実ですが、JVMが参照を自動的にnullにしてListのメモリを収集することはほとんどありませんしたがって、明示的に設定l = nullすると、JVMがメモリ計算を行う前にメモリを収集するのに役立ちます。それ以外の場合は、メソッドが戻るときに自動的に発生します。

ガベージコレクターがいつ実行されるか正確にはわからないため、コードの実行ごとに異なる結果が得られる可能性があります。あなたはそれを使って実行すべきだと思うことを提案できますSystem.gc()(そしてそれはList設定なしでも見えないものを収集するかもしれませんl = null)が、約束はありません。これはSystem.gc()のjavadocに記載されています。

gcメソッドを呼び出すと、Java Virtual Machineが未使用のオブジェクトをリサイクルして、現在それらが使用しているメモリをすばやく再利用できるようにするための労力が費やされることを示唆しています。メソッド呼び出しから制御が戻ったとき、Java仮想マシンは、破棄されたすべてのオブジェクトからスペースを回収するために最善の努力をしました。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

このObservableはメモリリークを引き起こしますか?

分類Dev

NavigableMapのsubMapはメモリリークを引き起こしますか?

分類Dev

「新規」は Java でメモリ リークを引き起こしますか?

分類Dev

MVVMへのこのアプローチはメモリリークを引き起こしますか?

分類Dev

ループ内のこのArray.newは、メモリリークを引き起こしますか?

分類Dev

Angular.js-このディレクティブはメモリリークを引き起こしますか?

分類Dev

このパターンはメモリリークを引き起こしますか

分類Dev

このプログラムはメモリリークを引き起こしますか?

分類Dev

この関数はC ++でメモリリークを引き起こしますか?

分類Dev

このビットマップはメモリリークを引き起こしますか?

分類Dev

NSRunAlertPanelはメモリリークを引き起こします

分類Dev

ajaxへの再帰呼び出しはメモリリークを引き起こしますか?

分類Dev

以下のコードはメモリリークを引き起こしますか?

分類Dev

このRunnableクラスはメモリリークを引き起こす可能性がありますか?

分類Dev

malloc + forkはメモリリークを引き起こしますか?

分類Dev

while ループでの PHPExcel ライブラリは、メモリの増加を引き起こしますか?

分類Dev

この関数がメモリリークを引き起こすのはなぜですか?

分類Dev

このJavaScriptがメモリリークを引き起こすのはなぜですか?

分類Dev

Golang WaitGroupがメモリリークを引き起こしています。この機能を改善するにはどうすればよいですか。

分類Dev

このコードはAndroidでメモリリークを引き起こす可能性があります

分類Dev

Rustのメモリ管理はメモリの断片化を引き起こしますか?

分類Dev

unique_ptrリリースはメモリリークを引き起こしますか?

分類Dev

tf.browser.fromPixel(video)はメモリリークを引き起こします

分類Dev

std :: make_shared <Type>はメモリリークを引き起こします

分類Dev

動的メモリ要求は何を引き起こしますか?

分類Dev

AVAudioPlayerがメモリリークを引き起こしていますか?メモリを解放しますか?

分類Dev

Webアプリケーションの静的変数はメモリリーク(およびOutOfMemoryの観点から)を引き起こしますか?

分類Dev

メモリリークはどのようにして情報リークを引き起こす可能性がありますか?

分類Dev

Task.Delay()を使用したループは、メモリリークを引き起こしますか?

Related 関連記事

  1. 1

    このObservableはメモリリークを引き起こしますか?

  2. 2

    NavigableMapのsubMapはメモリリークを引き起こしますか?

  3. 3

    「新規」は Java でメモリ リークを引き起こしますか?

  4. 4

    MVVMへのこのアプローチはメモリリークを引き起こしますか?

  5. 5

    ループ内のこのArray.newは、メモリリークを引き起こしますか?

  6. 6

    Angular.js-このディレクティブはメモリリークを引き起こしますか?

  7. 7

    このパターンはメモリリークを引き起こしますか

  8. 8

    このプログラムはメモリリークを引き起こしますか?

  9. 9

    この関数はC ++でメモリリークを引き起こしますか?

  10. 10

    このビットマップはメモリリークを引き起こしますか?

  11. 11

    NSRunAlertPanelはメモリリークを引き起こします

  12. 12

    ajaxへの再帰呼び出しはメモリリークを引き起こしますか?

  13. 13

    以下のコードはメモリリークを引き起こしますか?

  14. 14

    このRunnableクラスはメモリリークを引き起こす可能性がありますか?

  15. 15

    malloc + forkはメモリリークを引き起こしますか?

  16. 16

    while ループでの PHPExcel ライブラリは、メモリの増加を引き起こしますか?

  17. 17

    この関数がメモリリークを引き起こすのはなぜですか?

  18. 18

    このJavaScriptがメモリリークを引き起こすのはなぜですか?

  19. 19

    Golang WaitGroupがメモリリークを引き起こしています。この機能を改善するにはどうすればよいですか。

  20. 20

    このコードはAndroidでメモリリークを引き起こす可能性があります

  21. 21

    Rustのメモリ管理はメモリの断片化を引き起こしますか?

  22. 22

    unique_ptrリリースはメモリリークを引き起こしますか?

  23. 23

    tf.browser.fromPixel(video)はメモリリークを引き起こします

  24. 24

    std :: make_shared <Type>はメモリリークを引き起こします

  25. 25

    動的メモリ要求は何を引き起こしますか?

  26. 26

    AVAudioPlayerがメモリリークを引き起こしていますか?メモリを解放しますか?

  27. 27

    Webアプリケーションの静的変数はメモリリーク(およびOutOfMemoryの観点から)を引き起こしますか?

  28. 28

    メモリリークはどのようにして情報リークを引き起こす可能性がありますか?

  29. 29

    Task.Delay()を使用したループは、メモリリークを引き起こしますか?

ホットタグ

アーカイブ