Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> OutOfMemory, -verbose:gc говорит что память есть 
V
    Опции темы
yuliada
Дата 14.9.2009, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 16.2.2009
Где: Иркутск - San Die go

Репутация: нет
Всего: нет



Программа падает с OutOfMemeory, хотя судя по судя по тому что пишется при -verbose:gc память еще есть. Программка выдает определенным образом посчитанную статистику по данным, которые грузятся в память. Идея была такая - забить как можно больше данных в память (до того как значение runtime.maxMemory() - runtime.totalMemory() + runtime.freeMemory() не станет меньше некоторой константы), потом эти данные обработать и выдать результат. Во время работы программы с какого-то момента начинается усиленная сборка мусора и после этого программа падает:
Код

[Full GC 18773375K->15693692K(19626688K), 43.8689486 secs]
[Full GC 18773375K->17516823K(19626688K), 48.8760385 secs]
[Full GC[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor4]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor6]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor5]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor1]
 18773376K->18687101K(19626688K), 46.4858272 secs]
[Full GC 18773376K->18749943K(19626688K), 47.8890817 secs]
[Full GC 18773376K->18767347K(19626688K), 46.2630841 secs]
[Full GC 18773376K->18514858K(19626688K), 53.2457926 secs]
[Full GC 18773375K->18773375K(19626688K), 47.2324559 secs]
[Full GC 18773375K->18702928K(19626688K), 53.6763866 secs]
[Full GC 18773375K->18773375K(19626688K), 46.7614427 secs]
[Full GC 18773375K->18755307K(19626688K), 45.7166066 secs]
[Full GC 18773375K->18773375K(19626688K), 46.9286082 secs]
[Full GC 18773375K->18773375K(19626688K), 45.8308736 secs]
[Full GC 18773375K->18767809K(19626688K), 47.2505160 secs]
[Full GC 18773375K->18772083K(19626688K), 45.8607720 secs]
[Full GC 18773375K->18773375K(19626688K), 46.1099467 secs]
[Full GC 18773375K->18772576K(19626688K), 46.2235117 secs]
[Full GC 18773375K->18773375K(19626688K), 47.2774433 secs]
[Full GC 18773375K->18772879K(19626688K), 45.9341120 secs]
[Full GC 18773375K->18773375K(19626688K), 46.7221784 secs]
[Full GC 18773375K->18773266K(19626688K), 46.5115510 secs]
[Full GC 18773375K->18773375K(19626688K), 46.5279159 secs]
[Full GC 18773375K->18773363K(19626688K), 45.7974061 secs]
[Full GC 18773375K->18773375K(19626688K), 47.2887012 secs]
[Full GC 18773375K->18773375K(19626688K), 47.1369887 secs]
[Full GC 18773375K->145525K(19626688K), 5.0810654 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at aoutomapping.mapping.SubColumnSynonymsStatistic.<init>(SubColumnSynonymsStatistic.java:18)
        at aoutomapping.mapping.SynonymStatisticsBetweenColumns.getSubColumnStatistic(SynonymStatisticsBetweenColumns.java:33)
        at aoutomapping.mapping.TableMapper.makeStat(TableMapper.java:692)
        at aoutomapping.mapping.TableMapper.createMapping(TableMapper.java:444)
        at aoutomapping.mapping.AutoMapping.createMapping(AutoMapping.java:60)
        at aoutomapping.mapping.AutoMapping.main(AutoMapping.java:125)



Первая цифра, как я понимаю, сколько памяти было занято до работы gc, вторая - сколько осталось после, третья - максимальный объем памяти. Судя по распечатке еще остается свободен как минимум 1 GB. Падает на конструкторе SubColumnSynonymsStatistic. В этом классе 4 поля int и один Hashtable, т.е. на его создание не должно вроде бы много памяти уйти (не 1 GB точно). Падает на строчке:

Код

    Hashtable<String, Integer> synonymPairs = new Hashtable<String, Integer>();


Почему оно падает? Т.е. если вычесть из максимального объема памяти объем занятой памяти, то мы не получим сколько памяти еще осталось? Надо учесть что-то еще? Или это по какой-то другой причине вообще?
PM MAIL   Вверх
yuliada
Дата 14.9.2009, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 16.2.2009
Где: Иркутск - San Die go

Репутация: нет
Всего: нет



Эта распечатка от момента при котором происходит попытка добавить очередную порцию данных (которая точно не 1GB занимает) до момента, когда прога падает. Т.е. в этот период ничего очень большого не создается.

Это сообщение отредактировал(а) yuliada - 14.9.2009, 12:37
PM MAIL   Вверх
Andy_L20066
Дата 14.9.2009, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 10.3.2008

Репутация: нет
Всего: 1



хм... попробуй указать программе явно обьем доступной памяти через параметр: -Xmx1024M, думаю должно помочь...

ну я никогда еще не анализировал чего там пишет garbage collector... может память там и остается... но JVM считает что ее недостаточно, я бы посоветовал использовать к примеру JProfiler для поиска проблемных мест в коде, там будет четко видно сколько памяти и какой метод зажирает... и уже потом можно делать выводи, и оптимизировать как-то.
PM MAIL ICQ   Вверх
LSD
Дата 14.9.2009, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Я тут вижу две странности.

1. Сборка мусора всегда начинается при значении занятой памяти 18773376K, хотя еще гиг свободен.

2. Очень странные строчки:
Код

[Full GC 18773375K->18773375K(19626688K), 46.1099467 secs]
[Full GC 18773375K->18772576K(19626688K), 46.2235117 secs]

Т.е. чистили, чистили и в итоге освободили менее килобайта. Но при этом следующая уборка мусора началась с той же отметки, как будто программа памяти и не потребляет.


Последний раз программа очищает просто гигантский объем памяти и очень быстро. Я так понимаю это уже происходит после 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.
PM MAIL WWW   Вверх
yuliada
Дата 15.9.2009, 05:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 16.2.2009
Где: Иркутск - San Die go

Репутация: нет
Всего: нет



Цитата(yuliada @ 14.9.2009,  12:25)
Эта распечатка от момента при котором происходит попытка добавить очередную порцию данных (которая точно не 1GB занимает) до момента, когда прога падает. Т.е. в этот период ничего очень большого не создается.

Оказалось что таки создается. Эта порция оказалось какой-то ненормально большой, хотя предполагалось что таких данных не может попасться. Теперь это проверяется, прога работает.
Цитата(LSD)

1. Сборка мусора всегда начинается при значении занятой памяти 18773376K, хотя еще гиг свободен.

Мне тоже именно это и показалось странным, поэтому я не предположила что там очень много данных в очередной "порции". Эта что-то типа структуры, элементы которой по очереди читаются и создаются (т.е. вот эти SubColumnSynonymsStatistic итп) - эти элементы по отдельности много не занимают и их штук 100 там обычно. Поэтому я думала что gc бы начинал работать не когда 1 GB до конца остается, а позже.

Цитата(LSD)

Последний раз программа очищает просто гигантский объем памяти и очень быстро. Я так понимаю это уже происходит после OutOfMemoryError, да?


Не знаю какая там очередность, но строчка с Exception вываливается позже [Full GC 18773375K->145525K(19626688K), 5.0810654 secs].


Это сообщение отредактировал(а) yuliada - 15.9.2009, 05:41
PM MAIL   Вверх
LSD
Дата 15.9.2009, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(yuliada @  15.9.2009,  05:39 Найти цитируемый пост)
Мне тоже именно это и показалось странным, поэтому я не предположила что там очень много данных в очередной "порции". Эта что-то типа структуры, элементы которой по очереди читаются и создаются (т.е. вот эти SubColumnSynonymsStatistic итп) - эти элементы по отдельности много не занимают и их штук 100 там обычно. Поэтому я думала что gc бы начинал работать не когда 1 GB до конца остается, а позже.

Мне показалось странным, именно то, что цифра 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.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0670 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.