JDK-8258836 : JNI local refs exceed capacity getDiagnosticCommandInfo
  • Type: Bug
  • Component: core-svc
  • Sub-Component: java.lang.management
  • Affected Version: 11,17
  • Priority: P4
  • Status: Resolved
  • Resolution: Fixed
  • OS: linux
  • CPU: generic
  • Submitted: 2020-12-22
  • Updated: 2025-01-16
  • Resolved: 2021-01-25
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 11 JDK 17
11.0.11Fixed 17 b07Fixed
Related Reports
Relates :  
Description
$ cat MbeanServerTest.java 
public class MbeanServerTest {
	public static void main(String[] args) {
		System.out.println(java.lang.management.ManagementFactory.getPlatformMBeanServer());
	}
}
$ ./build/linux-x86_64-server-release/images/jdk/bin/javac  MbeanServerTest.java
$ ./build/linux-x86_64-server-release/images/jdk/bin/java -Xcheck:jni MbeanServerTest 
WARNING: JNI local refs: 33, exceeds capacity: 32
	at com.sun.management.internal.DiagnosticCommandImpl.getDiagnosticCommandInfo(jdk.management@17-internal/Native Method)
	at com.sun.management.internal.DiagnosticCommandImpl.getMBeanInfo(jdk.management@17-internal/DiagnosticCommandImpl.java:196)
	at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getNewMBeanClassName(java.management@17-internal/DefaultMBeanServerInterceptor.java:329)
	at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(java.management@17-internal/DefaultMBeanServerInterceptor.java:315)
	at com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(java.management@17-internal/JmxMBeanServer.java:522)
	at java.lang.management.ManagementFactory.lambda$addMXBean$7(java.management@17-internal/ManagementFactory.java:902)
	at java.lang.management.ManagementFactory$$Lambda$22/0x0000000801057180.run(java.management@17-internal/Unknown Source)
	at java.security.AccessController.executePrivileged(java.base@17-internal/AccessController.java:784)
	at java.security.AccessController.doPrivileged(java.base@17-internal/AccessController.java:554)
	at java.lang.management.ManagementFactory.addMXBean(java.management@17-internal/ManagementFactory.java:892)
	at java.lang.management.ManagementFactory.lambda$getPlatformMBeanServer$1(java.management@17-internal/ManagementFactory.java:488)
	at java.lang.management.ManagementFactory$$Lambda$21/0x00000008010569f8.accept(java.management@17-internal/Unknown Source)
	at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(java.base@17-internal/ForEachOps.java:183)
	at java.util.Collections$2.tryAdvance(java.base@17-internal/Collections.java:4820)
	at java.util.Collections$2.forEachRemaining(java.base@17-internal/Collections.java:4828)
	at java.util.stream.ReferencePipeline$Head.forEach(java.base@17-internal/ReferencePipeline.java:762)
	at java.util.stream.ReferencePipeline$7$1.accept(java.base@17-internal/ReferencePipeline.java:276)
	at java.util.stream.ReferencePipeline$2$1.accept(java.base@17-internal/ReferencePipeline.java:179)
	at java.util.HashMap$ValueSpliterator.forEachRemaining(java.base@17-internal/HashMap.java:1766)
	at java.util.stream.AbstractPipeline.copyInto(java.base@17-internal/AbstractPipeline.java:484)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(java.base@17-internal/AbstractPipeline.java:474)
	at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(java.base@17-internal/ForEachOps.java:150)
	at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(java.base@17-internal/ForEachOps.java:173)
	at java.util.stream.AbstractPipeline.evaluate(java.base@17-internal/AbstractPipeline.java:234)
	at java.util.stream.ReferencePipeline.forEach(java.base@17-internal/ReferencePipeline.java:596)
	at java.lang.management.ManagementFactory.getPlatformMBeanServer(java.management@17-internal/ManagementFactory.java:488)
	- locked <0x000000062f019688> (a java.lang.Class for java.lang.management.ManagementFactory)
	at MbeanServerTest.main(MbeanServerTest.java:3)


Looks like getDiagnosticCommandArgumentInfoArray() in src/jdk.management/share/native/libmanagement_ext/DiagnosticCommandImpl.c is leaking references.
Comments
Fix Request (OpenJDK 11u): Please approve backporting this to JDK 11u as the fix reduces some noise generated when using -Xcheck:jni. JDK head patch applies cleanly. Tested with tier1 and added regression test. Risk should be low as it fixes JNI warnings by releasing local refs. I plan to push this together with the follow-up test fix JDK-8260378.
01-02-2021

Changeset: af155fc0 Author: Severin Gehwolf <sgehwolf@openjdk.org> Date: 2021-01-25 08:57:56 +0000 URL: https://git.openjdk.java.net/jdk/commit/af155fc0
25-01-2021