8

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 スクリプトを実行するため、問題が発生する可能性が高いそれによって引き起こされます。

4

5 に答える 5

4

物理メモリまたはスワップが不足しているようです。影響を受けるシステムで、メモリとスワップを確認してください。

あなたのアプリケーションはたまたま外部コマンドを実行していますか - fork/exec が貢献している可能性があります。その場合は、メモリのオーバーコミットを許可することを検討してください。

http://bryanmarty.com/blog/2012/01/14/forking-jvm/

于 2013-09-25T10:27:35.740 に答える
0
  • Javaヒープスペースチェックを拡張できます。
  • 開発中のプロジェクトが別の Java バージョンで作成されている場合、その問題が発生する可能性があります。
于 2013-09-25T09:20:25.667 に答える
0

それが役立つかどうかはわかりませんが、確認してください

Apache Tomcat ポートを 8080 から 80 に変更しようとするとメモリ エラーが発生する

于 2013-09-24T13:50:39.327 に答える