powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Зависание сетевого вызова после долгой работы программы.
8 сообщений из 8, страница 1 из 1
Зависание сетевого вызова после долгой работы программы.
    #38493655
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть программа типа сетевого паука- скачивает огромное количество мелких файлов.
Через несколько часов (7-8 конкретно) работы она намертво зависает в вызове метода openStream в классе java.net.URL.
Конкретно - lookupAllHostAddr класса java.net.Inet6AddressImpl

jconsole показывает плавный рост памяти от 0.9Гб до 1.2Гб с сборками мусора каждый полтора часа.

Как локализовать эту проблему? Что смотреть надо? Может просто как-то мониторить процессы и жёстко рубить их?

ubunta 13.10
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)

--
Алексей.
...
Рейтинг: 0 / 0
Зависание сетевого вызова после долгой работы программы.
    #38493790
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, код:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
        String urlStr;
        URL url = new URL(urlStr);
        BufferedInputStream origin = new BufferedInputStream(((HttpURLConnection) url.openConnection()).getInputStream());
        if (origin != null) {
            try {
                ...........
            } finally {
                origin.close();
            }
        } else {
            return null;
        }
...
Рейтинг: 0 / 0
Зависание сетевого вызова после долгой работы программы.
    #38494296
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А теперь правильный ответ :)

Код: sql
1.
2.
3.
4.
5.
6.
        BufferedInputStream origin = new BufferedInputStream(((HttpURLConnection) url.openConnection()).getInputStream());
        try {
            ...........
        } finally {
             origin.close();
        }



Если адрес левый (что у меня бывает), то коннект будет не закрыт, сокет потерян.
Если сокеты закончатся- то любая операция зависает.
Как-то так...
...
Рейтинг: 0 / 0
Зависание сетевого вызова после долгой работы программы.
    #38494304
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может всё-таки результат url.openConnection() закрывать?
...
Рейтинг: 0 / 0
Зависание сетевого вызова после долгой работы программы.
    #38494399
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имхо, вот этот код надо как минимум в try засунуть.

BufferedInputStream origin = new BufferedInputStream(((HttpURLConnection) url.openConnection()).getInputStream());
...
Рейтинг: 0 / 0
Зависание сетевого вызова после долгой работы программы.
    #38495206
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лагманможет всё-таки результат url.openConnection() закрывать?

О том я и написал.
Правильно писать так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    HttpURLConnection con = (HttpURLConnection) url.openConnection();
    try {
        BufferedInputStream origin = new BufferedInputStream(con.getInputStream());
    } catch (IOException e) {
        con.disconnect();
        thtow e;
    }
    try {
        ...........
    } finally {
         origin.close(); <-- это закроет в т.к. conn, так что делать  disconnect не надо!
    }



Что не мешает существовать, например, методу openStream в классе URL. Причём там обработки ошибок нет, и если URL приводит к 404, то использование openStream гарантировано приводит к утечкам памяти. Вот такие забавные методы есть в JDK!
...
Рейтинг: 0 / 0
Зависание сетевого вызова после долгой работы программы.
    #38495218
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominЧто не мешает существовать, например, методу openStream в классе URL. Причём там обработки ошибок нет, и если URL приводит к 404, то использование openStream гарантировано приводит к утечкам памяти. Вот такие забавные методы есть в JDK!
Не понял наезда. Можно побольше конкретики. Что утекает? Connection? Дык он в приведенном коде не во всех сценариях закрывается. Или что не так?
...
Рейтинг: 0 / 0
Зависание сетевого вызова после долгой работы программы.
    #38495330
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczAlexey TominЧто не мешает существовать, например, методу openStream в классе URL. Причём там обработки ошибок нет, и если URL приводит к 404, то использование openStream гарантировано приводит к утечкам памяти. Вот такие забавные методы есть в JDK!
Не понял наезда. Можно побольше конкретики. Что утекает? Connection? Дык он в приведенном коде не во всех сценариях закрывается. Или что не так?

В последнем приведённом коде- сокет закрывается во всех случаях. Т.к. close() у BufferedInputStream делает не только close у InputStream, но и disconnect у HttpURLConnection. Проверено практикой- 10 часов по 40 запросов в секунду отработало, не подавилось (1.5 миллиона раз). Из них порядка процента 404 получал.

Но если при попытке создания InputStream будет exception, то надо закрывать HttpURLConnection руками. А это невозможно при использовании URL.openStream()
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Зависание сетевого вызова после долгой работы программы.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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