1

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スペース以上です

4

2 に答える 2

4

Java's memory includes

  • the heap space.
  • the perm gen space
  • thread stack areas.
  • shared libraries, including that of the JVM (will be shared)
  • the direct memory size.
  • the memory mapped file size (will be shared)

There is likely to be others which are for internal use.

Given that 37 MB of PC memory is worth about 20 cents, I wouldn't worry about it too much. ;)

于 2012-05-25T10:23:03.837 に答える
1

JConsole を使用してアプリケーションのプロファイルを作成しようとしましたかhttp://docs.oracle.com/javase/1.5.0/docs/guide/management/jconsole.html または、JProfiler 試用版を使用してアプリケーションのプロファイルを作成することもできます http:// www.ej-technologies.com/products/jprofiler/overview.html?gclid=CKbk1p-Ym7ACFQ176wodgzy4YA

ただし、メモリ使用量が多いことを確認する最初のステップは、アプリケーションで配列、マップ、セット、リストなどのオブジェクトのコレクションを使用しているかどうかを確認することです。使用されていない場合でも、オブジェクトへの参照を保持しているかどうかを確認してください。彼らと?

于 2012-05-25T10:08:12.147 に答える