我的应用程序定期抛出太多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()
}
}
在这里寻求帮助。谢谢!
答案 0 :(得分:2)
我不知道这是否完全在目标上,但听起来很相似。
JRE中存在一个问题,直到JRE7才解决。我不知道该修复程序最终是否已经向后移植到6,这不是我最后一次检查。如果您将主机名传递给Socket并且它抛出UnknownHostException
套接字将泄漏文件描述符,直到垃圾收集器收集了死套接字对象,则会出现错误。解决方法是手动解析主机名并为套接字提供IP地址或升级JRE。
我找不到具有确切修复版本的Oracle错误数据库中的原始错误报告。
答案 1 :(得分:0)
在你的finally块中,如果urlStream.close()
扔了IOException
,你就不会调用urlConnection.disconnect()。你有没有调查过,看看是否会发生这种情况?