JavaのGCで非常に奇妙な問題が発生します。私は次のコードを実行しています:
while(some condition){
//do a lot of work...
logger.info("Generating resulting time series...");
Collection<MetricTimeSeries> allSeries = manager.getTimeSeries();
logger.info(String.format("Generated %,d time series! Storing in files now...", allSeries.size()));
//for (MetricTimeSeries series : allSeries) {
// just empty loop
//}
}
JConsoleを調べると、すべてのループ反復の再開時に、手動でGCを強制した場合、古いgenヒープスペースのサイズは約90MBになります。このようにループのコメントを外すと
while(some condition){
//do a lot of work...
logger.info("Generating resulting time series...");
Collection<MetricTimeSeries> allSeries = manager.getTimeSeries();
logger.info(String.format("Generated %,d time series! Storing in files now...", allSeries.size()));
for (MetricTimeSeries series : allSeries) {
// just empty loop
}
}
強制的に更新しても、550MBを下回ることはありません。yourKitプロファイラーによると、TimeSeriesオブジェクトは、新しい反復の再開時のGCの直後に、メインスレッドのローカル変数(コレクション)を介してアクセスできます...そしてコレクションは膨大です(250K時系列)... Wyy isこれが起こって、どうすればこの(間違った?)行動と「戦う」ことができますか?