RFR: 8187450: JNI local refs exceeds capacity warning in NetworkInterface::getAll [v2]

Jonathan Dowland jdowland at openjdk.java.net
Mon Mar 15 13:21:19 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 refreshed the contents of this pull request, and previous commits have been removed. The incremental views will show differences compared to the previous content of the PR. The pull request contains one new commit since the last revision:

  8187450: JNI local refs exceeds capacity warning in NetworkInterface::getAll

-------------

Changes:
  - all: https://git.openjdk.java.net/jdk/pull/2963/files
  - new: https://git.openjdk.java.net/jdk/pull/2963/files/f2b8f3af..1dfe3aa2

Webrevs:
 - full: https://webrevs.openjdk.java.net/?repo=jdk&pr=2963&range=01
 - incr: https://webrevs.openjdk.java.net/?repo=jdk&pr=2963&range=00-01

  Stats: 2 lines in 1 file changed: 0 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