在調查在Mac OS這個JDK錯誤,我遇到了系統調用跟蹤輸出我不明白:爲什麼不向我展示這個JNI代碼中的select系統調用?
Tomcat startup fails due to 'java.net.SocketException Invalid argument' on Mac OS X
短的版本:在Mac OS中,JDK使用select()
而不是poll()
。因此,如果分配了超過1024個文件描述符,我們推斷NET_Timeout
中的select()
調用失敗,從而導致帶有「無效參數」消息的SocketException。但是,當我追蹤系統調用時,我沒有看到系統調用的任何證據,或任何失敗並設置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();
}
}
結果在這個例外在Mac OS瓦特/ JDK 1.7u5及更高版本:
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)
爲什麼我沒有看到select()
(或任何其他失敗)調用的任何證據,當我運行使用sudo dtruss -a java SelectTest
的考驗嗎?
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
在這種情況下,問題是不打CD的限制,它使用超過1024個有選擇的呼叫,這是在網絡超時處理代碼達爾文( bsd_close.c)。查看鏈接問題的細節 - 這是達爾文具體。 – 2013-05-22 23:24:38