Skip to content

Instantly share code, notes, and snippets.

@buzztaiki
Created December 20, 2011 21:55
Show Gist options
  • Select an option

  • Save buzztaiki/1503469 to your computer and use it in GitHub Desktop.

Select an option

Save buzztaiki/1503469 to your computer and use it in GitHub Desktop.
Sample usage of SoftReference and ReferenceQueue.
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);
}
}
}
@buzztaiki
Copy link
Copy Markdown
Author

r:SoftRefSample$Hoge@7000a32b
java.lang.OutOfMemoryError: Java heap space
q:null
r:null
n:mage
ends.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment