解决java调试工具无法连接jvm

转载自 http://www.pigg.co/java-debug-tools-can-not-connect-jvm.html

今日对线上tomcat做jstack时发现如下异常

Unable to open socket file: target process not responding or HotSpot VM not loaded

后来尝试不同的jdk版本发现tomcat在1.6.24版本以下的jmap,jstack都无法操作,而在1.6.18版本可以执行jmap,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,我们查看这个文件

    vim /etc/cron.daily/tmpwatch
    
    flags=-umc
    /usr/sbin/tmpwatch "$flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix \
    -x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix \
    -X '/tmp/hsperfdata_*' 30d /tmp
    /usr/sbin/tmpwatch "$flags" 720 /var/tmp
    for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do
    if [ -d "$d" ]; then
    /usr/sbin/tmpwatch "$flags" -f 720 "$d"
    fi
    done

    这里第四行是新增的,表示系统每天会用tmpwatch命令检查并删除/tmp下超过30天未访问的文件和目录.

  2. 修改tomcat的Djava.io.tmpdir参数,统一使用/tmp目录,修改catalina.sh添加CATALINA_TMPDIR=/tmp即可.

  3. 最后一种就是升级至java 6 update 25,但java 7是否有此问题并没有验证,毕竟开发与生产环境都是java 6,有兴趣的朋友可以尝试后给我留言.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值