Java アプリに問題があります。昨日、テスト実行のためにデプロイしたところ、私たちのマシンがスワッピングを開始したことに気付きました。とにかく、トップの結果を確認したところ、約100MBのメモリを消費していることがわかりました(トップのRES)。メモリをプロファイリングして、メモリリークがあるかどうかを確認しようとしましたが、見つかりませんでした。クローズされていない PreparedStatement がありましたが、これを修正しましたが、あまり意味がありませんでした。最小ヒープ サイズと最大ヒープ サイズを設定しようとしましたが (最小ヒープ サイズは必要ないと言う人もいます)、違いはありませんでした。
これは私が今それを実行する方法です:
#!/bin/sh
$JAVA_HOME/bin/java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9025 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -XX:MaxPermSize=40m -Xmx32M -cp ./jarName.jar uk.co.app.App app.properties
topの結果は次のとおりです。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
16703 root 20 0 316m 109m 6048 S 0.0 20.8 0:14.80 java
私が最大PermSizeと最大ヒープサイズを設定することを理解していないことは、合計で72MBになります。これで十分です。アプリはうまく動作します。なぜまだ 109MB のメモリを消費しているのでしょうか。37MBの差で、かなりの比率です。(34%)。最大ヒープサイズが設定されており、メモリ不足エラーなどがないため、これはメモリリークではないと思います。
興味深いことの 1 つは、VisualVM でヒープ ダンプを作成し、それを EclipseMAT でチェックしたところ、クラスローダーにリークの可能性があると言われたことです。これはそれが言うことです:
クラスローダー/コンポーネント「sun.misc.Launcher$AppClassLoader @ 0x87efa40」は、9,807,664 (64.90%) バイトを占有します。メモリは、"" によってロードされた "short[][]" の 1 つのインスタンスに蓄積されます。キーワード sun.misc.Launcher$AppClassLoader @ 0x87efa40
これはあまり役に立ちませんが、役に立つかもしれません。
事前にご協力いただきありがとうございます。
編集
私はこれを見つけました、多分私にできることは何もありません... Tomcatのメモリ消費はヒープ+ permgenスペース以上です