![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| yuliada |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 16.2.2009 Где: Иркутск - San Die go Репутация: нет Всего: нет |
Программа падает с OutOfMemeory, хотя судя по судя по тому что пишется при -verbose:gc память еще есть. Программка выдает определенным образом посчитанную статистику по данным, которые грузятся в память. Идея была такая - забить как можно больше данных в память (до того как значение runtime.maxMemory() - runtime.totalMemory() + runtime.freeMemory() не станет меньше некоторой константы), потом эти данные обработать и выдать результат. Во время работы программы с какого-то момента начинается усиленная сборка мусора и после этого программа падает:
Первая цифра, как я понимаю, сколько памяти было занято до работы gc, вторая - сколько осталось после, третья - максимальный объем памяти. Судя по распечатке еще остается свободен как минимум 1 GB. Падает на конструкторе SubColumnSynonymsStatistic. В этом классе 4 поля int и один Hashtable, т.е. на его создание не должно вроде бы много памяти уйти (не 1 GB точно). Падает на строчке:
Почему оно падает? Т.е. если вычесть из максимального объема памяти объем занятой памяти, то мы не получим сколько памяти еще осталось? Надо учесть что-то еще? Или это по какой-то другой причине вообще? |
||||
|
|||||
| yuliada |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 16.2.2009 Где: Иркутск - San Die go Репутация: нет Всего: нет |
Эта распечатка от момента при котором происходит попытка добавить очередную порцию данных (которая точно не 1GB занимает) до момента, когда прога падает. Т.е. в этот период ничего очень большого не создается.
Это сообщение отредактировал(а) yuliada - 14.9.2009, 12:37 |
|||
|
||||
| Andy_L20066 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 10.3.2008 Репутация: нет Всего: 1 |
хм... попробуй указать программе явно обьем доступной памяти через параметр: -Xmx1024M, думаю должно помочь...
ну я никогда еще не анализировал чего там пишет garbage collector... может память там и остается... но JVM считает что ее недостаточно, я бы посоветовал использовать к примеру JProfiler для поиска проблемных мест в коде, там будет четко видно сколько памяти и какой метод зажирает... и уже потом можно делать выводи, и оптимизировать как-то. |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Я тут вижу две странности.
1. Сборка мусора всегда начинается при значении занятой памяти 18773376K, хотя еще гиг свободен. 2. Очень странные строчки:
Т.е. чистили, чистили и в итоге освободили менее килобайта. Но при этом следующая уборка мусора началась с той же отметки, как будто программа памяти и не потребляет. Последний раз программа очищает просто гигантский объем памяти и очень быстро. Я так понимаю это уже происходит после OutOfMemoryError, да? -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| yuliada |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 16.2.2009 Где: Иркутск - San Die go Репутация: нет Всего: нет |
Оказалось что таки создается. Эта порция оказалось какой-то ненормально большой, хотя предполагалось что таких данных не может попасться. Теперь это проверяется, прога работает.
Мне тоже именно это и показалось странным, поэтому я не предположила что там очень много данных в очередной "порции". Эта что-то типа структуры, элементы которой по очереди читаются и создаются (т.е. вот эти SubColumnSynonymsStatistic итп) - эти элементы по отдельности много не занимают и их штук 100 там обычно. Поэтому я думала что gc бы начинал работать не когда 1 GB до конца остается, а позже.
Не знаю какая там очередность, но строчка с Exception вываливается позже [Full GC 18773375K->145525K(19626688K), 5.0810654 secs]. Это сообщение отредактировал(а) yuliada - 15.9.2009, 05:41 |
||||||
|
|||||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Мне показалось странным, именно то, что цифра 18773376K всегда одна и та же. В реальных приложениях так не бывает. Всегда помимо основного потока есть еще потоки, которые тоже потребляют память, так что она должна плавать. К тому же выделить гиг за один раз можно, только с помощью масссива. Все остальное будет выделять память значительно меньшими кусками и по идее должно вызывать сборку мусора на других значениях занятой памяти. Думаю тут нужен или профилировщих или Java VisualVM. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |