У меня очень странная проблема с GC в Java. Я бегу-й следующий фрагмент кода:Переполнение верхнего пространства кучи старого
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 МБ. Если я раскомментировать петлю, как этот
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 доступны через локальный var (коллекцию) основного потока, сразу после GC при перезапуске новой итерации ... И коллекция огромна (временные ряды по 250K.) ... Wyy is это происходит и как я могу «бороться» с этим (неправильным?) поведением?
Что делает manager.getTimeSeries(); делать? Кроме того, что делает его функция итератора возвращаемого значения? –
Itis создает ArrayList всех временных рядов, о которых он знает (есть базовые объекты, которые, в свою очередь, делают то же самое, для всех временных рядов они управляют). В конце, один большой ArrayList является сборкой и возвратом, и итератором является только стандартный java-итератор для List – Bober02
, он когда-либо выходит в то время как (какое-то условие)? стр. его реальная трудная попытка решить проблему, которая является черным ящиком – bluesman