10

古いアプリケーションのアーカイブを担当するアプリケーションがあります。このアプリケーションは一度に多数のアプリケーションを実行するため、一度に数日間実行する必要があります。

私の会社がこれを開発したとき、彼らはそれに対してかなりのパフォーマンステストを行い、これからまともな数値を得ているようでしたが、私は最近顧客のためにアーカイブを実行していて、それは本当に遅いようで、パフォーマンスは実行時間がさらに長くなります。

jconsoleで監視しているので、まだ十分なメモリが使用可能であり、縮小していないように見えるため、メモリリークは発生していないようです。

しかし、ガベージコレクションが発生してそれをクリアするまで、サバイバースペースとヒープの保有世代が非常に迅速にいっぱいになる可能性があることに気付きました。これはかなり頻繁に発生しているようですが、それが明らかな原因であるかどうかはわかりません。徐行。

アプリケーションは現在7日間3時間実行されており、jconsoleによると、コピーガベージコレクション(772、611コレクション)の実行に6時間、marksweepコンパクション(145,940コレクション)の実行に12時間25分を費やしました。

これはガベージコレクションにかなりの時間を費やすように思われます。誰かが以前にこのようなことを調べて、これが正常かどうかを知っているかどうか疑問に思っています。

編集

ローカル処理は遅いようです。たとえば、xpathを使用してSOAPエンベロープからxmlを抽出するのに5秒かかったログの一部を調べて、ルートタグとともに文字列バッファに追加します。これですべてです。します。これは本番環境で実行されているため、まだプロファイルを作成していません。データをネット経由でプルダウンするか、開発環境に大規模なテストベースを設定する必要があります。

JavaHotSpotクライアントVMバージョン10.0-b23の実行

本当に必要なのは高スループットであり、特定のガベージコレクションパラメータを設定しておらず、デフォルトが何であれ実行されます。どのコレクターが使用されているかを見つける方法がわかりませんか?

修理

プロファイラーを実行することになり、速度低下の原因は、ステータスボックスから行を絶えずトリミングしてログステートメントを出力するコードであることが判明しましたが、これはかなりひどく行われました。ガベージコレクションは、実際の原因ではなく、ステータステキストをメモリに絶えずコピーすることによる症状であると考えるべきでした。

乾杯みんな。

4

3 に答える 3

4

あなたの数によると、ガベージコレクションの合計時間は7日間の実行時間のうち約18時間でした。合計実行時間の約10%で、これはわずかに高くなりますが、これを0%まで下げることができたとしても、実行時間は10%しか節約できませんでした...したがって、大幅な節約を求めている場合は、たとえば、プロファイラーを使用して、残りの90%を詳しく調べる必要があります。

于 2012-04-06T02:08:55.877 に答える
2

適切なプロファイリングがなければ、これは推測ゲームです。ただし、数年前、私が関わっていたWebアプリは、JDKのアップグレード後、突然10倍の速度(応答時間)になりました。私たちは結局、会社にいなくなった天才によって追加された明示的なGC呼び出しにそれを追いかけました。

于 2012-04-06T02:50:29.370 に答える
2

JVMヒープフットプリントとGC時間の間には、維持しようとするバランスがあります。もう1つの質問は、GCの頻度が高すぎるような方法でヒープ(および世代)が(不足して)割り当てられているかどうかです。これらのシステムにマルチテナントJVMをデプロイする場合、フットプリントを低く抑えるために、ヒープを積極的に縮小するとともに、合計GC時間の5%未満にバランスを維持しようとしました(これもマルチテナント)。ヒープと世代は、設定されているものに頻繁にGCを実行しないように、ほとんどの場合常にいっぱいになります。パラメータを削除して-Xms、より現実的な定常状態を確認します(アイドル時間があれば)

ただし、プロファイリングに関する提案に+1します。それはGCとは関係がないかもしれませんが、コードです。

于 2012-04-06T03:27:32.060 に答える