javaの中の引用のタイプの強い弱さの虚は詳しく解説します。


前言
javaの中の引用のタイプは全部で4種類あります。強い弱い虚、具体的な各タイプの特徴と応用シーン。記録します。本文は馬兵先生のビデオを見て整理したものです。印象を深める。
基本概念
1.強引用
強引用は最も一般的な参照を使用します。もし一つの対象が強い引用を持っているなら、ゴミ回収器は決して回収しません。メモリの空間が足りない時、Java仮想マシンはOutOfMemoryErrエラーを投げて、プログラムを異常終了させても、強い参照を持つオブジェクトを自由に回収してメモリ不足の問題を解決してもいいです。

Mオブジェクトがnullであるか、オブジェクトのライフサイクル範囲を超えているかを明示的に設定すると、gcはオブジェクトが参照されていないと考え、このオブジェクトを回収することができます。
サンプルコード
Mクラスを宣言します

public class M {

 /**
  *             ,finalize    
  *
  * @throws Throwable
  */
 @Override
 protected void finalize() throws Throwable {
  System.out.println("finalize");
 }
}
強引用呼び出し

public class NormalReference {

 public static void main(String[] args) throws IOException {
  M m = new M();
  m = null;
  System.gc();

  //      main    。System.gc()        ;
  //           main      
  System.in.read();
 }
}
出力結果
finalize
2.ソフト引用
ソフト引用対象はjvmメモリが足りない時に回収されます。

コードの例

public class Soft {

  public static void main(String[] args) {
    System.out.println(Runtime.getRuntime().totalMemory() / 1024 / 1024);
    //10m
    SoftReference<byte[]> m = new SoftReference<>(new byte[1024 * 1024 * 10]);

    System.out.println(m.get());
    System.gc();
    try {
      Thread.sleep(1500);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    System.out.println(m.get());

    //        ,heap    ,          ,
    //      ,    ,       
    byte[] b = new byte[1024 * 1024 * 11];

    System.out.println(m.get());
  }
}
プログラム運転パラメータを設定します。-Xmx20M実行結果
19。
[B@1540e19d
[B@1540e19d
null
私たちはこの時すでに回収されているのを見ることができます。
アプリケーションシーン:ソフト引用時にキャッシュする
3.弱引用
弱い引用とソフト引用の違いは、弱い引用の対象だけがより短いライフサイクルを持つことです。ゴミ回収スレッドが所管するメモリ領域をスキャンする過程で、弱い参照のみの対象が発見されると、現在のメモリ空間が十分であるかどうかにかかわらず、メモリが回収されます。
コードの例

public class Weak {

  public static void main(String[] args) {
    WeakReference<M> m = new WeakReference<>(new M());

    System.out.println(m.get());
    System.gc();
    System.out.println(m.get());
  }
}
実行結果
M@1540e19d
null
finalize
4.虚引用
もし一つのオブジェクトが虚引用だけを持っているなら、それは何の引用もないのと同じで、いつでもごみ箱に回収されます。
虚引用は引用行列と連携して使用する必要があります。ゴミ回収器が一つの対象を回収しようとすると、虚引用があると発見されると、対象のメモリを回収する前に、この虚引用を関連する引用列に追加します。


public class Phantom {

  private static final List<Object> LIST = new LinkedList<>();
  private static final ReferenceQueue<M> QUEUE = new ReferenceQueue<>();

  public static void main(String[] args) {
    PhantomReference<M> phantomReference = new PhantomReference<>(new M(), QUEUE);

    new Thread(
        () -> {
          while (true) {
            LIST.add(new byte[1024 * 1024]);
            try {
              Thread.sleep(1000);
            } catch (InterruptedException e) {
              Thread.currentThread().interrupt();
            }
            System.out.println(phantomReference.get());
          }

        }

    ).start();

    new Thread(() -> {
      while (true) {
        Reference<? extends M> poll = QUEUE.poll();
        if (poll != null) {
          System.out.println("-------      jvm   ------" + poll);
        }
      }
    }).start();
  }
}
実行結果
finalize
null
Exception in thread“Thread-0”java.lang.OutOfMemoryErr:Java heap space
 at Photom.lamda$main 0(Photom.java:18)
 at Photom$Lamban$1/1078694789.run(Uniknown Source)
 at java.lang.Thread.run(Thread.java:748)
------虚引用オブジェクトはjvmによって回収された------java.lang.ref.PhantomReference@688ee48d
アプリケーションシーン:ヒープ外メモリの管理
締め括りをつける
ここでは、javaの引用のタイプについての強い弱さ虚の文章を紹介します。javaの引用のタイプの強い弱さと虚の内容については、以前の文章を検索してください。または、下記の関連記事を引き続きご覧ください。これからもよろしくお願いします。