HttpUrlConnection泄漏套接字带有“无法识别协议”错误消息:即使在关闭输入流和断开套接字之后

时间:2012-02-02 14:46:58

标签: java linux groovy

我的应用程序定期抛出太多Open文件:Socket Exception。 Lsof命令显示有许多已断开的套接字具有“无法识别协议”消息。所以,我认为套接字/流不会被关闭,即使我正在按照

中的建议在最后一个块中进行清理

Seeing too many lsof can't identify protocol

Java app with URLConnection leads "Too many open files"

这是我的代码:

    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 个答案:

答案 0 :(得分:2)

我不知道这是否完全在目标上,但听起来很相似。

JRE中存在一个问题,直到JRE7才解决。我不知道该修复程序最终是否已经向后移植到6,这不是我最后一次检查。如果您将主机名传递给Socket并且它抛出UnknownHostException套接字将泄漏文件描述符,直到垃圾收集器收集了死套接字对象,则会出现错误。解决方法是手动解析主机名并为套接字提供IP地址或升级JRE。

我找不到具有确切修复版本的Oracle错误数据库中的原始错误报告。

答案 1 :(得分:0)

在你的finally块中,如果urlStream.close()扔了IOException,你就不会调用urlConnection.disconnect()。你有没有调查过,看看是否会发生这种情况?