Protecting references from GC in JDI tests
Roger Riggs
Roger.Riggs at oracle.com
Tue Aug 18 13:25:52 UTC 2020
Hi,
You may also find useful java.lang.ref.Reference.reachabilityFence(obj [1] .
It is designed to prevent the compiler from optimizing away a reference.
It keeps the object referenced up to that point.
[1]
https://download.java.net/java/GA/jdk14/docs/api/java.base/java/lang/ref/Reference.html#reachabilityFence(java.lang.Object)
Regards, Roger
On 8/17/20 3:21 PM, Daniel D. Daugherty wrote:
> Aditya,
>
> I think you've found the right alias...
>
> A similar observation was made here:
>
> http://mail.openjdk.java.net/pipermail/serviceability-dev/2020-March/030635.html
>
>
> It looks like that conversation didn't go beyond Egor's original message
> and Chris P's reply.
>
> My recommendation would be to only use
> ObjectReference.DisableCollection()
> when you have observed a specific failure for a specific object in a
> test.
> I would not apply that function generally. However, Chris P. or another
> member of the Serviceability team may have other guidance...
>
> Dan
>
>
> On 8/17/20 3:07 PM, Aditya Mandaleeka wrote:
>> Hi serviceability-dev,
>>
>> I hope this is the right list for this topic, but feel free to
>> redirect if not...
>>
>> It appears that there are jtreg tests that exercise JDI functionality
>> without protecting target
>> objects from being GC'd. An example of this is
>> com/sun/jdi/VarargsTest.java, where references are
>> acquired (with mirrorOf) and then used as args in invokeMethod. I
>> haven't looked into all the
>> other JDI tests to see if there are others with the same issue.
>>
>> This issue was exposed in our test runs with Shenandoah GC in
>> aggressive heuristics mode (which does
>> back to back GCs), but of course it can also be reproduced by
>> inducing a GC in the target VM
>> explicitly before the invoke.
>>
>> While this is unlikely to occur in practice when not using a special
>> GC mode, it seems to me that
>> the tests should not be relying on the fact that a GC _probably_
>> won't occur, and instead explicitly
>> disable collection on the objects that are going to be used. After
>> all, it is specified in the docs
>> that ObjectReference values returned by JDI may be collected at any
>> time the target VM is running
>> unless disableCollection() is called on them [0], so the test code is
>> implicitly relying on lifetime
>> guarantees that are not provided.
>>
>> I think the test(s) could be improved by calling disableCollection on
>> any references in the target
>> VM prior to using them. There is of course a chance that an object
>> could be GC'd before the
>> disableCollection call, but I inspected the code for this case and it
>> appears the JDWP error code
>> gets converted into an ObjectCollectedException surfaced to user code
>> which we could handle in
>> the test (and perhaps retry the operation a few times before giving
>> up). Is my understanding
>> correct here?
>>
>> What are your thoughts on this? Is there interest in these tests
>> being fixed in this way?
>>
>> Thanks,
>> Aditya
>>
>> [0]:
>> https://docs.oracle.com/en/java/javase/11/docs/api/jdk.jdi/com/sun/jdi/ObjectReference.html#disableCollection()
>>
>
More information about the serviceability-dev
mailing list