文章目录
前言:Too many open files说明出现句柄超限
常用命令:
查看当前系统支持打开的最大句柄数:more /proc/sys/fs/file-max
统计各进程打开句柄数:lsof -n|awk ‘{print $2}’|sort |uniq -c|sort -nr
统计各用户打开句柄数:lsof -n|awk ‘{print $3}’|sort |uniq -c|sort -nr
统计各命令打开句柄数:lsof -n|awk ‘{print $1}’|sort |uniq -c|sort -nr
查看当前进程实时打开的文件数:lsof -p 进程PID | wc -l
查看某个进程的句柄数限制:cat /proc/进程ID/limits
查看系统限制的最大文件打开数:cat /proc/sys/fs/file-max
查看系统当前已使用的文件句柄数:cat /proc/sys/fs/file-nr
1、(治标)设置句柄大小
1.1、使用ulimit -a查看最大句柄数限制
1.2、设置句柄数
- 临时设置:ulimit -n 1000000
- 永久设置:vi /etc/security/limits.conf 添加(ubuntu中保存不了)
* soft nofile 65536
* hard nofile 65536
2、(治本)java中HttpClient的java.net.SocketException: Too many open files 解决
- 原因:HttpClient建立Socket时 ,method.releaseConnection()并没有真正关闭连接,而是将该连接提交给 MultiThreadedHttpConnectionManager,等待复用。而http的连接是等待timeout才会自动断开的,因此,当用完系统的句柄后,就会报Too many open files。
- 解决方法:
// 设置关闭
client.getParams().setBooleanParameter( "http.protocol.expect-continue" , false );
// 设置关闭
method.addRequestHeader( "Connection", "close");
// 在finally中释放资源
method.releaseConnection();
- 使用案例
public static void main(String[] args) {
String jdyAppSecret = "sadfgjtdsrewtytre";
byte[] key = jdyAppSecret.getBytes();
String token = JWT.create()
.setPayload("appId", "asdasfgghjhdsdw45654")
.setPayload("userNo", "ewrwe345er456y6ewr345")
.setKey(key)
.sign();
HttpClient client = new HttpClient(new MultiThreadedHttpConnectionManager());//使用连接池技术创建
// region 解決java.net.SocketException: Too many open files
// 设置关闭
client.getParams().setBooleanParameter("http.protocol.expect-continue" , false );
// endregion 解決java.net.SocketException: Too many open files
HttpMethod method = new PostMethod("https://baidu.com/getInfo");
// region 解決java.net.SocketException: Too many open files
//请求头信息中添加关闭连接
method.addRequestHeader("Connection", "close");
// endregion 解決java.net.SocketException: Too many open files
client.getParams().setContentCharset("utf-8");
// 设置header信息,传输XML格式的
method.setRequestHeader("Authorization", token);
try {
client.executeMethod(method);
String body = new String(method.getResponseBodyAsString());
System.out.println(body);
} catch (Exception e) {
System.out.println("报错了......"+e.getMessage());
} finally {
if (null != method) {
// region 解決java.net.SocketException: Too many open files
method.releaseConnection();//释放资源
// endregion 解決java.net.SocketException: Too many open files
}
}
}