2010-12-26 2 views
2

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

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

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

Исключение в потоке «основной» java.lang.OutOfMemoryError: GC предел накладных расходов превысил

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

Благодарим за помощь.

+1

Уверены ли вы, что на визуализаторе выделенного объекта не установлен какой-либо фильтр? Какой профайлер вы используете? Также, пожалуйста, вставьте результаты своего профилировщика, если данные не чувствительны. –

+0

Я использую профилировщик netbeans - http://img405.imageshack.us/i/profilerd.png/ Последняя точка используемой памяти - 374 МБ (все еще намного больше, чем в выделенных объектах) ... – malejpavouk

+0

На пике (в прямом эфире результаты), самый большой массив имеет около 30 МБ (все остальное пропорционально меньше) ... – malejpavouk

ответ

0

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

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

+0

Это, вероятно, не фиктивный, он, скорее всего, отфильтрован как-то не показать строки или char [], или что-то еще ... –

1

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

+0

В java это не должно быть причиной ... В eden его невозможно обрезать память (есть два пробела, один из которых всегда свободен, и все копируется во время сбора) ... и в поколении поколения GC встряхивает (не знаю правильного английского слова) объекты вместе (и дефрагментирует память) ... – malejpavouk