|
|
|
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
|
|||
|---|---|---|---|
|
#18+
Вопрос навеян вопросом с собеседования: Собственно в сабже уже есть ответ. Но непонятно почему. Ведь потоки используют общий хип вроде как.... Да и если возникает error, что по определению значит, что jvm плохо - почему остальные потоки отлично продолжат работать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2014, 00:41 |
|
||
|
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
|
|||
|---|---|---|---|
|
#18+
questioner , А почему они должны умереть? То есть, какое конкретное действие потока должно приводить к его "смерти"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2014, 08:32 |
|
||
|
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
|
|||
|---|---|---|---|
|
#18+
questioner, OutOfMemoryError возникает в ситуации когда поток пытается резервировать для себя память. Будь то куча, стэк, или пермген\метаспэйс. Операция резервирования памяти обрыгивается и выкидывается исключение. Другие потоки при этом могут не требовать новой памяти и продолжать работать. Могут резервировать меньшее количество памяти и тоже продолжать работать. OutOfMemoryError при желании можно отловить и продолжить работу текущего потока тоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2014, 09:01 |
|
||
|
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, как-то у меня другое представление об OutOfMemory. Ну и ответ на вопрос "Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ? " мне кажется "не все так однозначно" ( C ). Как я понимаю (для обычных GC) OutOfMemory возникает. когда GC не смог освободить память дольше определенного времени. Лично на нашей (практический опыт) системе, если был OutOfMemory, то "поздно пить боржоми, когда почки отвалились". Heap забит под завязку. AFAIK поведением по выкидыванию OutOfMemory можно управлять. Можно выставить параметр для GC и OutOfMemory вообще никогда не будет, GC будет до посинения пытаться память выделить. (сам не делал) IMHO & AFAIK & по практическому опыту настройки GC на продакшене и борьбе с OutOfMemory ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2014, 12:30 |
|
||
|
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
|
|||
|---|---|---|---|
|
#18+
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 будет до посинения пытаться память выделить. (сам не делал) Не будет по таймауту. Ещё не означает что не будет вообще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2014, 12:37 |
|
||
|
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
|
|||
|---|---|---|---|
|
#18+
questionerВопрос навеян вопросом с собеседования: Собственно в сабже уже есть ответ. Но непонятно почему. Ведь потоки используют общий хип вроде как.... Да и если возникает error, что по определению значит, что jvm плохо - почему остальные потоки отлично продолжат работать? Хип они используют общий. А стеки разные. И при выбрасывании исключения разматывается именно стек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2014, 20:46 |
|
||
|
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
|
|||
|---|---|---|---|
|
#18+
MasterZivquestionerВопрос навеян вопросом с собеседования: Собственно в сабже уже есть ответ. Но непонятно почему. Ведь потоки используют общий хип вроде как.... Да и если возникает error, что по определению значит, что jvm плохо - почему остальные потоки отлично продолжат работать? Хип они используют общий. А стеки разные. И при выбрасывании исключения разматывается именно стек. не понял как разматывание стека связано с OutOfMemory? разматывание это последовательный выброс элементов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2014, 23:32 |
|
||
|
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz. ...Есть разные GC. И у разных GC поведение может отличатся... ...Во-вторых OutOfMemoryError не обязательно связан с кучей.... В-третих, OutOfMemoryError кучи вылетает не только по таймауту работы сборки мусора, но и на пример при достижении лимита размера куча, а нам тут резко понадобилась сотня мегабайт для бинарника. GC отработал. Таймаута небыло. Свободного места тоже. Это понятно. Что разные, разные настройки, подробности и детали нужно смотреть в доках. Ровно это я и так же и имел в виду. Т.к. х.з. какой GC на конкретной JVM, на конкретном проекте будет использоваться и детали поведения там при окончании памяти. А с чем еще? PermGen, стек? Просто я сталкивался исключительно с кучей. Как можно данную ошибку корректно отработать и зачем, лично я не представляю. Но на мой взгляд, subj топика можно перефразировать так "почему второй поток и система может не умереть....". Системы спроектированные по принципе "может не умереть, а может умереть. как повезет" - imho нафиг. Лучше стараться нормально проектировать и нормально конфигурировать JVM, а не что бы система на пределе возможностей работала и потом задавать такие вопросы на собеседовании. IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2014, 02:32 |
|
||
|
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
|
|||
|---|---|---|---|
|
#18+
Полез в И-нет, первая попавшаяся статься: 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2014, 02:44 |
|
||
|
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevКак можно данную ошибку корректно отработать и зачем, лично я не представляю. Но на мой взгляд, subj топика можно перефразировать так "почему второй поток и система может не умереть....". Системы спроектированные по принципе "может не умереть, а может умереть. как повезет" - imho нафиг. Лучше стараться нормально проектировать и нормально конфигурировать JVM, а не что бы система на пределе возможностей работала и потом задавать такие вопросы на собеседовании. IMHO & AFAIK А мне тут же на форуме буквально год-два рассказывали. Польза, оказывается, бывает в Android. Так как при отображении картинок сложно сказать хватит ли памяти. И всегда можно огрести OOME в неожиданном месте в связи с этим. Таким образом иногда лучше поймкать и сказать, ой у вас картинка не влезла, чем завалить всё приложение и отказать в дальнейшей его работе пользователю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2014, 09:10 |
|
||
|
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevПолез в И-нет, первая попавшаяся статься: IMHO Вопрос был не в том нужно или не нужно ловить OOME. Вопрос был в том влияет ли OOME на другие потоки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2014, 09:12 |
|
||
|
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
|
|||
|---|---|---|---|
|
#18+
questionerMasterZivпропущено... Хип они используют общий. А стеки разные. И при выбрасывании исключения разматывается именно стек. не понял как разматывание стека связано с OutOfMemory? разматывание это последовательный выброс элементов? а я не понял как исключение в одном потоке связанно с завершением других потоков . расскажи как ты дошел до такой мысли . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2014, 12:15 |
|
||
|
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
|
|||
|---|---|---|---|
|
#18+
MasterZivquestionerпропущено... не понял как разматывание стека связано с OutOfMemory? разматывание это последовательный выброс элементов? а я не понял как исключение в одном потоке связанно с завершением других потоков . расскажи как ты дошел до такой мысли . Я думал, что OOM это проблема нехватики памяти в хипе, а хип у потоков общий. Как выяснилось из обсужденя это не обязательно проблема нехватки памяти в хипе, а может быть проблема нехватки памяти в стэке, или пермген\метаспэйс(слабо понимаю что это за сущности, но не важно) И ещё важное, что я понял из ответов, что это может быть не проблема того, что памяти мало, а того, что у одного из потов слишком большие запросы. Собственно, если у других потоков запросы поскромнее, то им вполне может хватить этой памяти и ничего не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2014, 15:18 |
|
||
|
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
|
|||
|---|---|---|---|
|
#18+
questionerЯ думал, что OOM это проблема нехватики памяти в хипе, а хип у потоков общий. Не все потокам одновременно нужно захватить больше памяти в куче. Некоторым это не нужно вообще. Другим нужно но не достаточно много для ошибки. К тому же, если жадный поток умирает (а OMME обычно не ловят), зачастую, куча всего в хипе освобождается. questioner...в стэке, или пермген\метаспэйс(слабо понимаю что это за сущности, но не важно) Фига себе "не важно". questionerИ ещё важное, что я понял из ответов, что это может быть не проблема того, что памяти мало, а того, что у одного из потов слишком большие запросы. Собственно, если у других потоков запросы поскромнее, то им вполне может хватить этой памяти и ничего не будет. Да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2014, 15:28 |
|
||
|
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
|
|||
|---|---|---|---|
|
#18+
questioner, мало начальных условий. К примеру популярный вопрос - сколько Java поддерживает потоков имеет ответ в стиле Одессы. - А сколько у вас heap? Где-то звучала цифра - 10Мб на поток. Вобщем если хип закончился то конструктор нового потока обломится. Это будет положительный ответ на ваш вопрос? думаю да. Если хип закончился в процессе работы двух потоков - тогда думаю надо анализировать ситуацию глубже. Смотреть как run() реализован. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2014, 15:42 |
|
||
|
Почему второй поток не умрёт если в первом вылетит OutOfMemoryError ?
|
|||
|---|---|---|---|
|
#18+
maytonК примеру популярный вопрос - сколько Java поддерживает потоков имеет ответ в стиле Одессы. - А сколько у вас heap? Где-то звучала цифра - 10Мб на поток. Вобщем если хип закончился то конструктор нового потока обломится. Это будет положительный ответ на ваш вопрос? думаю да. Если хип закончился в процессе работы двух потоков - тогда думаю надо анализировать ситуацию глубже. Смотреть как run() реализован. Чет я не понял зачем ты стэк с кучей перемешал. Память для стэка на поток выделяется вне кучи же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2014, 15:46 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38778422&tid=2126441]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
163ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
72ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 497ms |

| 0 / 0 |
