HttpUrlConnection Утечка сокетов с сообщением об ошибке «Не удается определить протокол»: даже после закрытия входного потока и отключения сокета - PullRequest
3 голосов
/ 02 февраля 2012

Мое приложение периодически выдает слишком много открытых файлов: исключение Socket. Команда Lsof показывает, что существует много сломанных сокетов с сообщением «Не удается определить протокол». Итак, я думаю, что сокет / поток не закрываются, хотя я делаю очистку в последнем блоке, как предложено в

Если слишком много lsof не может определить протокол

Java-приложение с URLConnection приводит "Слишком много открытых файлов"

Вот мой код:

    private static Map<String, List<String>>getResponseHeaders (URL url) throws IOException {
        InputStream urlStream = null
        URLConnection urlConnection = null

        try{
            urlConnection = (HttpURLConnection)url.openConnection()
            urlConnection.setAllowUserInteraction(false)
            urlConnection.setRequestProperty("User-Agent", "Agent-123")
            urlConnection.setConnectTimeout(10000)
            urlConnection.setReadTimeout(15000)
            urlStream = urlConnection.inputStream
            return urlConnection.getHeaderFields()
        }catch (IOException ex){
             log.info( "Could not open the connection for url "+url +" error msg "+ex.message)
             throw ex
        }finally {
           if(urlStream){
              urlStream.close()
           }
           if(urlConnection){
               urlConnection.disconnect()
           }
     }

Нужна помощь здесь. Спасибо!

Ответы [ 2 ]

2 голосов
/ 03 февраля 2012

Я не знаю, полностью ли это на цели, но звучит похоже.

Была проблема в JRE, которая не была устранена до JRE7.Я не знаю, было ли исправлено исправление до 6 в конце концов, это был не последний раз, когда я проверял.Ошибка обнаружилась, если вы передали имя хоста в Socket, и он выбросил UnknownHostException сокет, который утечет файловый дескриптор, пока сборщик мусора не соберет мертвый объект сокета.Обходной путь заключается в том, что вы разрешаете имя хоста вручную и вместо этого назначаете сокету IP-адрес или обновляете JRE.

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

0 голосов
/ 02 февраля 2012

В вашем блоке finally, если urlStream.close() сгенерирует IOException, вы не вызовете urlConnection.disconnect ().Вы исследовали, чтобы видеть, могло ли это случиться?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...