我在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,需要一個大小約爲90 MB。如果我取消註釋循環,像這樣
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分析器,可以通過主線程的本地var(集合)訪問TimeSeries對象,緊接着GC重新啓動一個新的迭代之後...而集合是巨大的(250K時間序列)。Wyy是發生這種情況,我該如何「對抗」這種(不正確的?)行爲?
什麼是manager.getTimeSeries();做?另外,它的返回值迭代器函數是做什麼的? –
Itis構建了它所知道的所有時間序列的ArrayList(對於它們管理的所有時間序列,都有底層對象進行相同操作)。最後,一個大的ArrayList被構建並返回,並且迭代器只是標準java迭代器,用於列表 – Bober02
它是否在(某些條件)時退出? p.s.它真正的困難,試圖解決一個問題,這是一個黑盒子 – bluesman