在Mac OS上研究这个JDK错误时,我遇到了我不理解的系统调用跟踪输出:
Tomcat startup fails due to 'java.net.SocketException Invalid argument' on Mac OS X
简而言之:在Mac上,JDK使用select()而不是poll()。因此,如果分配了超过1024个文件描述符,我们推断NET_Timeout中的select()调用失败,导致SocketException带有“无效参数”消息。然而,当我跟踪系统调用时,我没有看到select()系统调用的证据,或者任何失败并设置了EINVAL的调用,所以我认为这是一个潜在的原因。
我也没有看到我创建的简化测试用例的调用,现在我理解了问题:
import java.io.*;
import java.net.*;
public class SelectTest {
public static void main(String[] args) throws Exception {
for(int i = 0; i < 1024; i++) {
new FileInputStream("/dev/null");
}
ServerSocket socket = new ServerSocket(8080);
socket.accept();
}
}在带有JDK 1.7u5和更高版本的Mac OS上导致此异常:
Exception in thread "main" java.net.SocketException: Invalid argument
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398)
at java.net.ServerSocket.implAccept(ServerSocket.java:522)
at java.net.ServerSocket.accept(ServerSocket.java:490)
at SelectTest.main(SelectTest.java:12)当我使用sudo dtruss -a java SelectTest运行测试时,为什么看不到任何select() (或任何其他失败的)调用的证据
PID/THRD RELATIVE ELAPSD CPU SYSCALL(args) = return
45563/0x63a513: 85544 6 4 bind(0x412, 0x10DFC7738, 0x1C) = 0 0
45563/0x63a513: 85605 6 3 listen(0x412, 0x32, 0x32) = 0 0
45563/0x63a513: 85619 2 0 lseek(0x4, 0x37377AD, 0x0) = 57898925 0
45563/0x63a513: 85622 4 2 read(0x4, "PK\003\004\n\0", 0x1E) = 30 0
45563/0x63a513: 85622 1 0 lseek(0x4, 0x37377E0, 0x0) = 57898976 0
45563/0x63a513: 85627 5 4 read(0x4, "\312\376\272\276\0", 0x3447) = 13383 0
45563/0x63a513: 86150 37 33 write(0x2, "Exception in thread \"main\" ble\001\0", 0x1B) = 27 0发布于 2013-05-22 22:48:58
我希望ServerSocket.accept能跟你看到的一模一样。
与Java对应的Berkeley套接字调用是listen()和accept()
不幸的是,我无法在linux上重现这个异常。如果我在new ServerSocket(8080)之前使用所有的fd,我会得到:
Exception in thread "main" java.lang.UnsatisfiedLinkError: /usr/lib/jvm/java-7-oracle/jre/lib/amd64/libnet.so: /usr/lib/jvm/java-7-oracle/jre/lib/amd64/libnet.so: cannot open shared object file: Too many open files
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary1(ClassLoader.java:1939)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1864)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1846)
at java.lang.Runtime.loadLibrary0(Runtime.java:845)
at java.lang.System.loadLibrary(System.java:1084)
at sun.security.action.LoadLibraryAction.run(LoadLibraryAction.java:67)
at sun.security.action.LoadLibraryAction.run(LoadLibraryAction.java:47)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.AbstractPlainSocketImpl.<clinit>(AbstractPlainSocketImpl.java:80)
at java.net.ServerSocket.setImpl(ServerSocket.java:289)
at java.net.ServerSocket.<init>(ServerSocket.java:230)
at java.net.ServerSocket.<init>(ServerSocket.java:128)
at SelectTest.main(SelectTest.java:15)https://stackoverflow.com/questions/16442173
复制相似问题