JDK-6497734 : (dc) assert "JNI handle should not be null" under Java_sun_nio_ch_FileDispatcher_preClose0()
  • Type: Bug
  • Component: core-libs
  • Sub-Component: java.nio
  • Affected Version: 5.0u9,5.0u10,6u3,7
  • Priority: P3
  • Status: Closed
  • Resolution: Fixed
  • OS:
    generic,linux,linux_2.6,linux_redhat_4.0 generic,linux,linux_2.6,linux_redhat_4.0
  • CPU: generic,x86
  • Submitted: 2006-11-27
  • Updated: 2012-11-02
  • Resolved: 2011-05-18
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.
Other Other JDK 6 JDK 7
5.0u17-revFixed 5.0u19Fixed 6u14Fixed 7 b06Fixed
Related Reports
Duplicate :  
Duplicate :  
Description
This test case runs out of file handles and crashes the VM while
running in finalization:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.channels.DatagramChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;

public class FdBugTest {
        
    private static final String HOST = "localhost";
    private static final int PORT = 2525;
        
    static final DatagramChannel openChannel() throws IOException {
        DatagramChannel ret = DatagramChannel.open();
        ret.configureBlocking(false);
        ret.connect(new InetSocketAddress(HOST, PORT));
        return ret;
    }
        
    static final void send(DatagramChannel ch, ByteBuffer buf)
        throws IOException {
        buf.put(new byte[1024]);
        ch.write(buf);
    }
        
    static final void recv(DatagramChannel ch, ByteBuffer buf)
        throws IOException {
        Selector s = Selector.open();
        SelectionKey key = ch.register(s, SelectionKey.OP_READ);
        s.select(5000);
        if (s.selectedKeys().contains(key)) {
            buf.clear();
            ch.receive(buf);
        } else {
            System.err.println("Timeout in receive");
            return;
        }
        buf.flip();
    }
        
    public static void main(String[] args) {
        for (int i = 0; i < 1000; ++i) {
            try {
                ByteBuffer buf = ByteBuffer.allocate(65536);
                buf.order(ByteOrder.BIG_ENDIAN);
                DatagramChannel ch = openChannel();
                send(ch, buf);
                buf.clear();
                recv(ch, buf);
            } catch (IOException ex) {
                System.err.println("err: " + ex);
            }
        }
    }
}


Running with a fastdebug build on Solaris/SPARC prints the following error output.
(Note: since there are no file handles left, the fatal exit handler cannot write
out the hs_err_pid<nnn> file, so it prints to stderr instead):

% java FdBugTest |& tee fastdebug_stderr.out

Timeout in receive
Timeout in receive
Timeout in receive
Timeout in receive
Timeout in receive
Timeout in receive
Timeout in receive
Timeout in receive
Timeout in receive
Timeout in receive
Timeout in receive
Timeout in receive
Timeout in receive
Timeout in receive
Timeout in receive
Timeout in receive
Timeout in receive
Timeout in receive
Timeout in receive
Timeout in receive
Timeout in receive
Timeout in receive
err: java.io.IOException: Too many open files
err: java.net.SocketException: Too many open files
err: java.net.SocketException: Too many open files
err: java.net.SocketException: Too many open files
err: java.net.SocketException: Too many open files
err: java.net.SocketException: Too many open files
err: java.net.SocketException: Too many open files
err: java.net.SocketException: Too many open files
err: java.net.SocketException: Too many open files
err: java.net.SocketException: Too many open files
err: java.net.SocketException: Too many open files
err: java.net.SocketException: Too many open files
err: java.net.SocketException: Too many open files
err: java.net.SocketException: Too many open files
err: java.net.SocketException: Too many open files
err: java.net.SocketException: Too many open files
err: java.net.SocketException: Too many open files
# To suppress the following error report, specify this argument
# after -XX: or in .hotspotrc:  SuppressErrorAt=/jniHandles.hpp:169
err: java.net.SocketException: Too many open files
#
# An unexpected error has been detected by Java Runtime Environment:
#
#  Internal Error (/BUILD_AREA/jdk7.0/hotspot/src/share/vm/runtime/jniHandles.hpp, 169 [ Patched ]), pid=29656, tid=9
#
# Java VM: Java HotSpot(TM) Server VM (1.7.0-ea-fastdebug-b03-debug mixed mode)
#
# Error: assert(handle != 0,"JNI handle should not be null")
# Can not save log file, dump to screen..
#
# An unexpected error has been detected by Java Runtime Environment:
#
#  Internal Error (/BUILD_AREA/jdk7.0/hotspot/src/share/vm/runtime/jniHandles.hpp, 169 [ Patched ]), pid=29656, tid=9
#
# Java VM: Java HotSpot(TM) Server VM (1.7.0-ea-fastdebug-b03-debug mixed mode)
#
# Error: assert(handle != 0,"JNI handle should not be null")
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
#

