A
anfänger12345
Kann mir jemand - so einfach wie nur irgendwie möglich - erklären wie genau WeakReference funktioniert und welche Anwendungsmöglichkeiten ich damit habe ?
Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: Diese Funktion ist in einigen Browsern möglicherweise nicht verfügbar.
package de.tutorials;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class WeakReferenceExample {
public static void main(String[] args) throws Exception {
final ReferenceQueue<Object> refQueue = new ReferenceQueue<Object>();
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.execute(new Runnable() {
public void run() {
while (true) {
try {
Reference<? extends Object> ref = refQueue.remove();
System.out.println("Reference reclaimed by gc: " + ref);
break;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
Object o = new Object();
System.out
.println("0 instance o is created and associated with a WeakReference which is bound to a ReferenceQueue ");
WeakReference<Object> weakRef = new WeakReference<Object>(o, refQueue);
System.out.println("1 Until o is gc'ed the weakRef.get() will return the associated instance");
System.out.println("1 " + weakRef.get());
System.out.println("1 We set o = null to make the instance eligible for gc");
o = null;
for (int i = 0; i < 5; i++) {
Object oo = weakRef.get();
if (oo != null) {
System.out.println("2 Seems that the gc didn't run yet...");
}
TimeUnit.SECONDS.sleep(1);
}
System.out.println("3 Seems that the gc didnt run yet... let's try to trigger gc manually...");
while(weakRef.get() != null){
System.gc();
}
System.out.println("4 now o is really gone...");
executorService.shutdownNow();
}
}
0 instance o is created and associated with a WeakReference which is bound to a ReferenceQueue
1 Until o is gc'ed the weakRef.get() will return the associated instance
1 java.lang.Object@3d4b7453
1 We set o = null to make the instance eligible for gc
2 Seems that the gc did't run yet...
2 Seems that the gc did't run yet...
2 Seems that the gc did't run yet...
2 Seems that the gc did't run yet...
2 Seems that the gc did't run yet...
3 Seems that the gc did't run yet... let's try to trigger gc manually...
4 now o is really gone...
Reference reclaimed by gc: java.lang.ref.WeakReference@5b86d4c1