[10] RFR for JDK-8169961: Memory leak after debugging session

Daniel D. Daugherty daniel.daugherty at oracle.com
Fri Jul 14 01:15:43 UTC 2017


On 7/13/17 10:19 AM, Shafi Ahmad wrote:
> Hi Daniel,
>
> Thank you for the review.
>
>> -----Original Message-----
>> From: Daniel D. Daugherty
>> Sent: Thursday, July 13, 2017 7:40 PM
>> To: Shafi Ahmad <shafi.s.ahmad at oracle.com>; serviceability-
>> dev at openjdk.java.net
>> Subject: Re: [10] RFR for JDK-8169961: Memory leak after debugging session
>>
>> On 7/13/17 2:45 AM, Shafi Ahmad wrote:
>>> Hi,
>>>
>>> Please review the code change for the fix of bug 'JDK-8169961: Memory
>> leak after debugging session'
>>> Summary:
>>> 1.  It seems that the thread created for
>> com.sun.tools.jdi.TargetVM.EventController is never stopped and keeps a
>> hard  reference to the VirtualMachineImpl. This leads to VirtualMachineImpl
>> leak after debug session is finished.  EventController is private class and
>> member field vm of type  VirtualMachineImpl, holding the hard reference to
>> the VirtualMachineImpl. I am not seeing the usage of filed vm so we can
>> remove it safely.
>>> 2. Added eventController.release(); before  'Target VM interface thread
>> exiting'
>>> 3. TargetVM gets an EventController  which is a daemon thread, but don't
>> see the thread having a way of stopping so added code to exit as soon as
>> TargetVM thread stops listening.
>>> jdk10 bug: https://bugs.openjdk.java.net/browse/JDK-8169961
>>> webrev link: http://cr.openjdk.java.net/~shshahma/8169961/webrev.00/
>> src/jdk.jdi/share/classes/com/sun/tools/jdi/TargetVM.java
>>       L330:         VirtualMachineImpl vm;
>>       L335:             this.vm = vm;
>>           This comment caught my eye:
>>           > I am not seeing the usage of filed vm so we can remove it safely.
>>
>>           So you're deleting the 'vm' instance variable, but:
>>
>>           L363: JDWP.VirtualMachine.HoldEvents.process(vm);
>>           L365: JDWP.VirtualMachine.ReleaseEvents.process(vm);
>>
>>           would use it if it was still there...
>>
>>           Where did the run() method find a 'vm' variable? I'm guessing
>>           the one in the TargetVM outer class:
>>
>>           L46:     private VirtualMachineImpl vm;
>>
>>           Okay so we don't have to pass (and save a copy of VirtualMachineImpl).
>>
>>           So this constructor:
>>
>>           L333:         EventController(VirtualMachineImpl vm) {
>>               No longer uses the 'vm' parameter at all and you
>>               can remove the parameter and update the caller.
> 332     private class EventController extends Thread {
> 333         int controlRequest = 0;
> 334
> 335         EventController(VirtualMachineImpl vm) {
> 336             super(vm.threadGroupForJDI(), "JDI Event Control Thread");
> 337             setDaemon(true);
> 338             setPriority((MAX_PRIORITY + NORM_PRIORITY)/2);
> 339             super.start();
> 340         }
>
> We can't remove formal parameter 'vm' as this is referenced at line# 336.

So the reference to 'vm' on L336 won't resolve to the one in
the TargetVM outer class:

L46:     private VirtualMachineImpl vm;

like L363 and L365 do...

Dan


>
>>> Testing: run jprt and I provided the FBP and  it works for them.
>> JPRT doesn't execute any JDI related tests. You need to run the NSK JDI test
>> suite and the com/sun/jdi tests in the JDK.
> I will run NSK JDI test and update this thread with the results.
>
> Regards,
> Shafi
>
>> Dan
>>
>>> Regards,
>>> Shafi



More information about the serviceability-dev mailing list