Java использовала кучу по сравнению с размером выделенного объекта
У меня есть один, вероятно, глупый вопрос. В настоящее время я тестирую CSP-решатели choco и jacop. Когда я запускаю профилирование приложения (цвет графика, около 3000 узлов), я не полностью понимаю результаты.
Используемое пространство кучи, объявленное профилировщиком, составляет около 1 ГБ памяти. Сумма всех созданных объектов составляет менее 100 МБ. Где остальные 900 МБ оперативной памяти?
Я думаю, что вызовы методов (решатели, вероятно, используют массивное обратное отслеживание) распределяются по стеку, поэтому здесь не должно быть проблема. Когда я уменьшаю максимальный объем памяти с помощью Xmx param, приложение завершается ошибкой с исключением:
Исключение в потоке" main " java.яз..OutOfMemoryError: превышен предел накладных расходов GC
Таким образом, кажется, что остальная часть не является неиспользуемой невыбранной памятью (потому что в этом случае GC бы ее удалил (и не подвел бы)).
Спасибо за помощь.
2 ответа:
Можете ли вы получить карту кучи? Скорее всего, он фрагментирован, поэтому эти 100 м объектов распределены по всему пространству памяти. Необходимая память-это одновременно и функция выделенных объектов, и то, как быстро они выделяются, а затем удаляются. Эта ошибка означает, что область памяти слишком мала для рабочей нагрузки, сборщик мусора потребляет много ресурсов процессора, управляющего ею, и она вышла за допустимый порог.
Амир афгани, вероятно, был прав в своем комментарии . Классы (объекты) в Netbeans 6.9.1, вероятно, каким-то образом фильтруются (?или профилировщик фальшивый?), потому что когда я выполнил дамп кучи из java visual VM и проанализировал его, он показал мне !очень! разные числа (которые в сумме были такими же, как и использованная куча).
Спасибо за ответы.