---------------  T H R E A D  ---------------

Current thread (0x00191000):  JavaThread "Finalizer" daemon [_thread_in_vm, id=9]

Stack: [0xd5f80000,0xd6000000),  sp=0xd5ffe970,  free space=506k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V  [libjvm.so+0x102f6e8]err: java.net.SocketException: Too many open files
V  [libjvm.so+0x436128]
V  [libjvm.so+0x6b95dc]

C  [libnio.so+0x3d74]
C  [libnio.so+0x3590]  Java_sun_nio_ch_FileDispatcher_preClose0+0x2c
j  sun.nio.ch.FileDispatcher.preClose0(Ljava/io/FileDescriptor;)V+1
j  sun.nio.ch.FileDispatcher.preClose0(Ljava/io/FileDescriptor;)V+0
j  sun.nio.ch.DatagramDispatcher.preClose(Ljava/io/FileDescriptor;)V+1
j  sun.nio.ch.DatagramChannelImpl.implCloseSelectableChannel()V+14
j  java.nio.channels.spi.AbstractSelectableChannel.implCloseChannel()V+1
j  java.nio.channels.spi.AbstractInterruptibleChannel.close()V+23
j  sun.nio.ch.DatagramChannelImpl.finalize()V+1
v  ~StubRoutines::call_stub
V  [libjvm.so+0x610e9c]
V  [libjvm.so+0x659520]
V  [libjvm.so+0x67a82c]
C  [libjava.so+0xc804]  Java_java_lang_ref_Finalizer_invokeFinalizeMethod+0x7c
j  java.lang.ref.Finalizer.invokeFinalizeMethod(Ljava/lang/Object;)V+0
j  java.lang.ref.Finalizer.invokeFinalizeMethod(Ljava/lang/Object;)V+0
j  java.lang.ref.Finalizer.runFinalizer()V+45
j  java.lang.ref.Finalizer.access$100(Ljava/lang/ref/Finalizer;)V+1
j  java.lang.ref.Finalizer$FinalizerThread.run()V+11
v  ~StubRoutines::call_stub
V  [libjvm.so+0x610e9c]
V  [libjvm.so+0x60f014]
V  [libjvm.so+0x60f1c8]
Verr: java.net.SocketException: Too many open files  [libjvm.so+0x7f0764]
V  [libjvm.so+0xee91c0]
V  [libjvm.so+0xcb1fa4]


Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  sun.nio.ch.FileDispatcher.preClose0(Ljava/io/FileDescriptor;)V+0
j  sun.nio.ch.DatagramDispatcher.preClose(Ljava/io/FileDescriptor;)V+1
j  sun.nio.ch.DatagramChannelImpl.implCloseSelectableChannel()V+14
j  java.nio.channels.spi.AbstractSelectableChannel.implCloseChannel()V+1
j  java.nio.channels.spi.AbstractInterruptibleChannel.close()V+23
j  sun.nio.ch.DatagramChannelImpl.finalize()V+1
v  ~StubRoutines::call_stub
j  java.lang.ref.Finalizer.invokeFinalizeMethod(Ljava/lang/Object;)V+0
j  java.lang.ref.Finalizer.runFinalizer()V+45
j  java.lang.ref.Finalizer.access$100(Ljava/lang/ref/Finalizer;)V+1
j  java.lang.ref.Finalizer$FinalizerThread.run()V+11
v  ~StubRoutines::call_stub

---------------  P R O C E S S  ---------------

Java Threads: ( => current thread )
  0x001b1000 JavaThread "Low Memory Detector" daemon [_thread_blocked, id=13]
  0x001ae800 JavaThread "CompilerThread1" daemon [_thread_blocked, id=12]
  0x001ad000 JavaThread "CompilerThread0" daemon [_thread_blocked, id=11]
  0x001ab800 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=10]
=>0x00191000 JavaThread "Finalizer" daemon [_thread_in_vm, id=9]
  0x0018cc00 JavaThread "Reference Handler" daemon [_thread_blocked, id=8]
  0x00046c00 JavaThread "main" [_thread_in_vm, id=2]

Other Threads:
  0x00188c00 VMThread [id=7]
  0x001b3400 WatcherThread [id=14]

VM state:not at safepoint (normal execution)

err: java.net.SocketException: Too many open files
VM Mutex/Monitor currently owned by a thread: None

Heap
 PSYoungGen      total 10752K, used 873Kerr: java.net.SocketException: Too many open files
 [0xf0000000, 0xf0c00000, 0xfac00000)
  edenerr: java.net.SocketException: Too many open files
 space 9216K, 6% used [0xf0000000,0xf00bd5a0,0xf0900000)
err: java.net.SocketException: Too many open files  from space 1536K, 20% used [0xf0a80000,0xf0ad0040,0xf0c00000)
  to   space 1536K, 0% used [0xf0900000,0xf0900000,0xf0a80000)

