Created
December 20, 2011 21:55
-
-
Save buzztaiki/1503469 to your computer and use it in GitHub Desktop.
Sample usage of SoftReference and ReferenceQueue.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import java.lang.ref.Reference; | |
| import java.lang.ref.ReferenceQueue; | |
| import java.lang.ref.SoftReference; | |
| import java.util.concurrent.Executors; | |
| import java.util.concurrent.ScheduledExecutorService; | |
| import java.util.concurrent.TimeUnit; | |
| public class SoftRefSample { | |
| static class Hoge { | |
| final String s; | |
| Hoge(String s) { | |
| this.s = s; | |
| } | |
| } | |
| static class NamedReference<T> extends SoftReference<T> { | |
| final String name; | |
| NamedReference(T ref, String name, ReferenceQueue<T> queue) { | |
| super(ref, queue); | |
| this.name = name; | |
| } | |
| } | |
| static class ReferenceQueueChecker<T> implements Runnable { | |
| final ReferenceQueue<T> queue; | |
| ReferenceQueueChecker(ReferenceQueue<T> queue) { | |
| this.queue = queue; | |
| } | |
| public void run() { | |
| for (Reference ref = queue.poll(); ref != null; ref = queue.poll()) { | |
| System.out.println("q:" + ref.get()); | |
| if (ref instanceof NamedReference) { | |
| NamedReference namedRef = (NamedReference) ref; | |
| System.out.println("n:" + namedRef.name); | |
| } | |
| ref.clear(); | |
| } | |
| } | |
| } | |
| public static void main(String[] args) throws Exception { | |
| ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); | |
| ReferenceQueue<Hoge> queue = new ReferenceQueue<Hoge>(); | |
| scheduler.scheduleWithFixedDelay( | |
| new ReferenceQueueChecker<Hoge>(queue), 0L, 10L, TimeUnit.MILLISECONDS); | |
| NamedReference<Hoge> ref = new NamedReference<Hoge>(new Hoge("fuga"), "mage", queue); | |
| System.out.println("r:" + ref.get()); | |
| oom(); | |
| System.out.println("r:" + ref.get()); | |
| scheduler.shutdown(); | |
| scheduler.awaitTermination(10, TimeUnit.SECONDS); | |
| System.out.println("ends."); | |
| } | |
| static void oom() { | |
| String s = "aa"; | |
| try { | |
| for (;;) { | |
| s += s; | |
| } | |
| } catch (OutOfMemoryError e) { | |
| System.out.println(e); | |
| } | |
| } | |
| } |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
r:SoftRefSample$Hoge@7000a32b
java.lang.OutOfMemoryError: Java heap space
q:null
r:null
n:mage
ends.