RFR: 8193222: EnsureLocalCapacity() should maintain capacity requests through multiple calls
David Holmes
david.holmes at oracle.com
Mon Dec 11 22:18:44 UTC 2017
Ping! Very simple, and trying to get in before cutoff.
Thanks,
David
On 10/12/2017 3:39 PM, David Holmes wrote:
> bug: https://bugs.openjdk.java.net/browse/JDK-8193222
> webrev: http://cr.openjdk.java.net/~dholmes/8193222/webrev/
>
> In product mode, for hotspot, EnsureLocalCapacity is a no-op as there is
> no artificial limit applied for local refs.
>
> With -Xcheck:jni the checked mode was augmented to watch for "excessive"
> use of local refs and to produce a warning if that happened e.g.:
>
> WARNING: JNI local refs: 41, exceeds capacity: 40
>
> That was added under JDK-8043224.
>
> The problem is that the code always modifies the planned capacity (that
> expected before warnings should be used) without regard for the fact the
> existing capacity may be higher than that requested. As a result if you
> have a call chain like:
>
> void foo() { // C code
> env->EnsureLocalCapacity(60); // needs lots of local refs
> ...
> JNU_GetPlatformsString(...)
> env->EnsureLocalCapacity(5); // lower than 60!
> ...
> // create 60 local refs
> }
>
> upon return the warning will be issued because the number of local refs
> exceeds the most recent call to EnsureLocalCapacity.
>
> A simple fix is for EnsureLocalCapacity to only raise the planned
> capacity, not lower it. That fits with the notion of "ensuring" there is
> sufficient space - the function is not SetLocalcapacity. It also fits
> with the way PushLocalFrame(capacity) increases the planned capacity by
> "capacity" but PopLocalFrame does not reduce it again.
>
> New test added.
>
> Tested through JPRT.
>
> Thanks,
> David
More information about the hotspot-runtime-dev
mailing list