Ubuntu 11.04(Natty)(64ビット)を実行している新しいサーバーがあります。 openjdk
とTomcat6
をインストールすることから始めました。 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の起動スクリプトはXmx
を128Mに設定します。
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しか保証していません。
----ポイントが出てこないので例を提供するために編集されました----
プロセスが起動し、1GBのメモリを要求します。
次に、そのプロセスは8つのスレッドを開始します(これらはすべて、割り当てられた1 GBのメモリにアクセスできます)。
誰かがツールを実行して、使用されているメモリの量を判別します。このツールは次のように機能します。
ツールは、プロセスが9 GBのメモリを使用していることを報告します。これは、8つの生成されたスレッド(および元のプロセスのスレッド)がすべて同じGBのメモリを使用していることが(うまくいけば)明らかな場合です。
これは、一部のツールがメモリを報告する方法の欠陥です。ただし、これは簡単に修正できる欠陥ではありません(修正するには、非常に古い(ただし重要な)ツールの出力を変更する必要があるため)。 topやpsを書き直す人にはなりたくないので、OSがPOSIXではなくなります。
----元の投稿は次のとおりです----メモリレポートツールの一部のバージョン(topなど)は、スレッド(すべて同じメモリにアクセスできます)をプロセスと誤って混同します。その結果、5つのスレッドを生成するTomcatインスタンスは、メモリ消費量を5倍誤って報告します。
確認する唯一の方法は、メモリ消費量のあるプロセスを個別にリストしてから、スレッドの1つ(プロセスのようにリストされる)のメモリを読み取ることです。そうすれば、アプリケーションの実際のメモリ消費量を知ることができます。追加を行うツールに依存している場合、同じ共有メモリを参照しているスレッドの数によって実際に使用されているメモリの量を過大評価することになります。
2 GBのメモリ(および1 GBのスワップ)を備えたボックスがあり、以前は特にスレッドの多いアプリケーションで最大7GBのメモリが使用されていたと報告しています。
多くのツールによってメモリがどのように報告されるかをよりよく理解するには、 ここを見てください 。 pythonコードがこれらのツールのいずれかのテキストを解析している場合、または同じシステムコールからそのデータを取得している場合、メモリの過大報告で同じエラーが発生します。