Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Чат, тотальное зависание машины


Автор: Platon 24.5.2007, 15:41
Здравствуйте, уважаемые.

Ни за что бы не подумал, что на Java можно схватить такой косяк.
Дело в том что все работало прекрасно до поры до времени, время шло, я тихонько расширял возможности и в какой то момент возникла проблема, при подключении удаленного клиента (т.е. не с локал-хоста, не со своего IP по локальной сети, или со своего глобального IP), а именно с чужой машины. Удивительно наблюдать картину, когда сервер виснет не как обычно подгружая процессор под 100% а просто остановив работу виндов напрочь, это что такое? неужели на Java ручками загребущими можно и до такого довести?

Проверял работу сервера на 2-х машинах из них обе jvm 1.6, 1 jvm 1.5.

Результаты всегда одинаковы, сервер благополучно проводит аутентификацию, а дальше виснет...

Автор: shimopus 24.5.2007, 17:22
вообще "виснуть" понятие растяжимое.... Что именно происходит? Чем поведение отличается от загрузки проца на 100%?

Автор: Platon 24.5.2007, 17:36
Вообще останавливается работа, можно сказать глобальный дед-лок, мышка никак не вращается, и экран застывает (может не так выразился) мышка не двигается совсем, никаких действий выполнить нельзя, все процессы останавливаются, только reset.

Добавлено @ 17:37
OS Windows XP

Автор: Vurn 24.5.2007, 18:25
При работе всегда делай отдельный тред на GUI (via invokeLater) и отдельный тред сокет-слушателя (который будет notify тред-обработки сообщений)
Таким образом у тебя будет 3 треда как минимум - GUI, socket-listener, обработчик. И программа никогда не будет виснуть.

Автор: Platon 24.5.2007, 18:35
Vurn, 
Извиняюсь конечно, но я уже писал, что у меня не виснет, а умирает вообще ОС.

2. ГУИ на сервере редко бывает, и у меня его нет.
3. и естественно что у меня каждое соединение клиентов уходит по тредам.

не пойму что может вызвать вывод из строя всю ОСку?

Добавлено @ 18:43
МОжет надо permssion policy прикрутить? Мало ли по умолчанию запрещен доступ с нелокальной машины, хотя повторюсь, до поры до времени работало.

Автор: Platon 25.5.2007, 07:48
Новые подробности. Решил после зависания тачки на другом компе побаловаться, что он будет делать, мало ли серв не сдох, пишу, нет не работает, но самое что удивительное после 3 отправленных сообщений и клиент умер, причем умер так же как и сервер, т.е. парализовало всю ОС. вот те и на...

Автор: shimopus 25.5.2007, 12:16
Думаю, что Javа тут не при чем. Скорее всего создается слишком большое количество потоков, из за чего JVM вытягивает все ресурсы системы. На 90% ошибка в коде.

Автор: Platon 26.5.2007, 00:00
Цитата(shimopus @  25.5.2007,  12:16 Найти цитируемый пост)
На 90% ошибка в коде. 

К счастью я видать такой уникальный, что попадаю в 10 % ;)

Думаю что тему стоит вообще затереть, бесполезная ветка, прошу прощения.
Оказалось проблема была в ОС "виндовоз", после переустановки запускается отлично. 
Я сразу настаивал на вопросе "Может ли Java привести к тотальной остановке ОС?" не зависанию, а именно остановке.

Цитата(shimopus @  25.5.2007,  12:16 Найти цитируемый пост)
Скорее всего создается слишком большое количество потоков


Проверял на 3500 одновременных запросах провести авторизацию, вроде все отлично, НО конечно в данном случае скидка, что авторизация идет с локальной машины, но с другой стороны, это как минимум 7000 потоков.


Автор: shimopus 26.5.2007, 10:19
Цитата(Platon @  26.5.2007,  01:00 Найти цитируемый пост)
после переустановки запускается отлично. 

Интересно, а как же машина клиента, которая тоже беспросветно умирала? Или он тоже запускался на твоей машине? 

Автор: Platon 28.5.2007, 08:42
Тоже интересно, но скорее всего обе машины были инфицированы, больше вариантов не нахожу.
Вчера попробовал протестировать, попросил друзей в пределах города подключиться, целый день проболтали, все работало отлично.

