我有一個Java應用程序部署在運行在Ubuntu 10.04上的Tomcat 7上。還有的是開放的服務器套接字期間的問題,我不能到目前爲止重現:java.net.SocketException:無法分配內存(不是Mac)
java.net.SocketException: Cannot allocate memory
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.AbstractPlainSocketImpl.bind(Unknown Source)
at java.net.ServerSocket.bind(Unknown Source)
at org.subethamail.smtp.server.SMTPServer.createServerSocket(SMTPServer.java:338)
at org.subethamail.smtp.server.SMTPServer.start(SMTPServer.java:291)
所有我已經能夠找出的是,這種情況在Mac OS的一些具體的版本,這是不相關的我,也在OpenJDK上,這也是不相關的(我正在使用Oracle JRE 1.7.0_17)。另一個可能的原因是虛擬化環境,但在我的情況下,這發生在硬件盒上。
所以,問題是,有沒有人遇到同樣的問題,可能有什麼解決方案。
更新 還有一件事:tomcat幾乎消耗了所有的堆,大約700mb,它是由我的代碼中的內存泄漏引起的。 但據我所知,異常告訴系統級別的套接字緩衝區,所以它似乎沒有與java堆相關。然而,這是我迄今爲止唯一的解釋,我認爲這是非常虛幻的。
更新2 最終我們已經能夠重現該問題幾次,所以這不是內存泄漏。當我第一次面對這個問題時,我正在考慮將authbind作爲問題的一個可能的來源,但不幸的是我沒有太注意它。當我遇到另一個受此問題影響的硬件盒時,我嘗試綁定未授權的端口併成功,而嘗試綁定已授權的端口則導致異常。所以,最終我用iptables取代了authbind。
基本上,忌諱塔希爾的回答點authbind,但丹尼·托馬斯的回答提供有關分叉和「無法分配內存」之間的連接非常interresting信息, 其實我們還可以使用進程生成器運行的bash腳本,所以有很大的機會問題可能是由它引起的。
它是一個32位或64位JDK? – fge
這是一個32位jre(不是jdk,我的錯) –
你有沒有試過64位JRE或JDK代替N – fge