4

科学アプリケーションに JVM を使用しています。私のプロセスの最初のステップは、大量のデータを小さなdouble[]配列 (大きなグラフの各ノードに 48 要素の配列) にロードすることです。それらすべてをロードするのに十分なメモリがあるかどうかを確認するよりずっと前に、Java は漸近的に遅くなり、jvisualvm は、これはほぼすべての CPU 時間がガベージ コレクションに費やされているためだと教えてくれます。

ここに画像の説明を入力

最初の 1 分ほどは問題ありません。「使用済みヒープ」(右のプロット) は、一時的なオブジェクト (これは Scala で書きました) と永続的なオブジェクトがあるため、成長するにつれて上下にジャンプします。ただし、その後、ガベージ コレクターが同じオブジェクトを何度もチェックしているように見えるため、データの読み込みは停止します (左のプロット)。それらが範囲外になることを期待しているに違いありませんが、分析に使用したいので範囲内にとどめています。

ガベージ コレクターは、生存の可能性に基づいてオブジェクトを異なる世代に配置することを知っています。第 1 世代には、最近作成され、すぐに消滅する可能性のあるオブジェクトが含まれています。後の世代は次第に長生きする可能性が高くなります。オブジェクトが誤って最初の世代にある場合、ガベージ コレクターに後の世代にすべきであることを伝える方法はありますか? 私はそれらを保持することを知っています---ガベージコレクターにどのように伝えることができますか?

これらのオブジェクトをより永続的な世代にしたいのですが、PermGen は遠すぎます。数十分の処理の後、それらは最終的に死んでしまいます。(これをHadoopレデューサーで使用したいと考えています。これは、新しいJVMなしで、この後に別のデータチャンクで機能する可能性があります。)

注: Sun HotSpot VM を使用しています。

% java -version
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)

訂正 (以前の編集): を変更すると飽和点-Xmx -Xmx変更されますが、引数の後にコマンド ライン引数が渡された場合、明らかに Java はコマンド ライン引数を無視し-jarます。つまり、する

java -Xmx2048 -jar MyJarFile.jar

それよりも

java -jar MyJarFile.jar -Xmx2048

-Xmxこのため、最大ヒープに関する動作を誤って診断しており、フラグを指すすべての回答が有効です。

ここで説明する飽和点は、「ヒープ サイズ」(右側のプロットのオレンジ色) が選択した-Xmx制限に達したときに発生します。-XX:NewRatioまたはを使用した「古い」世代のサイズ-XX:OldSize-jarこれらも引数の前にある必要があり、多くの制御を提供します。

4

3 に答える 3

5

GC は、ヒープが飽和状態に近づいていない限り、スパイラルで自己を呼び出すべきではありません。最大ヒープ サイズ (-Xmx) を増やす必要があります。予想保持の 2 倍に近いものから始めてください。CMS コレクターを使用することもできます。これにより、大規模な Tenured セットの状況を改善できます。また、古い世代は定期的にスイープする必要がないため、新しい世代を手動で調整する必要がある場合もあります。

NIO ダイレクトByteBuffers の使用を検討することもできます。これらは、より効率的な I/O 操作のために設計されていますが、寿命が非常に長く、幅の広いメモリ アレイには合理的な選択肢です。

于 2013-09-25T15:50:50.177 に答える
1

JVisualVM のVisualGCプラグインを使って確認すると、世代の違いがどのように使われているかがわかると思います。スクリーンショットに基づいて、古い世代がいっぱいになっているようです (ヒープが完全にいっぱいではないにもかかわらず、GC は一生懸命働いているため)、GC はメモリを解放するのに苦労しています。ヒープを増やすか、-XX:NewRatio使用して世代のサイズを調整する必要があります。また、オブジェクトが「古い」と見なされるタイミングを制御するために、保有期間のしきい値を調整することもできます。

于 2013-09-25T15:55:36.220 に答える
0

オブジェクトがまだ参照されている場合、オブジェクトはガベージ コレクションされません。そのため、オブジェクトをガベージ コレクションするまで、オブジェクトへの参照を保持してください。

于 2013-09-25T15:54:31.140 に答える