弱い参照とSoftReferenceのJavaのリファレンス

Java1.2では、このパッケージでは、我々はそのような弱い参照SoftReference弱参照と強参照などの参照、についての知識を見つけることができ、java.lang.refのパッケージを見つけることができます。

弱参照(弱い参照):

唯一のオブジェクト参照場合見出されると、オブジェクト宣言は十分ではないにかかわらず、現在のメモリの、その管轄下にごみ回収スレッドスキャンのメモリ領域の途中で、より多くの短命の弱い基準周期を有し、そのメモリを解放し、ただし、ごみ回収期間は、低優先度のスレッドであるため、必ずしも迅速にのみ弱参照を持つオブジェクトを見つけることができませんのでこと。

ソフト参照(SoftReference):

オブジェクトは、唯一のソフト参照、十分なメモリ空間がある場合にも、強力な参照として知られているごみメモリ空間が不足している場合、それは回復していない場合、それは、それがこれらのオブジェクト、ごみ回収期間のメモリを再利用するわけではないであろう回収リサイクル、オブジェクトは、プログラムで使用することができます。

弱い参照とSoftReferenceは入って来:

弱い参照は、一般的になど、回収されるGCのオブジェクトと干渉することなく、オブジェクト参照のどこかを保持するために使用される:デバッグのために、そのようなプログラムメモリなどのツールを、監視します。そのような手順は、一般的であることが観察されるようにターゲットを必要とするため、被験者はGCの通常の過程に影響を与えることができません。

SoftReferenceは、JVMがOutOfMemoryをしようとしている場合を除き、彼らはGCを回復することはありません、オブジェクトのインスタンスを保持している強い参照、です。この機能は、特に適切な設計は、キャッシュオブジェクトになります。キャッシュのために、我々は、オブジェクトが常に最高の永久的なメモリですが、JVMのメモリに余裕があれば、必要なときに、システムのクラッシュを引き起こすために、JVMのキャッシュメモリの回復を可能にするために適切な時期であることを、その後のフォローアップのデータを再び、OutOfMemoryErrorが発生し、キャッシュされたことにしたいですキャッシュにロードします。このシステムは、より柔軟になるように設計されています。

例を通して以下にこれらの2つの参照がオブジェクトインスタンスに格納方法を示すこと:

User.java:

public class User implements Serializable{
 
	private static final long serialVersionUID = 1L;
	
	/* 用户id */
	private Integer uid;
	/* 用户名 */
	private String uname;
 
	public Integer getUid() {
		return uid;
	}
 
	public void setUid(Integer uid) {
		this.uid = uid;
	}
 
	public String getUname() {
		return uname;
	}
 
	public void setUname(String uname) {
		this.uname = uname;
	}
 
}

WeakReferenceTest.java:

public class WeakReferenceTest {
 
	public static void main(String[] args) {
 
		/*创建User对象*/
		User user = new User();
		/*设置username*/
		user.setUname("廖泽民");
		
		/*把对象放在弱引用中*/
		WeakReference<User> weak = new WeakReference<User>(user);
		
		/*把user对象置空,然后再从若引用中取值*/
		user = null;
 
		int i = 0;
 
		/*weak.get()表示从引用中取得对象*/
		while (weak.get() != null) {
 
			System.out.println(String.format("从弱引用中取值: %s, count: %d", weak.get().getUname(), ++i));
 
			if (i % 10 == 0) {
				System.gc();
				System.out.println("内存回收方法被调用");
			}
 
			try {
				Thread.sleep(500);
			} catch (Exception e) {
 
			}
		}
		System.out.println("对象已经被JVM回收");
 
	}
 
}

実行結果:

オペレーティング結果から、我々はにSystem.gc()メソッドが呼び出された後ときにオブジェクトのインスタンス弱い参照を保存するには、そのオブジェクトは、弱い参照から、値、左の空白であることを確認することができ、オブジェクトのインスタンスが回復されます!

SoftReferenceTest.java:

public class SoftReferenceTest {
 
	public static void main(String[] args) {
 
		/* 创建User对象 */
		User user = new User();
		/* 设置用户名 */
		user.setUname("廖泽民");
 
		/* 创建强引用对象 */
		SoftReference<User> soft = new SoftReference<User>(user);
 
		/* 把user对象置空,然后再从强引用中取值【注:要先存在引用中再置空,注意顺序啊】 */
		user = null;
 
		int i = 0;
 
		while (soft.get() != null) {
			System.out.println(String.format("从强引用中获取对象: %s, count: %d", soft.get().getUname(), ++i));
			if (i % 10 == 0) {
				System.gc();
				System.out.println("内存回收方法被调用!");
			}
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
 
			}
		}
		System.out.println("对象已经被JVM回收!");
	}
 
}

結果:

運転結果から(プログラムが実行されるまで停止しません)見つけることができる、我々はその後、SoftReferenceにオブジェクトインスタンス、およびそのオブジェクトの空白、およびを保存するときSoftReferenceからの値、たとえ表示コールにSystem.gc();メソッド、オブジェクトインスタンスは回収されない(メモリオーバーフローしない限り、オブジェクトが回収されます)

公開された532元の記事 ウォンの賞賛2952 ビュー247万+

おすすめ

転載: blog.csdn.net/dataiyangu/article/details/104785761