err: java.net.SocketException: Too many open files
err: java.net.SocketException: Too many open files PSOldGen        total 24576K, used 0K
 [0xda800000, 0xdc000000, 0xf0000000)
  object space 24576K, 0% used [0xda800000,0xda800000,0xdc000000)
err: java.net.SocketException: Too many open files
 PSPermGen       total 16384K, used 2239K [0xd6800000, 0xd7800000, 0xda800000)
  object space 16384K, 13% used [0xd6800000,0xd6a2fe68,0xd7800000)

Dynamic libraries:
0x00010000 	/net/mizu.sfbay/n/dolphin/jdk7/binaries/solaris-sparc/b03-2006-11-27/jdk1.7.0/fastdebug/bin/java
0xff3f8000 	/lib/libthread.so.1
0xff370000 	/net/mizu.sfbay/n/dolphin/jdk7/binaries/solaris-sparc/b03-2006-11-27/jdk1.7.0/fastdebug/bin/../jre/lib/sparc/jli/libjli.so
0xff3a0000 	/lib/libdl.so.1
0xff200000 	/lib/libc.so.1
0xff358000 	/platform/SUNW,Ultra-80/lib/libc_psr.so.1
0xfd400000 	/net/mizu.sfbay/n/dolphin/jdk7/binaries/solaris-sparc/b03-2006-11-27/jdk1.7.0/fastdebug/jre/lib/sparc/server/libjvm.so
0xff320000 	/lib/libsocket.so.1
0xff350000 	/usr/lib/libsched.so.1
0xff1d0000 	/lib/libm.so.1
0xff1a0000 	/usr/lib/libCrun.so.1
0xff1f0000 	/lib/libdoor.so.1
0xff080000 	/lib/libnsl.so.1
0xfd300000 	/lib/libm.so.2
0xff160000 	/lib/libscf.so.1
0xff060000 	/lib/libuutil.so.1
0xfd3d0000 	/lib/libmd.so.1
0xfd2e0000 	/platform/SUNW,Ultra-80/lib/libmd_psr.so.1
0xfd2c0000 	/lib/libmp.so.2
0xfd210000 	/net/mizu.sfbay/n/dolphin/jdk7/binaries/solaris-sparc/b03-2006-11-27/jdk1.7.0/fastdebug/jre/lib/sparc/native_threads/libhpi.so
0xfd140000 	/net/mizu.sfbay/n/dolphin/jdk7/binaries/solaris-sparc/b03-2006-11-27/jdk1.7.0/fastdebug/jre/lib/sparc/libverify.so
0xfd0f0000 	/net/mizu.sfbay/n/dolphin/jdk7/binaries/solaris-sparc/b03-2006-11-27/jdk1.7.0/fastdebug/jre/lib/sparc/libjava.so
0xfd0c0000 	/net/mizu.sfbay/n/dolphin/jdk7/binaries/solaris-sparc/b03-2006-11-27/jdk1.7.0/fastdebug/jre/lib/sparc/libzip.so
0xfd070000 	/net/mizu.sfbay/n/dolphin/jdk7/binaries/solaris-sparc/b03-2006-11-27/jdk1.7.0/fastdebug/jre/lib/sparc/libnet.so
0xfd050000 	/net/mizu.sfbay/n/dolphin/jdk7/binaries/solaris-sparc/b03-2006-11-27/jdk1.7.0/fastdebug/jre/lib/sparc/libnio.so
0xff190000 	/lib/librt.so.1

VM Arguments:
java_command: FdBugTest
Launcher Type: SUN_STANDARD

Environment Variables:
JAVA_HOME=/java/re/jdk/7/nightly/binaries/solaris-sparc/latest/fastdebug
PATH=/home/tbell/bin/sparc/5.11:/home/tbell/bin/sparc:/home/tbell/bin:/java/re/jdk/7/nightly/binaries/solaris-sparc/latest/fastdebug/bin:/java/re/jdk/7/nightly/binaries/solaris-sparc/latest/fastdebug/bin/sparcv9:/usr/dt/bin:/usr/openwin/bin:/usr/bin:/usr/sbin:/java/devtools/sparc/teamware/7.7/bin:/java/devtools/sparc/SUNWspro/SS11/bin:/java/devtools/sparc/bin:/java/devtools/sparc/gnucc/bin:/usr/ccs/bin:/sbin:.:/usr/sfw/bin:/opt/sfw/bin:/usr/local/bin:/usr/ucb
LD_LIBRARY_PATH=/net/mizu.sfbay/n/dolphin/jdk7/binaries/solaris-sparc/b03-2006-11-27/jdk1.7.0/fastdebug/jre/lib/sparc/server:/net/mizu.sfbay/n/dolphin/jdk7/binaries/solaris-sparc/b03-2006-11-27/jdk1.7.0/fastdebug/jre/lib/sparc:/net/mizu.sfbay/n/dolphin/jdk7/binaries/solaris-sparc/b03-2006-11-27/jdk1.7.0/fastdebug/jre/../lib/sparc:/usr/lib/sam/lib:/usr/lib/dc:/usr/lib/breg:/usr/sfw/lib:
SHELL=/bin/csh
DISPLAY=:0.0
HOSTTYPE=sun4
OSTYPE=solaris
MACHTYPE=sparc