Автор: Platon 29.5.2007, 20:14
Мда, не прошло и 2-х дней та же история :( ну это же нереально! я не могу поверить что проблема в моем коде, слишком сильное влияние чата на ОС, такое полагаю можно сделать только на системном уровне, но никак не прикладном.

Автор: shimopus 29.5.2007, 22:12
А может это и делается на системном... JVM явно пользуется системными вызовами. Например для частичной реализации многопоточности...

Автор: Platon 29.5.2007, 22:31
Да, но я полагаю JVM бережет ОС от несанкционированных действий. А как же объяснить что 2 дня чат поработал и опять его заклинило? Что Java системно обращается скажем по четным дням к одним системным вызовам, по нечетным к другим? Обидно так получается, весело будет если я еще 2 дня подожду и опять заработает. я понимаю, когда сразу не работает, но через 2 дня?

Цитата(shimopus @  29.5.2007,  22:12 Найти цитируемый пост)
JVM явно пользуется системными вызовами

конечно не хочется сваливать, но это либо ОС либо JVM.

Автор: Ortega 30.5.2007, 09:26
Судя по симптоматике (особенно - зависание через двое суток работы) - имеет место быть дед-лок. Хотя не исключено, что плодятся неубиенные потоки. Но дед-лок вероятнее.
Java достаточно защищена от "дурака" (без обид, просто термин), но абсолютной защиты, как известно не существует. Посмотри внимательно на метки synchronized, скорее всего они где-то  перекрываются. Говорю из собственного опыта, в свое время убил не один час на поиски этой гадости.

Автор: LSD 30.5.2007, 12:16
Цитата(Platon @  26.5.2007,  01:00 Найти цитируемый пост)
Проверял на 3500 одновременных запросах провести авторизацию, вроде все отлично, НО конечно в данном случае скидка, что авторизация идет с локальной машины, но с другой стороны, это как минимум 7000 потоков.

Ахренеть smile 
Неудивительно что ОС подвисала от такого количества потоков. Если в приложении создается больше 20-30 потоков, то это верный признак того, что оно неправильно спроектировано.

Автор: Platon 30.5.2007, 19:42
Ну что вы все не поймете? Я который день говорю, что это не может быть дед-лок.
не 2 суток бесперестанной работы, а просто 2 суток, 1 день полностью беседовали, вырубил комп, второй день серв в холостую проработал. Третий день, полдня поработал, кто-то ко мне приконнектился, и все, комп умер.

при 3,5 тысячах потоках объем памяти сервера не превысил 30 мБ, и комп чувствовал себя бодренько, так что зря вы так.

С синхронизацией я тоже разобрался, было время что не работало, но неработало, в плане того что в поток несколько писателей было. Я с дед-локами встречался, но они производили локальную остановку, но чтоб всю ОС, это как то импосибл.

Автор: Platon 30.5.2007, 20:09
Вот у меня иногда такие мессаги в любой проге вылетают в консоли IDEA:

Код

Connected to the target VM, address: '127.0.0.1:4804', transport: 'socket'
Disconnected from the target VM, address: '127.0.0.1:4804', transport: 'socket'
ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
JDWP exit error AGENT_ERROR_NO_JNI_ENV(183):  [../../../src/share/back/util.c:820]

Process finished with exit code 0


не к добру это....

Автор: batigoal 31.5.2007, 10:15
У насэто сообщение было связано с использованием нативного кода. Когда перешли с Java 1.4 на 1.6, где поменялся API JVM, то имели это сообщение.

Автор: Platon 5.6.2007, 12:25
Не хочется опять искать виноватых, но похоже проблема заключается в том, что после установки обновлений винды возникает такой эффект.

Автор: GSMD 14.6.2007, 15:24
Стоит попробовать установить под тем же Linux для исключения момента влияния ОС.

Автор: Platon 5.12.2007, 21:52
Вот еще 1 пример полного зависания системы.
http://www.chessclub.com/helpcenter/interface/CoffeeHouse.html
Вылечивается только кнопкой reset.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)