18

Java1.5.0.19からJava1.6.0.21にアップグレードしたJavaWebアプリがあります。

/usr/java/jdk1.6.0_21/bin/java -server -Xms2000m -Xmx3000m -XX:MaxPermSize=256m -Djava.awt.headless=true -Dwg.environment=production -Djava.io.tmpdir=/var/cache/jetty -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=31377 -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.ssl=false -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/webapp -Dprogram.name=run.sh -Djava.endorsed.dirs=/opt/3p/jboss/lib/endorsed -classpath /opt/3p/jboss/bin/run.jar:/usr/java/jdk1.6.0_21/lib/tools.jar org.jboss.Main -c default

ご覧のとおり、2GBのヒープを事前に割り当て、最大で3GBにする必要があります(このアプリが古く、設計が不十分であるため、大量の負荷がかかるため、事前に割り当てる必要があります)。1.6にアップグレードした後に最近見た問題は、メモリが屋根を通過することがあるということです。メモリ使用量はアプリの問題である可能性がありますが、JVMはヒープの最大セットアップ3GBを超えています。トップを使用すると、次のようになります。

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND    
8449 apache    18   0 19.6g 6.9g 5648 S  4.0 84.8  80:42.27 java             

では、ヒープが3GB、permgenが256MB、オーバーヘッドがいくらかあるJVMで6.9GBを消費するにはどうすればよいでしょうか。ビルド#35にアップグレードすることで修正されるJVMのバグ?Javaで何が不足しているのか、余分なメモリを使用している可能性がありますか?誰かがこれを以前に見たことがあるかどうかを確認しようとしています。

4

3 に答える 3

14

では、3 GB のヒープ、256 MB の permgen、さらにはいくらかのオーバーヘッドを持つ JVM が 6.9 GB を消費するのはどうしてでしょうか?

考えられる説明は次のとおりです。

  • たくさんのスレッドスタック、
  • 閉じるべきときに閉じられていないメモリ マップト ファイル、
  • ヒープ外メモリを使用する (おそらくリークする) ネイティブ コード ライブラリ。

JVM のせいにする前に、アプリケーションのせいにする傾向があります。

于 2012-09-06T03:11:39.090 に答える
12

要するに、私の最初の反応は正しかったのです。それは JVM のバグでした。1.6.0_21 を使用していましたが、 https: //confluence.atlassian.com/pages/viewpage.action?pageId=219023686 で概説されているものとまったく同じエラーが発生していたことが判明しました。1.6.0_37 にアップグレードすると問題が解決し、毎日のクラッシュから 2 週間クラッシュなしになりました。

そのため、JVM を非難するだけではないという意見は良い方針ですが、JVM にバグがないことを常に想定しないようにアドバイスする必要があるようにも思われます。さらに、物事を最新の状態に保つための良いポリシーのようです。

これに関するすべての助けをありがとう!

于 2012-11-08T21:29:46.027 に答える
2

http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/garbage_collect.html

JVM はヒープだけでなく、より多くのメモリを使用することに注意してください。たとえば、Java メソッド、スレッド スタック、およびネイティブ ハンドルは、JVM 内部データ構造と同様に、ヒープとは別のメモリに割り当てられます。

そのため、多数のスレッドと多数のネイティブ ハンドルがある場合、メモリがヒープ制限を超える可能性があります。これも以前はなかったと思いますか?

これもチェックしてください: Java using more memory than allocated memory

于 2012-09-06T03:03:43.923 に答える