RFR: 8187450: JNI local refs exceeds capacity warning in NetworkInterface::getAll [v3]
Jonathan Dowland
jdowland at openjdk.java.net
Mon Mar 15 16:59:24 UTC 2021
> This is an adaptation of a patch originally written by Shafi Ahmad in
> a comment on the JBS page but never submitted or merged.
>
> With -Xcheck:jni, the method java.net.NetworkInterface.getAll very
> quickly breaches the default JNI local refs threshold (32). Exactly when
> this happens depends upon the number of network interfaces (in state "UP")
> visible to Java. On Linux, with current Trunk, 2 network interfaces is
> sufficient to breach:
>
> $ ./addif.sh 0
> 1 interfaces
> $ sudo ip netns exec jbase $JAVA_HOME/bin/java -Xcheck:jni NITest
> (nothing)
> $ ./addif.sh 1
> 2 interfaces
> $ sudo ip netns exec jbase $JAVA_HOME/bin/java -Xcheck:jni NITest
> WARNING: JNI local refs: 33, exceeds capacity: 32
> at java.net.NetworkInterface.getAll(java.base/Native Method)
> at java.net.NetworkInterface.getNetworkInterfaces(java.base/NetworkInterface.java:351)
> at NITest.main(NITest.java:3)
>
> This patch improves the situation:
>
> $ ./addif.sh 3
> 4 interfaces
> $ sudo ip netns exec jbase $JAVA_HOME/bin/java -Xcheck:jni NITest
> (nothing)
> $ ./addif.sh 4
> 5 interfaces
> $ sudo ip netns exec jbase $JAVA_HOME/bin/java -Xcheck:jni NITest
> WARNING: JNI local refs: 33, exceeds capacity: 32
> at java.net.NetworkInterface.getAll(java.base/Native Method)
> at java.net.NetworkInterface.getNetworkInterfaces(java.base/NetworkInterface.java:351)
> at NITest.main(NITest.java:3)
>
>
> Once the JNI local refs threshold is breached, the threshold is raised.
> With the patch, it takes 10 network interfaces to breach the new
> threshold
>
> $ ./addif.sh 9
> 10 interfaces
> $ sudo ip netns exec jbase $JAVA_HOME/bin/java -Xcheck:jni NITest
> WARNING: JNI local refs: 33, exceeds capacity: 32
> at java.net.NetworkInterface.getAll(java.base/Native Method)
> at java.net.NetworkInterface.getNetworkInterfaces(java.base/NetworkInterface.java:351)
> at NITest.main(NITest.java:3)
> WARNING: JNI local refs: 66, exceeds capacity: 65
> at java.net.NetworkInterface.getAll(java.base/Native Method)
> at java.net.NetworkInterface.getNetworkInterfaces(java.base/NetworkInterface.java:351)
> at NITest.main(NITest.java:3)
>
> Without the patch it takes 5.
>
> Helper scripts for testing on Linux. `setupnet.sh`:
>
> #!/bin/bash
> set -euo pipefail
>
> namespace=${namespace:-jbase}
> sudo ip netns add ${namespace}
>
> And `addif.sh`:
>
> #!/bin/bash
> set -euo pipefail
>
> namespace=${namespace:-jbase}
> num="$1"
>
> sudo ip link add name vethhost${num} type veth peer name veth${namespace}${num}
> sudo ip link set veth${namespace}${num} netns ${namespace}
> sudo ip addr add 192.168.2.${num}/24 dev vethhost${num}
> sudo ip netns exec ${namespace} ip addr add 192.168.2.${num}/24 dev veth${namespace}${num}
> sudo ip link set vethhost${num} up
> sudo ip netns exec ${namespace} ip link set veth${namespace}${num} up
>
> count="$(sudo ip netns exec ${namespace} ip link show |grep UP | wc -l)"
> echo "${count} interfaces"
Jonathan Dowland has updated the pull request with a new target base due to a merge or a rebase. The pull request now contains one commit:
8187450: JNI local refs exceeds capacity warning in NetworkInterface::getAll
-------------
Changes: https://git.openjdk.java.net/jdk/pull/2963/files
Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=2963&range=02
Stats: 21 lines in 3 files changed: 19 ins; 0 del; 2 mod
Patch: https://git.openjdk.java.net/jdk/pull/2963.diff
Fetch: git fetch https://git.openjdk.java.net/jdk pull/2963/head:pull/2963
PR: https://git.openjdk.java.net/jdk/pull/2963
More information about the net-dev
mailing list