我的应用程序定期抛出过多打开的文件:套接字异常。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()。您是否调查过是否会发生这种情况?