On Fri, 20 Nov 2020 13:23:28 GMT, Per Liden <pli...@openjdk.org> wrote:

> A number of JDI tests create objects on the debugger side with calls to 
> `newInstance()`. However, on the debugee side, these new instances will only 
> be held on to by a `JNIGlobalWeakRef`, which means they could be collected at 
> any time, even before `newInstace()` returns. A number of JDI tests don't 
> take this into account, and can hence get spurious `ObjectCollectedException` 
> thrown at them, which results in test failures. To make these objects stick 
> around, a call to `disableCollection()` is needed (but also note that the 
> object could have been collected by the time we call `disableCollection()`).
> 
> In addition, `SDEDebuggee::executeTestMethods()` creates class loaders, which 
> shortly after dies (and potentially gets collected). This creates problems on 
> the debugger side, since code locations in this (now potentially unloaded 
> class/method) gets invalidated. We must ensure that these class loaders stay 
> alive to avoid these problems.
> 
> Normally, these problems are fairly hard to provoke, since you have to be 
> unlucky and get the timing of a GC just right. However, it's fairly easy to 
> provoke by forcing GC cycles to happen all the time (e.g. using ZGC with 
> -XX:ZCollectionInterval=0.01) and/or inserting `Thread.sleep()` calls right 
> after calls to `newInstance()`.
> 
> This patch fixes all instances of this problem that I managed to find.
> 
> Testing: All `vmTestbase/nsk/jdi/` tests now pass, even when using the above 
> described measures to try to provoke the problem.

This pull request has been closed without being integrated.

-------------

PR: https://git.openjdk.java.net/jdk/pull/1348

Reply via email to