avoid leaking jni frames
authorEgor.Ushakov <egor.ushakov@jetbrains.com>
Fri, 31 Jul 2015 17:50:47 +0000 (20:50 +0300)
committerEgor.Ushakov <egor.ushakov@jetbrains.com>
Fri, 31 Jul 2015 17:52:07 +0000 (20:52 +0300)
java/debugger/impl/src/com/intellij/debugger/jdi/ThreadReferenceProxyImpl.java

index dfa1b49f310be146ee5fc90326fdf081243d9ff6..7b8b1d1f9df08e7c93ab4a61b780863d36cf890f 100644 (file)
@@ -38,7 +38,7 @@ public final class ThreadReferenceProxyImpl extends ObjectReferenceProxyImpl imp
   private String myName;
   private int                       myFrameCount = -1;
   // stack frames, 0 - bottom
-  private final List<StackFrameProxyImpl> myFramesFromBottom = new ArrayList<StackFrameProxyImpl>();
+  private final LinkedList<StackFrameProxyImpl> myFramesFromBottom = new LinkedList<StackFrameProxyImpl>();
   //cache build on the base of myFramesFromBottom 0 - top, initially nothing is cached
   private List<StackFrameProxyImpl> myFrames = null;
 
@@ -236,11 +236,11 @@ public final class ThreadReferenceProxyImpl extends ObjectReferenceProxyImpl imp
   }
 
   private void checkFrames(@NotNull final ThreadReference threadRef) throws EvaluateException {
-    if (myFramesFromBottom.size() < frameCount()) {
-      int count = frameCount();
+    int frameCount = frameCount();
+    if (myFramesFromBottom.size() < frameCount) {
       List<StackFrame> frames;
       try {
-        frames = threadRef.frames(0, count - myFramesFromBottom.size());
+        frames = threadRef.frames(0, frameCount - myFramesFromBottom.size());
       }
       catch (IncompatibleThreadStateException e) {
         throw EvaluateExceptionUtil.createEvaluateException(e);
@@ -250,11 +250,16 @@ public final class ThreadReferenceProxyImpl extends ObjectReferenceProxyImpl imp
       }
 
       int index = myFramesFromBottom.size() + 1;
-      for (ListIterator<StackFrame> iterator = frames.listIterator(count - myFramesFromBottom.size()); iterator.hasPrevious();) {
+      for (ListIterator<StackFrame> iterator = frames.listIterator(frameCount - myFramesFromBottom.size()); iterator.hasPrevious();) {
         myFramesFromBottom.add(new StackFrameProxyImpl(this, iterator.previous(), index));
         index++;
       }
     }
+    else { // avoid leaking frames
+      while (myFramesFromBottom.size() > frameCount) {
+        myFramesFromBottom.removeLast();
+      }
+    }
   }
 
   @Override