私は多数の投稿を読んだことがありますが、わかりました。私はインストールされているTomcatのサービス、あります。ただし、このサービスのtomcat7.exeプロセスが一貫しTomcatのサービスメモリが最大値を超えています。
PsExec.exe -s {jdk}\bin\jinfo.exe -flag MaxHeapSize {pid}
:私は、これらの設定のような呼び出しを経由して成功していることを確認しました
--JvmMx=1000
--JvmMs=128
をサーバがクロールするまで、この最大値を3以上のファクタで超えています。奇妙なことに、これは1台のサーバー上の問題に過ぎません。他の場所ではそれはかなり一定であり、制限の下に留まります。私はまた、私の開発環境でメモリリークを探して、見つけていませんでした。これをデバッグする
、私はそうのようなGCを強制しようとしました:
PsExec.exe -s {jdk}\bin\jcmd.exe {pid} GC.run
しかし、これは効果がないようです。だから、次の私は、インストールにこれを追加することにより、jconsoleを監視するためにそれを設定:
tomcat7.exe //US//%SERVICE_NAME% ++JvmOptions="-Dcom.sun.management.jmxremote"
tomcat7.exe //US//%SERVICE_NAME% ++JvmOptions="-Dcom.sun.management.jmxremote.port=8086"
tomcat7.exe //US//%SERVICE_NAME% ++JvmOptions="-Dcom.sun.management.jmxremote.ssl=false"
tomcat7.exe //US//%SERVICE_NAME% ++JvmOptions="-Dcom.sun.management.jmxremote.authenticate=false"
今では行儀のだ(もちろん!)。 GCがはっきりと働いており、プロセスメモリは限界以下にとどまっています。
私はうんざりです。最大ヒープは1 GB、永続メモリは90 MB、スタックサイズはデフォルトで約128 KBですか?そして、スレッドカウントは増加しませんが、「唯一」67となります。プロセスメモリはどのようにして3GB以上になるのですか?なぜメモリ不足例外が発生していないのですか?
今でも、jconsoleによる "well-behaved"サービスは、57スレッドで実行される約50 MBのヒープのみを使用しています。それでもタスクマネージャは800 MBを使用して71スレッドを表示しています。違いはTomcatによるものだと思いますか?私の理解の隙間を埋めるのを助けてください。公式ドキュメントから
リンクをありがとう。それは面白い!私はそれがここに当てはまるかどうかわかりませんが。サービスはほとんど使われていないので、DBをチェックして実行してステータスを記録する作業だけをループします。確かにあまり並行性はあまりありません。私は、DB呼び出しがおそらくネイティブであると考えます。 JVMコードが非常に大きくなるのは奇妙なことです。その成長を制限する方法はありますか? – Didjit
そしてXms/Xmxポイントについては、はい、私は全く同意します。 – Didjit
@Didjit JVMが使用するネイティブメモリのサイズを制限する方法はわかりません.OSレベルでプロセスメモリを制限することはできません。プロセスが制限を超えた場合、プロセスを終了します。実際にはJVMがそのような制限の下に留まることはありません。 –