ubuntu 10.04で実行されているtomcat 7にデプロイされたJavaアプリがあります。サーバーソケットを開く際に、これまで再現できなかった問題が発生しました。
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)
私が知ることができたのは、これが私には関係のないMacOSの特定のバージョンと、関係のないOpenJDKで発生することだけです(私はOracle JRE 1.7.0_17を使用しています)。別の考えられる理由は仮想化環境ですが、私の場合、これはハードウェア ボックスで発生します。
だから、問題は、誰かが同じ問題に直面したことがあるか、そして可能な解決策は何かということです.
更新 また、Tomcat がほぼすべてのヒープ (約 700 MB) を消費しました。コードのメモリ リークが原因です。しかし、私が理解している限り、例外はシステム レベルのソケット バッファに関するものであるため、Java ヒープとは関係がないようです。しかし、これは私がこれまでに得た唯一の説明であり、私の意見では非常に幻想的です.
更新 2 最終的に、問題を数回再現することができたので、これはメモリ リークに関するものではありませんでした。初めて直面したとき、問題の原因として authbind を考えていましたが、残念ながらあまり注意を払っていませんでした。この問題の影響を受ける別のハードウェア ボックスを入手したとき、非特権ポートをバインドしようとすると成功しましたが、特権ポートをバインドしようとすると例外が発生しました。そのため、最終的には authbind を iptables に置き換えました。
基本的に、fady taher の回答は authbind を指していますが、Danny Thomas の回答は、フォークと「メモリを割り当てることができません」の間の接続に関する非常に興味深い情報を提供します。実際には、プロセスビルダーを使用して bash スクリプトを実行するため、問題が発生する可能性が高いそれによって引き起こされます。