2016-06-14 16 views
0

私は実稼働環境のwebappにメモリの問題があります。Linux Ubuntu Tomcatベストプラクティスでメモリが不足するのを避けるため

AWS EC2 t2.mediumインスタンス(2コアのCPU 64ビット+ 4GB RAM)でTomcatを実行しています。

これはjavamelodyからいくつかの情報です:

OS: OS Linux, 3.13.0-87-generic , amd64/64 (2 cores) 
Java: Java(TM) SE Runtime Environment, 1.8.0_91-b14 
JVM: Java HotSpot(TM) 64-Bit Server VM, 25.91-b14, mixed mode 

Tomcat "http-nio-8080": Busy threads = 4/200  ++++++++++++ 
Bytes received = 8.051 
Bytes sent = 206.411.053 
Request count = 3.204 
Error count = 70 
Sum of processing times (ms) = 540.398 
Max processing time (ms) = 12.319 
Memory: Non heap memory = 130 Mb (Perm Gen, Code Cache), 
Buffered memory = 0 Mb, 
Loaded classes = 12,258, 
Garbage collection time = 1,394 ms, 
Process cpu time = 108,100 ms, 
Committed virtual memory = 5,743 Mb, 
Free physical memory = 142 Mb, 
Total physical memory = 3,952 Mb, 
Free swap space = 0 Mb, 
Total swap space = 0 Mb 
Free disk space: 27.457 Mb 

そして、私のアプリケーションは、に行く:Javaランタイム環境が継続するためのメモリが不足してい

。 ネイティブメモリ割り当て(mmap)が予約済みメモリをコミットするために12288バイトをマップできませんでした。

次の設定オプションを適用しましたが、もう一度失敗したようです。

輸出JAVA_OPTS = " - Dfile.encoding = UTF-8 -Xms1024m -Xmx3072m -XX:PermSizeを= 128メートル-XX:MaxPermSizeを= 256メートル"

は私のLinux構成のために[OK]を、この設定ですか?

詳細については、私のデータベースとファイルシステムが別のt2.mediumインスタンス(Windows 2コアのCPU + 4GB RAM)で動作しています。

ありがとう、ごめんなさい、私の英語です。

EDITED:

まだ問題が起こっています。最も奇妙なことは、ログには実行中の大きなプロセスがなかったことと、それが過ぎた時が午前中だったことです(アプリケーションに接続された人がほとんどいない)。

私は過去にWindows環境でこのアプリケーションを使用していましたが、これは実現しませんでした。私はLinuxのインスタンスが良いと思ったが、私は夢中になっている。

ログ:

Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000f2d80000, 43515904, 0) failed; error='Cannot allocate memory' (errno=12) 
# 
# There is insufficient memory for the Java Runtime Environment to continue. 
# Native memory allocation (mmap) failed to map 43515904 bytes for committing reserved memory. 
# An error report file with more information is saved as: 
# /home/ubuntu/hs_err_pid20233.log 

今私の設定がsetenv.shでこれです:

輸出CATALINA_OPTS = -

"-server Dfile.encoding = CP1252 -Xms2048m -Xmx2048m"

そして、hs_errファイルにはこの行があるかどうかわかりません:

メモリ:4kページ、物理4046856k(102712k無料)、スワップ0k(0kフリー)

答えて

0

この設定はお使いのLinuxの設定で問題ありませんか?まあ、マシン上で何が実行されているのか、ほかのプロセスがどれくらいのメモリを使用するのか分かりません。したがって、答えは "それは依存する"です。ただし、自分で正しい設定を把握するためにできることは次のとおりです。-Xmx-Xmsを同じ値に設定して、サーバーのメモリが十分にあることをすぐに知りたい場合は、-Xmx-Xmsと設定します。この方法では、サーバーを起動したときにすぐにOutOfMemoryの状態に陥ります。たぶんお使いのOSは2つだけ割り当てることができます。(Java7で実行している場合はpermsizeパラメータと同じですが、それ以外の場合は削除してください)

また、パラメータのリストに-XX:+AlwaysPreTouchを追加して、メモリは最初から割り当てられています。

そして最後に、あなたは(だけでTomcatを起動するために使用されます)CATALINA_OPTS

+0

を使用する代わりに、(これは、shutdownコマンドを含め、JVMのいずれかの開始のために使用されます)JAVA_OPTSを設定する必要はありません実行している唯一の大きなプロセスは、アプリケーションを持つTomcatです。私はPermGenを削除したので、Java 8はそれを削除しました(そのアドバイスのおかげで)。 しかし、何かが間違っていると思います。「トップ」コマンドではメモリとプロセスを監視しており、「フリー」メモリは大きな数字から始まり、減少と減少を開始します。なぜか分かりませんが、使用されるメモリのようなものですneversは再利用されます。 –

+0

明示的に3072mに拡大することを許可します。この点に達するまでは、再利用の必要はありません。そのため、すべてのメモリを一度に割り当てる必要があります。十分なメモリがあるかどうかをすぐにご確認いただけます。 –

+0

同じxmsとxmxを明示的に追加します。次に、Tomcatが割り振ったメモリを解放しないと言っていますか?たとえそれを使用していないとしても? –

関連する問題