4

コマンドラインを介して実行されるJavaアプリケーションを使用しています。XML ファイル、特に 400MB を超える dblp.xml データベースを扱います。

私は JVM 5 を使用していましたが、私のアプリは dblp.xml を処理するために 600 ~ 700 MB のメモリを必要としていました。JVM 6 に更新した後、1 GB 以上のメモリが必要になり始めました (私が持っていないものです)。ただし、実行速度は少し速くなります。

この同じコンピューターで何度も何度もテストしたので、メモリ消費量の違いは確かです。その結果、同じメモリ消費量の差が生じます。

-Xmx800M または -Xmx1000M だけで、特別なパラメータは設定しませんでした。Ubuntu Hardy Heron をデュアル コア 1.7 GHz、1.5 GB のメモリで実行 top/ps コマンドのみを使用して測定

なぜこれが起こるのか誰にも分かりますか?JVM 6 を使用したかったのは、実稼働サーバーで使用されている JVM であり、簡単に変更することができないためです。

ありがとう

4

9 に答える 9

4

私のアドバイスは、JProfilerのようなツールを使用して、メモリ消費量が増加した場所を正確に把握することです。JProfilerにお金をかけられない場合は、このオープンソースのJavaプロファイリングツールのリストを確認してください。

パフォーマンスの問題の原因を推測することは悪い考えです。なぜなら、ほとんどの場合、推測は間違っており、システムの間違った部分を最適化するのに時間を浪費するからです。客観的なデータが得られたら、メモリ消費を削減する最適化を思い付くことができるかもしれません。

新しいJVMが(キャッシュによって)速度とメモリを交換していることが事実である場合、この動作を停止するために使用できるjvmargが存在する可能性があります。最善の策は、Java 6のリリースノートをチェックして、そのような機能が言及されているかどうかを確認することです。

于 2008-11-26T04:56:28.237 に答える
3

32 ビット 1.5 JVM と 64 ビット 1.6 JVM を使用したのではないでしょうか? 32ビットまたは64ビットのJVMであるかどうかを確認できます

java -version

参照ごとに 4 バイトではなく 8 バイトが必要なため、64 ビット JVM は 32 ビット JVM と比較して約 30% 多くのメモリを必要とします。

于 2008-11-26T10:14:13.433 に答える
1

top/ps コマンドのみを使用して測定する

topまたはを使用して JVM のメモリ消費量を測定することはできませんps

JVM はかなり貪欲にメモリを予約します。GC によって既に予約されているメモリを解放しようとせずに、これを行う場合もあります。(これを変更するには、-Xms パラメーターを指定することもできます。詳細については、これを読んでください。)

toppsJavaアプリで実際に使用されているメモリではなく、現在予約されているメモリの量のみを表示します!

使用メモリを正確に測定したい場合は、Java 自体から測定する必要があります。ブルートフォースアプローチは次のようになります。

System.gc();
Runtime runtime = Runtime.getRuntime();
long memUsedInBytes = runtime.totalMemory() - runtime.freeMemory();

(デバッグの目的でのみ使用してください。製品コードでは絶対に使用しないでください!System.gc()は悪です。)

しかし、-Xmx800M と 1.6 を使用すると OutOfMemoryErrors に遭遇すると思いますが、1.5 は問題なく動作します。この場合、メモリ消費量に違いがあるため、この回答は補足事項にすぎません。

于 2008-11-26T20:01:19.020 に答える
0

コマンド「java-version」には、64ビットバージョン(または32ビット)であることを示すものはありません。64ビットバージョンかどうかを確認するためのより具体的な方法はありますか(そうではないと思いますが)。しかし、私は両方とも「apt-get」から取得しました。

-d32引数を使用してアプリケーションを実行しようとしました(32ビット、データモデルを強制するため)。彼は少し少ないメモリを使用しているようですが、それでもjvm5の場合よりもはるかに多く使用しています。

JVM 6:

/ usr / lib / jvm / java-6-sun / jre / bin / java -version java version "1.6.0_07" Java(TM)SEランタイム環境(ビルド1.6.0_07-b06)Java HotSpot(TM)クライアントVM(ビルド10.0-b23、混合モード、共有)

(サーバーマシン上)java-versionjavaバージョン"1.6.0"Java(TM)SEランタイム環境(ビルド1.6.0-b105)Java HotSpot(TM)クライアントVM(ビルド1.6.0-b105、混合モード)

JVM 5:

java-versionjavaバージョン"1.5.0_16"Java(TM)2ランタイム環境、Standard Edition(ビルド1.5.0_16-b02)Java HotSpot(TM)クライアントVM(ビルド1.5.0_16-b02、混合モード、共有)

anwsersをありがとう

于 2008-11-26T15:11:39.230 に答える
0

新しい JVM は速度のためにメモリ スペースを交換しているように聞こえます (つまり、キャッシングかどうか)。

于 2008-11-26T05:31:40.820 に答える
0

どのJDKを使用していますか? JRE (クライアント バージョン) はメモリ効率が悪いため、Sun の JDK (サーバー バージョン) を試してみることをお勧めします。

于 2008-11-27T17:37:48.967 に答える
0

jconsoleで確認できます

x86 は 32 ビットです。メモリがどこで使用されているかを本当に知りたい場合は、Eclipse Memory Analyzerを入手してください。

于 2008-11-28T15:47:39.923 に答える
0

xml ファイルを解析するために何を使用していますか? 初期の Java 6 ライブラリには、次のような動作を引き起こすバグがありました。

バグ 6536111

コメントに回避策があります。

于 2008-11-27T16:15:22.313 に答える
0

おそらく、以前の VM はクライアント エンジン (つまり「java -client」) を実行していましたが、現在の VM はサーバー エンジン (「java -server」) を使用しており、速度を上げるために多くのメモリを使用しています。これは、「java -version」の出力で確認できます。使用するデフォルトのエンジンは、jvm.cfg で設定できます (詳細については、http: //forums.sun.com/thread.jspa?threadID=5185368&tstart=1314を参照してください)。

于 2008-11-28T15:55:13.870 に答える