@Override public String toString() { return MoreObjects. toStringHelper(getClass()). omitNullValues(). add("enqueued",super.isEnqueued()). add("state",this.state). toString(); }
public static void main(String[] args) throws InterruptedException { Object reference = new Object(); ReferenceQueue<Object> referenceQueue = new ReferenceQueue(); WeakReference<Object> weakReference = new WeakReference<Object>(reference, referenceQueue); System.out.println("weakReference.isEnqueued():" + weakReference.isEnqueued()); System.out.println("weakReference.get():" + weakReference.get()); System.out.println("reference:" + reference); reference = null; System.out.println("weakReference.isEnqueued():" + weakReference.isEnqueued()); System.gc(); Thread.sleep(1000L); System.out.println("weakReference.isEnqueued():" + weakReference.isEnqueued()); System.out.println(reference); System.out.println(weakReference.get()); System.out.println("weakReference.isEnqueued():" + weakReference.isEnqueued()); List<String> list = new ArrayList<>(); }
@Override public void recycle() { for (Iterator<Integer> pids = workersMap.keySet().iterator(); pids.hasNext();) { WeakReference<IWorker> weakRef = workersMap.get(pids.next()); IWorker ref = weakRef.get(); if (ref == null) { if (!weakRef.isEnqueued()) { weakRef.clear(); weakRef.enqueue(); } workersMap.remove(weakRef); } } }
@Override public void sendKillSignal(int pid) { if (workersMap.size() > 0) { WeakReference<IWorker> weakRef = workersMap.get(pid); if (weakRef != null) { IWorker ref = weakRef.get(); if (ref != null) ref.done(); if (!weakRef.isEnqueued()) { weakRef.clear(); weakRef.enqueue(); } } } }
@Override public void killAll() { for (WeakReference<IWorker> weakRef : workersMap.values()) { IWorker ref = weakRef.get(); if (ref != null) ref.done(); if (!weakRef.isEnqueued()) { weakRef.clear(); weakRef.enqueue(); } } recycle(); }
/** * This test case may throw fail unexpectedly as it relies on the * garbage collector to run when calling {@code System.gc()}. This * is not guaranteed by the JVM. * * @throws InterruptedException thrown the the waiting period for the garbage * collector is interrupted. */ @Test public void issue192ShouldUnregisterFromTheJVMToNotCauseMemoryLeak() throws InterruptedException { // Get weak reference for checking whether the object was actually freed later: final ReferenceQueue<AbstractTripleSort> refQueue = new ReferenceQueue<AbstractTripleSort>(); final WeakReference<AbstractTripleSort> weakRef = new WeakReference<AbstractTripleSort>(tripleSort, refQueue); tripleSort.closeStream(); tripleSort = null; System.gc(); // Wait a tiny bit since GC Thread is not immediately done in Java 8 Thread.sleep(10); assertTrue(weakRef.isEnqueued()); }