Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > Необходимо уменьшить потребление памяти. |
Автор: isabsent 13.4.2012, 22:59 |
Запускаю два раза подряд приложение с разными параметрами. Первый раз потребляется очень много памяти - порядка 1 ГБ - так и должно быть, задача на большой перебор. Как видно на картинке![]() Теперь запускаю в коротком цикле эти же две операции - третий большой широкий зуб. Видно, что памяти потребляется больше чем в первом и счет продолжается дольше, чем если считать отдельные задачи. Вопрос - почему так нерационально используется память и что сделать, чтобы уйти от такого поведения? Задача тяжёлая для счета - приходится оптимизировать. P.S. Все ненужные листы и ссылки на них при завершении каждой операции в цикле сначала почистил, потом объявил как null. Пробовал вызывать gc после первой опреации в цикле - стало только хуже. |
Автор: isabsent 13.4.2012, 23:37 |
Я сам static'ом ничего не объявлял пока. Каким профайлером можно посмотреть что происходит с ненужными объектами, какие ссылки их удерживают от уничтожения когда я принудительно запускаю gc? В VisualVM я такой опции не нашёл... |
Автор: dorogoyIV 13.4.2012, 23:41 |
упс!!! без VisualVM можешь загрузить прогу и посмотреть? |
Автор: isabsent 14.4.2012, 00:09 | ||
Экспериментальным путём выяснил, что если проявить настойчивость ![]()
|
Автор: dorogoyIV 14.4.2012, 00:12 |
наверное твоя VisualVM в хеше хранит всю прогу, даже выключенную. |
Автор: isabsent 14.4.2012, 00:32 |
Нет, VisualVM я не запускал. Это я раньше пытался ею понять где те ссылки, которые не дают уничтожить объекты ненужные. |
Автор: dorogoyIV 14.4.2012, 01:28 |
т.е. ты запустил прогу без IDE, и все равно память утекает? (как запускал?) ну все равно, посмотри в диспетчер задач (если винда у тебя). может быть цикл бесконечный запущен, или таймер с режимом меньше ну 500 например... наверняка у тебя есть стандартная JVM. попробуй под ней скомпилировать и запустить эту прогу. |
Автор: isabsent 14.4.2012, 08:34 |
Нет, я ее запускал под IDE, но не под профайлером. |
Автор: isabsent 14.4.2012, 09:40 |
Если оставить один вызов gc после каждой операции в цикле (сделал одну "тяжёлую" по потреблению памяти операцию и 5 следующих за ней "лёгких" в цикле). Так выглядит потребление памяти без IDE ![]() А вот так под IDE ![]() Очевидно, что под IDE однкратный вызов gc не очищает ненужные объекты так же "хорошо" как если запускать jar-файл без IDE. |