powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
16 сообщений из 16, страница 1 из 1
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
    #38776775
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос навеян вопросом с собеседования:

Собственно в сабже уже есть ответ. Но непонятно почему. Ведь потоки используют общий хип вроде как....

Да и если возникает error, что по определению значит, что jvm плохо - почему остальные потоки отлично продолжат работать?
...
Рейтинг: 0 / 0
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
    #38776867
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner ,
А почему они должны умереть? То есть, какое конкретное действие потока должно приводить к его "смерти"?
...
Рейтинг: 0 / 0
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
    #38776884
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

OutOfMemoryError возникает в ситуации когда поток пытается резервировать для себя память. Будь то куча, стэк, или пермген\метаспэйс. Операция резервирования памяти обрыгивается и выкидывается исключение.
Другие потоки при этом могут не требовать новой памяти и продолжать работать. Могут резервировать меньшее количество памяти и тоже продолжать работать.
OutOfMemoryError при желании можно отловить и продолжить работу текущего потока тоже.
...
Рейтинг: 0 / 0
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
    #38777164
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

как-то у меня другое представление об OutOfMemory. Ну и ответ на вопрос "Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ? " мне кажется "не все так однозначно" ( C ).

Как я понимаю (для обычных GC) OutOfMemory возникает. когда GC не смог освободить память дольше определенного времени. Лично на нашей (практический опыт) системе, если был OutOfMemory, то "поздно пить боржоми, когда почки отвалились". Heap забит под завязку.

AFAIK поведением по выкидыванию OutOfMemory можно управлять. Можно выставить параметр для GC и OutOfMemory вообще никогда не будет, GC будет до посинения пытаться память выделить. (сам не делал)

IMHO & AFAIK & по практическому опыту настройки GC на продакшене и борьбе с OutOfMemory
...
Рейтинг: 0 / 0
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
    #38777174
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsevкак-то у меня другое представление об OutOfMemory.

Ну, так нужно его формировать далее.

Leonid KudryavtsevНу и ответ на вопрос "Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ? " мне кажется "не все так однозначно" ( C).
ОК. Опиши тогда сценарий при котром второй поток умрет.

Leonid KudryavtsevКак я понимаю (для обычных GC) OutOfMemory возникает. когда GC не смог освободить память дольше определенного времени. Лично на нашей (практический опыт) системе, если был OutOfMemory, то "поздно пить боржоми, когда почки отвалились". Heap забит под завязку.
Во-первых нет никаких обычных и не обычных GC. Есть разные GC. И у разных GC поведение может отличатся.
Во-вторых OutOfMemoryError не обязательно связан с кучей.
В-третих, OutOfMemoryError кучи вылетает не только по таймауту работы сборки мусора, но и на пример при достижении лимита размера куча, а нам тут резко понадобилась сотня мегабайт для бинарника. GC отработал. Таймаута небыло. Свободного места тоже.

Leonid KudryavtsevAFAIK поведением по выкидыванию OutOfMemory можно управлять. Можно выставить параметр для GC и OutOfMemory вообще никогда не будет, GC будет до посинения пытаться память выделить. (сам не делал)
Не будет по таймауту. Ещё не означает что не будет вообще.
...
Рейтинг: 0 / 0
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
    #38777963
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerВопрос навеян вопросом с собеседования:

Собственно в сабже уже есть ответ. Но непонятно почему. Ведь потоки используют общий хип вроде как....

Да и если возникает error, что по определению значит, что jvm плохо - почему остальные потоки отлично продолжат работать?


Хип они используют общий.
А стеки разные.
И при выбрасывании исключения разматывается именно стек.
...
Рейтинг: 0 / 0
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
    #38778056
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivquestionerВопрос навеян вопросом с собеседования:

Собственно в сабже уже есть ответ. Но непонятно почему. Ведь потоки используют общий хип вроде как....

Да и если возникает error, что по определению значит, что jvm плохо - почему остальные потоки отлично продолжат работать?


Хип они используют общий.
А стеки разные.
И при выбрасывании исключения разматывается именно стек.

не понял как разматывание стека связано с OutOfMemory?

разматывание это последовательный выброс элементов?
...
Рейтинг: 0 / 0
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
    #38778089
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz. ...Есть разные GC. И у разных GC поведение может отличатся...
...Во-вторых OutOfMemoryError не обязательно связан с кучей....
В-третих, OutOfMemoryError кучи вылетает не только по таймауту работы сборки мусора, но и на пример при достижении лимита размера куча, а нам тут резко понадобилась сотня мегабайт для бинарника. GC отработал. Таймаута небыло. Свободного места тоже.

Это понятно. Что разные, разные настройки, подробности и детали нужно смотреть в доках. Ровно это я и так же и имел в виду. Т.к. х.з. какой GC на конкретной JVM, на конкретном проекте будет использоваться и детали поведения там при окончании памяти.

А с чем еще? PermGen, стек? Просто я сталкивался исключительно с кучей.

