心态决定命运
分类: 系统运维
2016-07-20 09:09:11
转自://
今日对线上tomcat做jstack时发现如下异常
点击(此处)折叠或打开
jvm运行时会生成一个目录hsperfdata_$USER($USER是启动java进程的用户),在linux中默认是/tmp,目录下会有些pid文件,存放jvm进程信息,而jmap,jstack等工具会读取/tmp/hsperfdata_$USER下的pid文件获取连接信息.
知道这个原因后,我马上检查了/tmp/hsperfdata_root目录,果然没有pid对应的文件,但在$TOMCAT_HOME目录中的temp目录中有对应的文件.
解决方案
通过google与实验,发现以下三种方式均可解决问题
1. 从报错信息中我们可以看到,由于java进程的pid文件删除了,所以工具找不到对应的文件,但为什么会被删除呢?这是由于linux操作系统为了防止/tmp目录文件过多,有个删除管理机制tmpwatch,我们查看这个文件
点击(此处)折叠或打开
点击(此处)折叠或打开
3. 修改tomcat的Djava.io.tmpdir参数,统一使用/tmp目录,修改catalina.sh添加CATALINA_TMPDIR=/tmp即可.3.
这里第四行是新增的,表示系统每天会用tmpwatch命令检查并删除/tmp下超过30天未访问的文件和目录.
4. 最后一种就是升级至java 6 update 25,但java 7是否有此问题并没有验证,毕竟开发与生产环境都是java 6,有兴趣的朋友可以尝试后给我留言.