Java 性能优化实战记录(2)---句柄泄漏和监控
前言: Java不存在内存泄漏, 但存在过期引用以及资源泄漏. (个人看法, 请大牛指正)
这边对文件句柄泄漏的场景进行下模拟, 并对此做下简单的分析.
如下代码为模拟一个服务进程, 忽略了句柄关闭, 造成不能继续正常服务的小场景.
public class FileHandleLeakExample {
public static String readContentFromFile(String filename) {
StringBuilder sb = new StringBuilder();
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(filename));
String line = null;
while ( (line = br.readLine()) != null ) {
sb.append(line).append("\n");
}
} catch (Exception e) {
System.err.println(e.getMessage());
exit(1);
} finally {
// 模拟疏忽关掉句柄的操作
// try {
// br.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
}
return sb.toString();
}
public static void main(String[] args) {
while ( true ) {
FileHandleLeakExample.readContentFromFile("1.txt");
}
}
}
/*
输入结果如下:
1.txt (Too many open files)
*/
句柄泄漏导致, 进程服务达到系统设置的上限, 进而导致不可服务状态. 这就需要必要的监控了.
如何监控或者如何在测试阶段能提前发现呢?
在linux中, 一切皆句柄, 比如file, socket都是, 每个进程都有自己的上限, 一旦超过这个上限,系统就会限制并拒绝相应的资源请求.
这个设定如下所示:
ulimit -a # ulimit -n 列出open file的个数

由此可见系统对于一般进程的文件句柄上限为 1024.
但对上面那个java进程进行观察, 却发现如下不一致的地方,如下所示:
jps #列出java进程的pid列表
cd /proc/<pid>/fd #通过linux的虚拟文件系统,进入该java进程的系统信息
ls | wc -l #统计其总开打开的文件句柄数

其拥有的句柄个数4095与系统限制的句柄数上限1024相差太远, 这是什么情况?
实际上系统的限制, 分为两种,一种为soft limit, 另一种为hard limit, soft limit相当于一个warning, 而hard limit系统则不允许超越.
执行如下命令:
ulimit -a -H # ulimit -n -H 列出open file的句柄数

现在系统的open file 4096的上限与java进程拥有的句柄数4095保持了一致.
关于soft limit和hard limit的区别, 请参阅如下链接:
http://blog.163.com/zhangjie_0303/blog/static/9908270620112233523316/
对于文件句柄数, 还可以借用lsof命令来查阅
lsof -p <pid>
Java 性能优化实战记录(2)---句柄泄漏和监控的更多相关文章
- Java 性能优化实战记录(3)--JVM OOM的分析和原因追查
前言: C/C++的程序员渴望Java的自由, Java程序员期许C/C++的约束. 其实那里都是围城, 外面的人想进来, 里面的人想出去. 背景: 作为Java程序员, 除了享受垃圾回收机制带来的便 ...
- Java 性能优化实战记录(1)---定位并分析耗cpu最多的线程
1) jps 列出相关的java进程, 以及对应的pid 也可以使用如下命令来尝试 ps aux | grep java --color 2) top -Hp <pid> ...
- 推荐:Java性能优化系列集锦
Java性能问题一直困扰着广大程序员,由于平台复杂性,要定位问题,找出其根源确实很难.随着10多年Java平台的改进以及新出现的多核多处理器,Java软件的性能和扩展性已经今非昔比了.现代JVM持续演 ...
- 《Java性能优化权威指南》
<Java性能优化权威指南> 基本信息 原书名:Java performance 原出版社: Addison-Wesley Professional 作者: (美)Charlie Hunt ...
- JVM——九大工具助你玩转Java性能优化
本文转载自 http://www.importnew.com/12324.html 本文由 ImportNew - 陈 晓舜 翻译自 idrsolutions.欢迎加入翻译小组.转载请参见文章末尾的要 ...
- Java性能优化,操作系统内核性能调优,JYM优化,Tomcat调优
文章目录 Java性能优化 尽量在合适的场合使用单例 尽量避免随意使用静态变量 尽量避免过多过常地创建Java对象 尽量使用final修饰符 尽量使用局部变量 尽量处理好包装类型和基本类型两者的使用场 ...
- 我把阿里、腾讯、字节跳动、美团等Android性能优化实战整合成了一个PDF文档
安卓开发大军浩浩荡荡,经过近十年的发展,Android技术优化日异月新,如今Android 11.0 已经发布,Android系统性能也已经非常流畅,可以在体验上完全媲美iOS. 但是,到了各大厂商手 ...
- 网站性能优化实战——从12.67s到1.06s的故事
文章摘自https://juejin.im/post/5b0b7d74518825158e173a0c 作为互联网项目,最重要的便是用户体验.在举国“互联网+”的热潮中,用户至上也已经被大多数企业所接 ...
- 44个Java性能优化
44个Java性能优化 首先,代码优化的目标是: 减小代码的体积 提高代码运行效率 代码优化细节 1 .尽量指定类.方法的final修饰符 带有final修饰符的类是不可派生的.在Java核心AP ...
随机推荐
- 创建缓存文件(。php)
public function user_dengji(){ $this->sdb->select('groupid,grouptitle'); $query ...
- 使用 JavaScript 修改浏览器 URL 地址栏
现在的浏览器里,有一个十分有趣的功能,你可以在不刷新页面的情况下修改浏览器URL;在浏览过程中.你可以将浏览历史储存起来,当你在浏览器点击后退按钮的时候,你可以冲浏览历史上获得回退的信息,这听起来并不 ...
- java.util.ResourceBundle使用详解(转)
java.util.ResourceBundle使用详解 一.认识国际化资源文件 这个类提供软件国际化的捷径.通过此类,可以使您所编写的程序可以: 轻松地本地化或翻译成不同的 ...
- jsp作用域
1.page: JSP页面内所有实例的默认作用域都是page,仅限于本页面使用 2.request: 同一次请求所涉及的服务器资源(可能是页面.Servlet等),例如,程序使用<jsp:for ...
- oracle数据库常用SQL语句(11.29更新)
笔者日常工作中常用到的sql语句,现总结如下,留作日后查看. 1.按照两列中的最大值取 ,只取两列其中的一列 SELECT * FROM t_doc T ORDER BY GREATEST(T.Loa ...
- java基础之hashmap
Hashmap是一种非常常用的.应用广泛的数据类型,最近研究到相关的内容,就正好复习一下.网上关于hashmap的文章很多,但到底是自己学习的总结,就发出来跟大家一起分享,一起讨论. 1.hashma ...
- SharePoint 2013 Nintex Workflow 工作流帮助(十一)
博客地址 http://blog.csdn.net/foxdave 工作流动作 27. Create item in another site(Libraries and lists分组) 该操作用于 ...
- word表格从 web版视图 转 到页面视图 模式后 表格的一部分显示不出来
解决办法 在web视图 中选择 表格 ----->右键 表格属性 表格 下面 的 文字环绕 选择 无
- centos下安装node js
#wget http://nodejs.org/dist/v0.10.24/node-v0.10.24.tar.gz #tar xf node-v0.10.24.tar.gz #cd node-v0. ...
- php的数据访问
方法一:过去时方法 $定义一个变量 = $mysql_connect("要连接的服务器,默认是 localhost","登录所使用的用户名,默认是 root", ...