Java использовала кучу по сравнению с размером выделенного объекта


У меня есть один, вероятно, глупый вопрос. В настоящее время я тестирую CSP-решатели choco и jacop. Когда я запускаю профилирование приложения (цвет графика, около 3000 узлов), я не полностью понимаю результаты.

Используемое пространство кучи, объявленное профилировщиком, составляет около 1 ГБ памяти. Сумма всех созданных объектов составляет менее 100 МБ. Где остальные 900 МБ оперативной памяти?

Я думаю, что вызовы методов (решатели, вероятно, используют массивное обратное отслеживание) распределяются по стеку, поэтому здесь не должно быть проблема. Когда я уменьшаю максимальный объем памяти с помощью Xmx param, приложение завершается ошибкой с исключением:

Исключение в потоке" main " java.яз..OutOfMemoryError: превышен предел накладных расходов GC

Таким образом, кажется, что остальная часть не является неиспользуемой невыбранной памятью (потому что в этом случае GC бы ее удалил (и не подвел бы)).

Спасибо за помощь.

2 2

2 ответа:

Можете ли вы получить карту кучи? Скорее всего, он фрагментирован, поэтому эти 100 м объектов распределены по всему пространству памяти. Необходимая память-это одновременно и функция выделенных объектов, и то, как быстро они выделяются, а затем удаляются. Эта ошибка означает, что область памяти слишком мала для рабочей нагрузки, сборщик мусора потребляет много ресурсов процессора, управляющего ею, и она вышла за допустимый порог.

Амир афгани, вероятно, был прав в своем комментарии . Классы (объекты) в Netbeans 6.9.1, вероятно, каким-то образом фильтруются (?или профилировщик фальшивый?), потому что когда я выполнил дамп кучи из java visual VM и проанализировал его, он показал мне !очень! разные числа (которые в сумме были такими же, как и использованная куча).

Спасибо за ответы.