Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaでのメモリリーク


Javaでは、ガベージコレクション(デストラクタの作業)は、ガベージコレクションを使用して自動的に実行されます。しかし、コード内にそれらへの参照を持つオブジェクトがある場合はどうなりますか?割り当てを解除することはできません。つまり、メモリをクリアすることはできません。このような状況が何度も発生し、作成または参照されたオブジェクトがまったく使用されない場合、それらは役に立たなくなります。これは、メモリリークと呼ばれるものです。

メモリ制限を超えると、プログラムはエラー、つまり「OutOfMemoryError」をスローして終了します。これが、Javaガベージコレクタがオブジェクトを自動的に破棄できるように、オブジェクトへのすべての参照を削除することが常に推奨される理由です。

以下は、使用しようとしているメモリが多すぎる場合にコンパイラがスペースを使い果たす様子を示す例です-

import java.util.Vector;
public class Demo{
   public static void main(String[] args){
      Vector my_v1 = new Vector(314567);
      Vector my_v2 = new Vector(784324678);
      System.out.println("This is the last line to be printed");
   }
}

出力

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.base/java.util.Vector.<init>(Vector.java:142)
at java.base/java.util.Vector.<init>(Vector.java:155)
at Demo.main(Demo.java:7)

Demoという名前のクラスには、2つのベクトルオブジェクトに大きすぎるスペースを割り当てて作成したメイン関数が含まれています。最後の印刷行は、コンパイラがその行に到達したかどうかを確認するために書き込まれます。実際には、これらのベクトルが占めるスペースは巨大であり、大量のメモリを割り当てることができず、エラーが発生するため、そうではありません。


  1. Javaでスレッドセーフなコレクションクラスはどれですか?

    スレッドセーフ classは、クラスの内部状態とメソッドからの戻り値が、複数のスレッドから同時に呼び出されているときに正しいことを保証するクラスです。 スレッドセーフのコレクションクラス Javaではスタックです 、ベクター 、プロパティ 、ハッシュテーブル 、など。 スタック スタック Javaのクラスは、 LIFOの原則に基づくスタックデータ構造を実装します。 。つまり、スタック クラスは、プッシュ、ポップ、ピーク、検索、空などの多くの操作をサポートできます 、など。 例 import java.util.*; public class StackTest {    p

  2. Javaのプログラムで使用されているメモリを確認するにはどうすればよいですか?

    長期的なの場合 動的メモリを多用するJavaコードでは、メモリ不足エラーが発生する可能性があります ヒープスペースのメモリ不足が原因です。 以下のプログラムでは、プログラムが使用するJavaヒープの空き領域をテストできます。ヒープスペースが使用されている場合90%以上 、その後、ガベージコレクタは明示的に呼び出されます。 System.gc() ガベージコレクターが完了するまで、呼び出しは呼び出し元のスレッドをブロックしています。したがって、このコードは別のスレッドで実行できます。 例 public class GCTest {    public void runGC(