Skip to content

Commit

Permalink
fixing leak when lots of threads are being started and stopped
Browse files Browse the repository at this point in the history
  • Loading branch information
gorrus committed Nov 24, 2022
1 parent 815f11d commit ca1b639
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 1 deletion.
25 changes: 24 additions & 1 deletion src/main/java/com/jetbrains/jdi/VMState.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@

package com.jetbrains.jdi;

import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.util.*;
import java.util.concurrent.CompletableFuture;
Expand Down Expand Up @@ -197,8 +199,29 @@ synchronized void referenceTypeRemoved(ReferenceType type) {
}
}

private final ReferenceQueue<VMListener> referenceQueue = new ReferenceQueue<>();

private boolean hasUnreachableListeners() {
boolean res = false;
while (referenceQueue.poll() != null) {
res = true;
}
return res;
}

synchronized void addListener(VMListener listener) {
listeners.add(new WeakReference<>(listener));
// remove unreachable
if (hasUnreachableListeners()) {
Iterator<WeakReference<VMListener>> iter = listeners.iterator();
while (iter.hasNext()) {
VMListener l = iter.next().get();
if (l == null) {
iter.remove();
}
}
}

listeners.add(new WeakReference<>(listener, referenceQueue));
}

synchronized boolean hasListener(VMListener listener) {
Expand Down
7 changes: 7 additions & 0 deletions src/main/java/com/jetbrains/jdi/VirtualMachineImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -1377,10 +1377,17 @@ private void processQueue() {
//if ((traceFlags & TRACE_OBJREFS) != 0) {
// printTrace("Checking for softly reachable objects");
//}
boolean found = false;
while ((ref = referenceQueue.poll()) != null) {
SoftObjectReference softRef = (SoftObjectReference)ref;
removeObjectMirror(softRef);
batchForDispose(softRef);
found = true;
}

if (found) {
// we can do that right here as now it is async
processBatchedDisposes();
}
}

Expand Down

0 comments on commit ca1b639

Please sign in to comment.