web-dev-qa-db-ja.com

Tomcatの過剰なメモリ消費

Ubuntu 11.04(Natty)(64ビット)を実行している新しいサーバーがあります。 openjdkTomcat6をインストールすることから始めました。 Tomcatサーバーが起動すると、すぐに480+ MBのメモリが使用されます。これはかなり釣り合いが取れていないようで、Tomcatに200-300 MB(またはそれ以下)のメモリを使用させるソリューションがあるかどうか疑問に思っています。

memtop を使用してこれを確認しました:(注:大きなエントリを除くすべてを削除しました。499MBのエントリはTomcatです)

  user@xyz:~# python memtop-0.9.py
  PID |   private/writ. mem |command
      |  current | previous |(truncated)
19776 | 499.3 MB |    +++++ |/usr/lib/jvm/Java-6-openjdk/bin/Java-Djava.util.logging.config.file=/var/lib/Tomcat6/conf/logging.properties-Djava.awt.headless=true-Xm
18082 | 148.6 MB |    +++++ |/usr/sbin/mysqld
 1385 |   3.6 MB |    ++    |pythonmemtop-0.9.py
RAM usage:  ==============================================  69.3 %

さらに、インストールしたJDKおよびTomcatパッケージを確認できます。

user@xyz:~# dpkg --get-selections | grep jdk
default-jdk                                     install
openjdk-6-jdk                                   install
openjdk-6-jre                                   install
openjdk-6-jre-headless                          install
openjdk-6-jre-lib                               install

user@xyz:~# dpkg --get-selections | grep Tomcat
libtomcat6-Java                                 install
Tomcat6                                         install
Tomcat6-admin                                   install
Tomcat6-common                                  install
Tomcat6-user                                    install

Tomcatの起動スクリプトはXmx128Mに設定します。

Java_OPTS="-Djava.awt.headless=true -Xmx128M"

誰かが私がメモリ消費をもっと合理的なものにノックダウンするために何ができるかについて何か考えを持っていますか? JVMとTomcatが一緒にこれだけのメモリを消費する必要がある理由がわかりません。

[〜#〜]編集[〜#〜]

そのために、Tomcat 6を直接ダウンロードして、起動スクリプトを実行しました。no今回はXmx値が設定されました。これを実行すると、 memtop は、Tomcatが737 MB相当のメモリを使用していることを示します。

これにより、JVMに大量のメモリを使用するopenjdkに問題があると思います。


Tomcat 7-同じ問題の新しい.Zipダウンロードで同じことを試しました。を使用していました740MBのメモリ。


Sun JRE/JDKをインストールしました。メモリ消費量は約400 MBに低下しました(ほぼ500 MBから減少)。これは、私が望むよりもまだ多くのメモリ使用量です!

(Sun-Java6-bin、Sun-Java6-jdk、Sun-Java6-jre)


topを実行すると、次のようになります。

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
13749 Tomcat6   20   0  481m  68m 9892 S    0  7.4   0:02.85 Java

64ビットマシン/ JVMがより多くのメモリを使用することを認識し、期待していますが、これほど高いとは思っていませんでした。私はVMで実行していますが、これは512MBしか保証していません。

7
Tanner

----ポイントが出てこないので例を提供するために編集されました----

プロセスが起動し、1GBのメモリを要求します。

次に、そのプロセスは8つのスレッドを開始します(これらはすべて、割り当てられた1 GBのメモリにアクセスできます)。

誰かがツールを実行して、使用されているメモリの量を判別します。このツールは次のように機能します。

  1. すべてのスケジュール可能なアイテム(各スレッド)を検索します。
  2. アクセスできるメモリの量を確認してください。
  3. そのメモリを一緒に追加します
  4. 合計を報告します。

ツールは、プロセスが9 GBのメモリを使用していることを報告します。これは、8つの生成されたスレッド(および元のプロセスのスレッド)がすべて同じGBのメモリを使用していることが(うまくいけば)明らかな場合です。

これは、一部のツールがメモリを報告する方法の欠陥です。ただし、これは簡単に修正できる欠陥ではありません(修正するには、非常に古い(ただし重要な)ツールの出力を変更する必要があるため)。 topやpsを書き直す人にはなりたくないので、OSがPOSIXではなくなります。

----元の投稿は次のとおりです----メモリレポートツールの一部のバージョン(topなど)は、スレッド(すべて同じメモリにアクセスできます)をプロセスと誤って混同します。その結果、5つのスレッドを生成するTomcatインスタンスは、メモリ消費量を5倍誤って報告します。

確認する唯一の方法は、メモリ消費量のあるプロセスを個別にリストしてから、スレッドの1つ(プロセスのようにリストされる)のメモリを読み取ることです。そうすれば、アプリケーションの実際のメモリ消費量を知ることができます。追加を行うツールに依存している場合、同じ共有メモリを参照しているスレッドの数によって実際に使用されているメモリの量を過大評価することになります。

2 GBのメモリ(および1 GBのスワップ)を備えたボックスがあり、以前は特にスレッドの多いアプリケーションで最大7GBのメモリが使用されていたと報告しています。

多くのツールによってメモリがどのように報告されるかをよりよく理解するには、 ここを見てください 。 pythonコードがこれらのツールのいずれかのテキストを解析している場合、または同じシステムコールからそのデータを取得している場合、メモリの過大報告で同じエラーが発生します。

2
Edwin Buck