JVMゴミ回収の―強弱虚引用
7621 ワード
1.強弱虚引用紹介
JDK1.2以降、サポートされている、ソフト、ソフト、ソフト、ダミーの4種類のリファレンスが表示されます.
(1)Strong Reference強参照,強参照が存在する限り:JVMはこのオブジェクトを回収しない
強引用とは我々が最もよく使うものであり,User u=new User()に類似している.
では、uはUserオブジェクトの強い参照を持っています.また、Userオブジェクトがuに所有されている限り、回収されません.
(2)Soft Referenceソフトリファレンスは,システムメモリがオーバーフローする前にソフトリファレンスが持つオブジェクトを回収する.
メモリがまだ足りない場合は、メモリオーバーフローが発生します.多くのコンポーネントのように、キャッシュオブジェクトを保持するためにソフトインデックスを使用するように設計されています.
(3)Weak Reference弱参照,弱参照に関連付けられたオブジェクトは次のJVMゴミ回収までしか生き残れない
(4)Phantom Reference虚参照、最も弱い参照関係、getメソッドさえ使用できません
ダミーリファレンスから関連オブジェクトを取得するには
2.JVMが強参照タイプオブジェクトを回収する方法
3.JVMがソフトリファレンスオブジェクトを回収する方法
4.JVMが弱い参照オブジェクトを回収する方法
5.JVMがダミー参照オブジェクトを回収する方法
JDK1.2以降、サポートされている、ソフト、ソフト、ソフト、ダミーの4種類のリファレンスが表示されます.
(1)Strong Reference強参照,強参照が存在する限り:JVMはこのオブジェクトを回収しない
強引用とは我々が最もよく使うものであり,User u=new User()に類似している.
では、uはUserオブジェクトの強い参照を持っています.また、Userオブジェクトがuに所有されている限り、回収されません.
(2)Soft Referenceソフトリファレンスは,システムメモリがオーバーフローする前にソフトリファレンスが持つオブジェクトを回収する.
メモリがまだ足りない場合は、メモリオーバーフローが発生します.多くのコンポーネントのように、キャッシュオブジェクトを保持するためにソフトインデックスを使用するように設計されています.
(3)Weak Reference弱参照,弱参照に関連付けられたオブジェクトは次のJVMゴミ回収までしか生き残れない
(4)Phantom Reference虚参照、最も弱い参照関係、getメソッドさえ使用できません
ダミーリファレンスから関連オブジェクトを取得するには
2.JVMが強参照タイプオブジェクトを回収する方法
package com.yli.jvm;
/**
* Strong Reference : new Objec()
* , , :
* User u = new User(); u User
* :
*
* JVM ?
* ,JVM
*
* User , u = null;
* : User
* JVM User ,
* JVM GC , finalize
* JVM User !
*
* : finalize
* User , User ...
*
*
* 10M, 20M
* -Xmn10M -Xms20M -Xmx20M
*
* @author yli
*/
public class TestStrongReference {
private static int _8MB = 8 * 1024 * 1024;
private static TestStrongReference test = new TestStrongReference();
public static void main(String[] args) {
// testOOM();
testSaveSelf();
}
/**
* GC
* finalize , GC
* ,
* , finalize !
*/
private static void testSaveSelf() {
try {
// null, gc
// finalize
test = null;
System.gc();
// 500ms gc
Thread.sleep(500);
//
if (test == null) {
System.out.println("test !");
} else {
System.out.println("test !");
}
//
test = null;
// finalize , !
System.gc();
// 500ms gc
Thread.sleep(500);
//
if (test == null) {
System.out.println("test !");
} else {
System.out.println("test !");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
*
* GC, finalize
* : obj1
* obj2
*
*/
private static void testOOM() {
// 8M
byte[] obj1 = new byte[_8MB];
System.out.println("----> !");
try {
test = null;
System.gc();
// 500ms gc
Thread.sleep(500);
byte[] obj2 = new byte[_8MB];
} catch (OutOfMemoryError err) {
System.out.println("----> !");
err.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* JVM GC ,
*/
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("-------->JVM !");
// test
test = this;
}
}
3.JVMがソフトリファレンスオブジェクトを回収する方法
package com.yli.jvm;
import java.lang.ref.SoftReference;
/**
* SoftReference:
* ,JVM
* !
*
* 5M, 10M( )
* -Xmn5M -Xms10M -Xmx10M
*
* @author yli
*/
public class TestSoftReference {
private static int _8MB = 8 * 1024 * 1024;
public static void main(String[] args) throws InterruptedException {
// 8MB
SoftArticle article = new SoftArticle(new byte[_8MB]);
SoftReference softRef = new SoftReference(article);
// article new SoftUser() , SoftUser 【 】
// article = null
// SoftUser 【softRef】
// :【 】
article = null;
// : 【 】 !
testAliveOrDead(softRef);
// : 8MB
article = new SoftArticle(new byte[_8MB]);
// : 【 】 !
testAliveOrDead(softRef);
}
// get !
private static void testAliveOrDead(SoftReference softRef) {
if (null == softRef.get()) {
System.out.println(" ... JVM ... !");
} else {
System.out.println(" ... !");
}
}
}
class SoftArticle {
private byte[] content;
public SoftArticle(byte[] content) {
this.content = content;
}
public byte[] getContent() {
return this.content;
}
}
4.JVMが弱い参照オブジェクトを回収する方法
package com.yli.jvm;
import java.lang.ref.WeakReference;
/**
* :
*
* @author yli
*/
public class TestWeakReference {
public static int count = 0;
private static TestWeakReference tref = new TestWeakReference();
// user WeakUser
private static WeakUser user = new WeakUser("ali");
public static void main(String[] args) throws InterruptedException {
/**
* WeakReference
*
*/
// user weakRef
WeakReference weakRef = new WeakReference(user);
// weakRef WeakUser
user = null;
System.out.println("user--->" + weakRef.get());
count++;
tref = null;
System.gc();
Thread.sleep(500);
System.out.println("user--->" + weakRef.get());
count++;
tref = new TestWeakReference();
tref = null;
System.gc();
Thread.sleep(500);
System.out.println("user--->" + weakRef.get());
}
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println(String.format(" %s !", count));
}
}
class WeakUser {
private String name;
public WeakUser(String n) {
this.name = n;
}
public String toString() {
return String.format("{name:%s}", name);
}
}
5.JVMがダミー参照オブジェクトを回収する方法
package com.yli.jvm;
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
/**
* :
* , !
*
* JVM GC
* -XX:+PrintGCDetails
*
* @author yli
*/
public class TestPhantomReference {
public static void main(String[] args) {
/**
* : , !
*/
PhantomUser user = new PhantomUser();
ReferenceQueue queue = new ReferenceQueue();
PhantomReference pref = new PhantomReference(user, queue);
// null
System.out.println(pref.get());
}
}
class PhantomUser {
}