Java использовала кучу против выделенного размера объекта - PullRequest
2 голосов
/ 26 декабря 2010

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 26 декабря 2010

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

0 голосов
/ 27 декабря 2010

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

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

...