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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зависание ObjectOutputStream, При больших объёмах отсылаемых данных 
:(
    Опции темы
DOKA
Дата 3.7.2007, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Добрый день!

Есть многократно вызывающийся код, который отсылает заданный объект на сервер. Но в некоторых случаях при большом потоке данных клиент зависает на строке "m_oos.writeObject(req);".
Проверил на стороне сервера tcpdump'ом - действительно данные не приходят на сервер.

После зависания, соединение отваливается по таймауту, если подключиться заново, то всё работает нормально до очередного зависания.

Пробовал убрать вызов flush() - не помогает. :(
Из-за чего такое может возникать?

Код

public void execute(Req req) 
        {
            try 
            {
                if (m_oos != null)
                {
                    m_oos.writeObject(req);
                    m_oos.flush();
                }
            }
            catch (IOException e) 
            {
                
            }
        }


Это сообщение отредактировал(а) DOKA - 3.7.2007, 19:21
PM MAIL   Вверх
LSD
Дата 4.7.2007, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Попробуй скачать Jakarta commons-io, и сделать так:
Код
CountingOutputStream countingOutputStream = new CountingOutputStream(socketOutputStream);

А в другом потоке или дебагере переодически читать сколько байт записано в countingOutputStream.

Ну на крайняк - threads dump, что показывает?


--------------------
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   Вверх
DOKA
Дата 6.7.2007, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



C CountingOutputStream надо будет попробовать.

Вот дамп отсылающего треда:
Код


Thread [Thread-2] (Suspended)
    SocketOutputStream.socketWrite0(FileDescriptor, byte[], int, int) line: not available [native method]
    SocketOutputStream.socketWrite(byte[], int, int) line: not available
    SocketOutputStream.write(byte[], int, int) line: not available
    ObjectOutputStream$BlockDataOutputStream.write(byte[], int, int, boolean) line: not available
    ObjectOutputStream.defaultWriteFields(Object, ObjectStreamClass) line: not available
    ObjectOutputStream.writeSerialData(Object, ObjectStreamClass) line: not available
    ObjectOutputStream.writeOrdinaryObject(Object, ObjectStreamClass, boolean) line: not available
    ObjectOutputStream.writeObject0(Object, boolean) line: not available
    ObjectOutputStream.writeObject(Object) line: not available
    netkbd$SendThread.execute(types$Req) line: 430
    netkbd$SendThread(QueueThread).run() line: 79

PM MAIL   Вверх
LSD
Дата 6.7.2007, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Судя по дампу он встал на отправке данных.

Добавлено через 1 минуту и 20 секунд
Есть подозрение, что принимающая сторона не принимает данные.


--------------------
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   Вверх
DOKA
Дата 6.7.2007, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(LSD @ 6.7.2007,  17:13)
Судя по дампу он встал на отправке данных.

Добавлено @ 17:14
Есть подозрение, что принимающая сторона не принимает данные.

Вроде все файерволы отключены... tcpdump на сервере не отслеживает пакетов. Потеря их - исключена: компьютеры соединены кросовером напрямую.

Попробую ещё проверить не на Windows --> Linux, а на Linux --> Linux, может у винды какая-нибудь своя заморочка. smile
PM MAIL   Вверх
COVD
Дата 6.7.2007, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

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



Я бы сначала посмотрел на доступную приложениям память (клиент и сервер) и как себя ведет gc. Когда он включается (full gc) , то все останавливается. 

Что значит "соединение отваливается по таймауту"? Внутренний таймаут сокета около 2 часов. Или у вас есть поток, который закрывает соединение в отсутствии данных?

Еще есть особенность записи обьектов в ObjectOutputStream. Обычно в примерах после отправки одного или нескольких обьектов выходной поток закрывается (oos.close()). Вот пример с java.sun :

 
Код

     ObjectOutputStream oos = new ObjectOutputStream(fos);

    oos.writeInt(12345);
    oos.writeObject("Today");
    oos.writeObject(new Date());

    oos.close();


Если хотите повторно использовать стрим, то вместо close() делайте reset() (а не flush) :

Цитата

Reset will disregard the state of any objects already written to the stream. The state is reset to be the same as a new ObjectOutputStream.


Это сообщение отредактировал(а) COVD - 8.7.2007, 07:08
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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