Как можно данную ошибку корректно отработать и зачем, лично я не представляю. Но на мой взгляд, subj топика можно перефразировать так "почему второй поток и система может не умереть....". Системы спроектированные по принципе "может не умереть, а может умереть. как повезет" - imho нафиг. Лучше стараться нормально проектировать и нормально конфигурировать JVM, а не что бы система на пределе возможностей работала и потом задавать такие вопросы на собеседовании. IMHO & AFAIK
...
Рейтинг: 0 / 0
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
    #38778091
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Полез в И-нет, первая попавшаяся статься:
http://habrahabr.ru/post/117274/

Out of memory, GC overhead limit... - по логике, мы должны были именно ovehead limit получать, но падало по out of memory. Возможно просто поведение разных версий. Как можно обработать данную ошибку корректно - лично я не представляю. Если утечка не у нас, а в соседнем потоке, то фиг обработаешь и смысла такой обработки нет IMHO.

Out of permGen - и часто для приложению не известна потребность в permGen'е? Настройте нормально JVM и не мучайтесь с subj. Обрабатывать имеет смысл только в узком классе приложений.

unable to create new native thread - то же круто. Обычно в приложениях, которые плодят множество потоков, ставят ограничение на макс. кол-во потоков на уровне приложения (пример Oracle, параметр processes). Иначе и не то, что JVM, а и ОС можно наглухо загрузить и повесить. Явно ошибка проектирования.

IMHO
...
Рейтинг: 0 / 0
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
    #38778186
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevКак можно данную ошибку корректно отработать и зачем, лично я не представляю. Но на мой взгляд, subj топика можно перефразировать так "почему второй поток и система может не умереть....". Системы спроектированные по принципе "может не умереть, а может умереть. как повезет" - imho нафиг. Лучше стараться нормально проектировать и нормально конфигурировать JVM, а не что бы система на пределе возможностей работала и потом задавать такие вопросы на собеседовании. IMHO & AFAIK
А мне тут же на форуме буквально год-два рассказывали. Польза, оказывается, бывает в Android. Так как при отображении картинок сложно сказать хватит ли памяти. И всегда можно огрести OOME в неожиданном месте в связи с этим. Таким образом иногда лучше поймкать и сказать, ой у вас картинка не влезла, чем завалить всё приложение и отказать в дальнейшей его работе пользователю.
...
Рейтинг: 0 / 0
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
    #38778189
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevПолез в И-нет, первая попавшаяся статься:
IMHO
Вопрос был не в том нужно или не нужно ловить OOME. Вопрос был в том влияет ли OOME на другие потоки.
...
Рейтинг: 0 / 0
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
    #38778422
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerMasterZivпропущено...



Хип они используют общий.
А стеки разные.
И при выбрасывании исключения разматывается именно стек.

не понял как разматывание стека связано с OutOfMemory?

разматывание это последовательный выброс элементов?
а я не понял как исключение в одном потоке связанно с завершением других потоков .

расскажи как ты дошел до такой мысли .
...
Рейтинг: 0 / 0
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
    #38778749
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivquestionerпропущено...


не понял как разматывание стека связано с OutOfMemory?

разматывание это последовательный выброс элементов?
а я не понял как исключение в одном потоке связанно с завершением других потоков .

расскажи как ты дошел до такой мысли .

Я думал, что OOM это проблема нехватики памяти в хипе, а хип у потоков общий.

Как выяснилось из обсужденя это не обязательно проблема нехватки памяти в хипе, а может быть проблема нехватки памяти в стэке, или пермген\метаспэйс(слабо понимаю что это за сущности, но не важно)

И ещё важное, что я понял из ответов, что это может быть не проблема того, что памяти мало, а того, что у одного из потов слишком большие запросы. Собственно, если у других потоков запросы поскромнее, то им вполне может хватить этой памяти и ничего не будет.
...
Рейтинг: 0 / 0
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
    #38778766
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerЯ думал, что OOM это проблема нехватики памяти в хипе, а хип у потоков общий.

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

questioner...в стэке, или пермген\метаспэйс(слабо понимаю что это за сущности, но не важно)
Фига себе "не важно".

questionerИ ещё важное, что я понял из ответов, что это может быть не проблема того, что памяти мало, а того, что у одного из потов слишком большие запросы. Собственно, если у других потоков запросы поскромнее, то им вполне может хватить этой памяти и ничего не будет.
Да.
...
Рейтинг: 0 / 0
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
    #38778785
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner, мало начальных условий.

К примеру популярный вопрос - сколько Java поддерживает потоков имеет ответ
в стиле Одессы. - А сколько у вас heap? Где-то звучала цифра - 10Мб на поток.

Вобщем если хип закончился то конструктор нового потока обломится. Это
будет положительный ответ на ваш вопрос? думаю да.

Если хип закончился в процессе работы двух потоков - тогда думаю
надо анализировать ситуацию глубже. Смотреть как run() реализован.
...
Рейтинг: 0 / 0
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
    #38778788
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonК примеру популярный вопрос - сколько Java поддерживает потоков имеет ответ
в стиле Одессы. - А сколько у вас heap? Где-то звучала цифра - 10Мб на поток.

Вобщем если хип закончился то конструктор нового потока обломится. Это
будет положительный ответ на ваш вопрос? думаю да.

Если хип закончился в процессе работы двух потоков - тогда думаю
надо анализировать ситуацию глубже. Смотреть как run() реализован.
Чет я не понял зачем ты стэк с кучей перемешал. Память для стэка на поток выделяется вне кучи же.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]