科学アプリケーションに 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
これらも引数の前にある必要があり、多くの制御を提供します。