HttpUrl连接泄漏套接字,并显示"Can't identify protocol"错误消息:即使在关闭输入流并断开套接字后



我的应用程序定期抛出过多打开的文件:套接字异常。Lsof命令显示有许多断开的套接字带有"无法识别协议"的消息。所以,我认为不知何故,套接字/流并没有被关闭,即使我正在中建议的最后一个块中进行清理

看到太多lsof can';t识别协议

具有URLConnection线索的Java应用程序";打开的文件太多"

这是我的代码:

    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()
           }
     }

在这里寻求帮助。谢谢

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

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

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

在您的finally块中,如果urlStream.close()抛出IOException,则不会调用urlConnection.disconnect()。您是否调查过是否会发生这种情况?

最新更新