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が強参照タイプオブジェクトを回収する方法
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 { }