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