java.lang.ref.Reference é¢é£ - å°éå¯è½æ§
ããããã°ã大æã«ãããåããããã¨ãè¨ã£ã¦æ¾ãæãã¦ãã java.lang.ref ããã±ã¼ã¸é¢é£ã®ã¯ã©ã¹ã¨ãã®å¨è¾ºç¥èã
å
æ¥ãsoft reference ã¨ãã®è©±ãåºã¦ããã®ã§ãä»åº¦ã¯ã¡ããã¨èªãã§ã¿ãã(ã¨ããããå°éå¯è½æ§ã«ã¤ãã¦)
java.lang.ref (Java 2 Platform SE 5.0)
å°éå¯è½æ§ã«ã¤ãã¦ã¯ä»¥ä¸ã®ãããªæãã
- å¼·å°éå¯è½ ãªãªãã¸ã§ã¯ã:
- ä¸çªèª¬æããããã®ã¯ããããªãã¸ã§ã¯ãã®ã¤ã³ã¹ã¿ã³ã¹å¤æ°ãªã©ã«ä¿æããã¦ããç¶æ ã
- Reference ãªãã¸ã§ã¯ããä»ããªãã¦ãåç §ã§ããã
- ã½ããå°éå¯è½ ãªãªãã¸ã§ã¯ã:
- å¼·å°éå¯è½ã§ã¯ãªãããã½ããåç §(soft reference)ãä»ãããã¨ã§åç §å¯è½ãªãªãã¸ã§ã¯ãã
- 1å以ä¸ã® SoftReference ã¨0å以ä¸ã® WeakReference ã¾ã㯠PhantomReference ãä¿æãã¦ããç¶æ ã
- å¼±å°éå¯è½ ãªãªãã¸ã§ã¯ã:
- å¼·å°éå¯è½ã§ãã½ããå°éå¯è½ã§ããªãããå¼±åç §(weak reference)ãä»ãããã¨ã§åç §å¯è½ãªãªãã¸ã§ã¯ãã
- 1å以ä¸ã® WeakReference ã¨0å以ä¸ã® PhantomReference ãä¿æãã¦ããç¶æ ã
- ãã¡ã¤ãã©ã¤ãºã®å¯¾è±¡ã¨ãªã£ã¦ããã
- ãã¡ã³ãã å°éå¯è½ ãªãªãã¸ã§ã¯ã:
- å¼·å°éå¯è½ã§ãã½ããå°éå¯è½ã§ãå¼±å°éå¯è½ã§ããªããã¡ã¤ãã©ã¤ãºããããªãã¸ã§ã¯ãã§ããã¡ã³ãã åç §(phantom reference)ãä¿æãã¦ãããªãã¸ã§ã¯ãã
- 1å以ä¸ã® PhantomReference ãä¿æãã¦ããç¶æ ã
- å°éä¸å¯è½ ãªãªãã¸ã§ã¯ã:
- ä¸è¨ã®ãããã«ãã£ã¦ãå°éã§ããªããªãã¸ã§ã¯ãã
- åç(reclamation)ã®å¯¾è±¡ã¨ãªã£ã¦ããã
ã§ãããããã®åç §ã®å¼·ãã確èªããããã®æ¤è¨¼ã³ã¼ããã¾ããè¨ãã¾ã§ããªããå¼·ï¼ã½ããï¼å¼±ï¼ãã¡ã³ãã ï¼å°éä¸å¯è½ããªãã ãã©ã
import java.lang.management.ManagementFactory; import java.lang.management.MemoryMXBean; import java.lang.ref.PhantomReference; import java.lang.ref.Reference; import java.lang.ref.SoftReference; import java.lang.ref.WeakReference; import java.util.Date; import java.util.Set; import java.util.TreeSet; public class Main { /** * @param args */ public static void main(String[] args) { MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean(); memoryMXBean.setVerbose(true); { Set<String> set = new TreeSet<String>(); MyObj reference0 = new MyObj(0); /* * 夿° reference0 ã«ä¿æããã¦ãã MyObj ãªãã¸ã§ã¯ãã * å Reference ãªãã¸ã§ã¯ãã«ä¿æããã¦ã¿ãã * => PhantomReference ã¯æåãã get() ã§åç §ã§ããªãã */ { Reference<MyObj> reference = new SoftReference<MyObj>(reference0); System.out.printf(" %-16s: %s\n", reference.getClass().getSimpleName(), reference.get() != null ? "O" : "X"); } { Reference<MyObj> reference = new WeakReference<MyObj>(reference0); System.out.printf(" %-16s: %s\n", reference.getClass().getSimpleName(), reference.get() != null ? "O" : "X"); } { Reference<MyObj> reference = new PhantomReference<MyObj>(reference0, null); System.out.printf(" %-16s: %s\n", reference.getClass().getSimpleName(), reference.get() != null ? "O" : "X"); } /* * Reference ãªãã¸ã§ã¯ã以å¤ã«åç §ãããã®ãããªã MyObj ãªãã¸ã§ã¯ã */ Reference<MyObj> reference1 = new SoftReference<MyObj>(new MyObj(1)); Reference<MyObj> reference2 = new WeakReference<MyObj>(new MyObj(2)); Reference<MyObj> reference3 = new PhantomReference<MyObj>(new MyObj(3), null); new MyObj(4); int i = 0; System.out.printf(" %5d %5d %s %s %s %s\n", -1, set.size(), reference0 != null ? "O" : "X", reference1.get() != null ? "O" : "X", reference2.get() != null ? "O" : "X", reference3.get() != null ? "O" : "X"); for (; i < 1000; i += 8) { System.out.printf(" %5d %5d %s %s %s %s\n", i, set.size(), reference0 != null ? "O" : "X", reference1.get() != null ? "O" : "X", reference2.get() != null ? "O" : "X", reference3.get() != null ? "O" : "X"); } for (; i < 80000; i += 1000) { System.out.printf(" %5d %5d %s %s %s %s\n", i, set.size(), reference0 != null ? "O" : "X", reference1.get() != null ? "O" : "X", reference2.get() != null ? "O" : "X", reference3.get() != null ? "O" : "X"); for (int j = 0; j < 1000; ++j) { set.add(String.valueOf(i + j)); } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } /** * creation 㨠finalization ã®éã«ãã°åºåãããªãã¸ã§ã¯ãã */ public static class MyObj { private int id; public MyObj(int id) { this.id = id; System.out.println(" " + new Date() + ": " + "[" + Thread.currentThread().getName() + "] MyObj(" + id + ")#<init>()"); } protected void finalize() throws Throwable { System.out.println(" " + new Date() + ": " + "[" + Thread.currentThread().getName() + "] MyObj(" + id + ")#finalize()"); super.finalize(); } } }
ã§ãå®è¡çµæã
Fri Nov 27 23:51:02 JST 2009: [main] MyObj(0)#<init>() [GC 505K->249K(1984K), 0.0062355 secs] SoftReference : O WeakReference : O PhantomReference: X Fri Nov 27 23:51:02 JST 2009: [main] MyObj(1)#<init>() Fri Nov 27 23:51:02 JST 2009: [main] MyObj(2)#<init>() Fri Nov 27 23:51:02 JST 2009: [main] MyObj(3)#<init>() Fri Nov 27 23:51:02 JST 2009: [main] MyObj(4)#<init>() -1 0 O O O X 0 0 O O O X 8 0 O O O X (ä¸ç¥) 816 0 O O O X [GC 761K->292K(1984K), 0.0040452 secs] 824 0 O O O X 832 0 O O X X 840 0 O O X X Fri Nov 27 23:51:02 JST 2009: [Finalizer] MyObj(4)#finalize() 848 0 O O X X Fri Nov 27 23:51:02 JST 2009: [Finalizer] MyObj(3)#finalize() 856 0 O O X X Fri Nov 27 23:51:02 JST 2009: [Finalizer] MyObj(2)#finalize() 864 0 O O X X 872 0 O O X X (ä¸ç¥) 992 0 O O X X 1000 0 O O X X 2000 1000 O O X X 3000 2000 O O X X (ä¸ç¥) 17000 16000 O O X X 18000 17000 O O X X [GC 1705K->1684K(2240K), 0.0070140 secs] [Full GC 1684K->1684K(2240K), 0.0400832 secs] Fri Nov 27 23:51:19 JST 2009: [Finalizer] MyObj(1)#finalize() 19000 18000 O X X X 20000 19000 O X X X (ä¸ç¥) 28000 27000 O X X X 29000 28000 O X X X [GC 2609K->2588K(3352K), 0.0072466 secs] (ç¶ã)
çµæãè¦ã¦ã¿ãã(å°éä¸å¯è½ãªãªãã¸ã§ã¯ãã¸ã®åç §ã便å®ä¸ãç¡åç §ãã¨è¨ãã)
- ãã¡ã³ãã åç §ã¯ãããã£ã±ãªãã get() ã null ãè¿ããã¤ã¾ãããã¯ãå¤é¨ããåç §ãããã¨ã¯ã§ããªããã¨ã表ãã(ãã¡ããããããå¼·ãåç §ãå¥ã«ããã°åç §ã§ãã)
- ãã¡ã³ãã åç §ãå¼±åç §ãç¡åç §ã¯ãæåã® GC ã§ finalize() ãå¼ã³åºãããã(ãã¡ã³ãã å°éå¯è½ãªãªãã¸ã§ã¯ãã¯ããã¡ã¤ãã©ã¤ãºãããããªãã¸ã§ã¯ãã¨ãããã¨ã ããfinalize() ãå¼ã³åºãããã®ã¯ GC ã®ã¨ããã¨ãããã¨ããããã¾ããfinalize() ãå¼ã³åºããããã¨ã«ä¾åããã³ã¼ãã¯æ¸ããªãã¨ããã®ã¯éåã ã)
- ã½ããåç §ã¯ãæåã® Full GC ã§ finalize() ãå¼ã³åºãããã(ãã®è¾ºã¯ã©ããã«å®ç¾©ããã¦ããããã§ã¯ãªãããå¼±åç §ããã¯å¼·ãã¨ãããã¨ã¯è¨ããã¨æã)
- å¼·åç §ã¯ãå½ç¶ã®ãã¨ãªãã finalize() ãå¼ã³åºããããã¨ã¯ãªãã