Signal Handlers:
SIGSEGV: [libjvm.so+0x10309fc], sa_mask[0]=0xffbffeff, sa_flags=0x0000000c
SIGBUS: [libjvm.so+0x10309fc], sa_mask[0]=0xffbffeff, sa_flags=0x0000000c
SIGFPE: [libjvm.so+0xcbb04c], sa_mask[0]=0xffbffeff, sa_flags=0x0000000c
SIGPIPE: [libjvm.so+0xcbb04c], sa_mask[0]=0xffbffeff, sa_flags=0x0000000c
SIGILL: [libjvm.so+0xcbb04c]err: java.net.SocketException: Too many open files, sa_mask[0]=0xffbffeff, sa_flags=0x0000000c
SIGUSR1: SIG_DFL, sa_mask[0]=0x00000000, sa_flags=0x00000000
SIGUSR2: SIG_DFL, sa_mask[0]=0x00000000, sa_flags=0x00000000
SIGHUP: 
[libjvm.so+0xcb55c0], sa_mask[0]=0xffbffeff, sa_flags=0x00000004
SIGINT: [libjvm.so+0xcb55c0], sa_mask[0]=0xffbffeff, sa_flags=0x00000004
SIGQUIT: [libjvm.so+0xcb55c0], sa_mask[0]=0xffbffeff, sa_flags=0x00000004
SIGTERM: [libjvm.so+0xcb55c0], sa_mask[0]=0xffbffeff, sa_flags=0x00000004
SIGQUIT: [libjvm.so+0xcb55c0], sa_mask[0]=0xffbffeff, sa_flags=0x00000004
SIGTERM: [libjvm.so+0xcb55c0], sa_mask[0]=0xffbffeff, sa_flags=0x00000004
SIG39: [libjvm.so+0xcbb06c], sa_mask[0]=0x00000000, sa_flags=0x00000008
SIG40: [libjvm.so+0xcbb04c], sa_mask[0]=0xffbffeff, sa_flags=0x0000000c


---------------  S Y S T E M  ---------------

OS:Solaris
uname:err: java.net.SocketException: Too many open filesSunOS 5.11 snv_49 sun4u  (T2 libthread)
rlimit: STACK 8192k, CORE infinity, NOFILE 1024, AS infinity
load average:
0.07 0.13 0.14

CPU:total 4 has_v8, has_v9, has_vis1

Memory: 8k page, physical 2097152k(55392k free)

vm_info: Java HotSpot(TM) Server VM (1.7.0-ea-fastdebug-b03) for solaris-sparc, built on Nov 27 2006 03:21:05 by "" with unknown Workshop:0x580

#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
#
Current thread is 9
Dumping core ...

Comments
EVALUATION Here's the decoded stack: Stack: [0xd5f80000,0xd6000000), sp=0xd5ffe970, free space=506k Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) V [libjvm.so+0x102f6e8]err: java.net.SocketException: Too many open files;; __1cHVMErrorOreport_and_die6M_v_+0x804 V [libjvm.so+0x436128];; __1cYreport_assertion_failure6Fpkci1_v_+0x70 V [libjvm.so+0x6b95dc];; jni_GetIntField+0x4a8 C [libnio.so+0x3d74];; fdval+0x40 C [libnio.so+0x3590] Java_sun_nio_ch_FileDispatcher_preClose0+0x2c;; Java_sun_nio_ch_FileDispatcher_preClose0+0x2c j sun.nio.ch.FileDispatcher.preClose0(Ljava/io/FileDescriptor;)V+1 j sun.nio.ch.FileDispatcher.preClose0(Ljava/io/FileDescriptor;)V+0 j sun.nio.ch.DatagramDispatcher.preClose(Ljava/io/FileDescriptor;)V+1 j sun.nio.ch.DatagramChannelImpl.implCloseSelectableChannel()V+14 and running with -Xcheck:jni reveals that the object is passed as NULL. The bug is that DatagramChannel implementation has a finalizer that doesn't check if the object has been initialized. The object isn't fully initialized because the ctor fails with "Too many open files" when creating the socket. This issue can be fixed by removing the finalizer or having it check that fd is initialized. The first option is preferable but removing it may be problematic for applications that depend on current behavior and don't explicitly close the channel.
28-11-2006