1

Linux、AIX、およびHP-Ux(PA-RISC)で実行されるJavaアプリケーションを出荷します。他の2つの環境で正常に動作するアプリケーションから、HP-Uxで許容可能なレベルのパフォーマンスを得るのに苦労しているようです。これは、実行時間とメモリ消費の両方に当てはまります。

「なぜ」についての明確な記事はまだ見つかりませんが、共有コードなどが誤解を招く結果をもたらすため、「top」を使用してメモリ消費量を測定することは大雑把なアプローチだと思います。ただし、HP-Uxのメモリ消費が問題になっている顧客サイトで行う必要があるのはこれだけです。今回問題になったのは、Java1.4からJava1.5(HP-Ux 11.23 PA-RISC)に移行したときだけです。「問題」とは、16GBの物理メモリをすべて使い果たしたため、マシンが新しいプロセスを作成しなくなったことを意味します。

「空きメモリ」の合計の「前」と「後」を測定することにより、Javaアプリケーションによって消費された量を測定しようとしています。私は、10,000個のランダムな64ビット文字列をArrayListに格納するクイックアプリを作成し、Java1.4およびJava1.5でLinuxおよびHP-Uxの消費量を測定するこのアプローチを試しました。

結果:

HP Java 1.4〜60MB

HP Java 1.5〜150MB

Linux Java 1.4〜24MB

Linux Java 1.5〜16MB

これらの結果が生じる理由を誰かが説明できますか?これは、「トップ」が空きメモリを測定する方法の特異性ですか?HP上のJava1.5は、実際にJava 1.4の2.5倍のメモリを消費しますか?

ありがとう。

4

4 に答える 4

1

現在、仮説をテストするためのHPボックスがありません。ただし、私があなたの場合は、JConsole(JDKに付属)またはyourkitなどのプロファイラーを使用して何が起こっているかを測定します。

しかし、何かがおかしいのを見た後、測定を開始したようです。だから、私はそれが起こっていることを軽視しているのではありません-同じ状況で私がしたであろうことをあなたに指摘するだけです。

于 2008-10-30T02:55:12.403 に答える
1

JVM のデフォルト パラメータが異なる場合があります。ヒープは、設定したサイズまで大きくなります。Sun VM のデフォルトは、マシンの RAM の特定のパーセンテージです。つまり、より多くのメモリを搭載したマシンを使用すると、Java はデフォルトでより多くのメモリを使用します。

HP-UX VM が HP によってこの種のことに対して多くの調整を受けていなかったとしたら、私は本当に驚かされることでしょう。両方のパラメーターをいじることをお勧めします-パフォーマンスやスループットを損なうことなく使用できる最小の最大ヒープサイズを見つけてください。

于 2008-10-30T04:23:22.617 に答える
0

まず、「10,000 個のランダムな 64 ビット文字列」テストで何を測定したかが明確ではありません。アプリケーションを起動し、ブートストラップのメモリ フットプリントを測定してから、テストを実行することになっていました。Java 1.5 が起動直後により多くのヒープを取得することは容易に考えられます (たとえば、ヒープ マネージャーの設定が原因で)。

次に、HP-UX で 1.4、1.5、および 1.6 の Java アプリケーションを実行しましたが、特別なメモリ要件はありません。ただし、ハードウェアは Itanium です。

第三に、なぜトップを使うのですか?なぜ単に Runtime.getRuntime().totalMemory() を出力しないのでしょうか?

第 4 に、ArrayList に値を追加することで、メモリの断片化を作成します。ArrayList は、内部ストレージを時々 2 倍にする必要があります。GC 設定と ArrayList.ensureCapacity() の実装によっては、収集されないメモリの量が 1.4 と 1.5 の間で劇的に異なる場合があります。

基本的に、問題の原因を突き止める代わりに、有用な情報を提供しないランダム テストを実行しました。アプリケーションでプロファイラーを実行して、メモリ リークが発生している場所を特定する必要があります。

于 2008-10-30T04:16:17.873 に答える
0

また、解決しようとしている問題を確認することもできます...最適化の適切なラウンドが原因でなく、16GBのメモリを消費する多くの問題があるとは思いません。

複数の VM を起動していますか? 大規模なデータセットをメモリに読み込んでいて、それらを十分に迅速に破棄していませんか? などなど

于 2008-10-30T14:26:38.687 に答える