私は170kアイテムと20-150個の機能を持つ各アイテムからなる大きなデータベースを持っています。このデータを、item_idとフィーチャのリストで構成されるマップに取得するメソッドを実行すると、Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
が得られます。メソッドは約30分実行され、例外がスローされます。MySQLクエリでGCオーバーヘッドの上限を超えました
public Map<Integer, List<ItemFeatureMapping>> getItemFeatures() {
List<Item> allItems = getAllItems();
Map<Integer, List<ItemFeatureMapping>> result = new HashMap<>();
for (Item i : allItems) {
List<ItemFeatureMapping> itemFeatures = new ArrayList<>();
for (ItemFeatureMapping feature: i.getItemFeatures()) {
itemFeatures.add(feature);
}
result.put(i.getId(), itemFeatures);
}
return result;
}
私はマニュアルに見えた:あまりにも多くの時間 がガベージコレクションに費やされている場合は、並列コレクタはOutOfMemoryErrorが発生をスローします
:ここでの方法である場合の98%以上合計で の時間がガベージコレクションに費やされ、ヒープの2%未満が回復された場合、 が返されます。
OutOfMemoryError
がスローされます。この機能は、 の時間がアプリケーションの実行を妨げないように設計された です。ヒープのサイズが小さいため、処理がほとんどまたはまったく行われません。 です。必要に応じて、コマンドラインにオプション-XX:-UseGCOverheadLimit
を追加することで、この機能を無効にすることができます。
これをどのように並べ替えることができますか?または、メソッドを最適化することは可能ですか?
P .:私はコマンドラインで実行しようとしましたが、エラーが発生しましたCommand not found
。しかし、この方法は、長い時間実行されている可能性があるので、私はこの解決策が気に入らない。代わりに、すべてのループ実行のための新しいitemFeatures
オブジェクトを作成する
-Xmx4gパラメータを使用してjvmのヒープサイズを増やすことができます。 – dabaicai