灵通163百科在线-实用的手机,证券免费资源网站

您现在的位置:首页 > K-JAVA资源 > JAVA软件工具 >

Java长期运行后, jps等工具无法连接jvm

教程来源:www.lt163.com     点击数:     更新时间:2017-11-18 02:07

  相信很多朋友都遇见过, 一个Java应用长期运行后, 发现jps, jstack, jstat等工具都无法连接正在运行的jvm了。 如果这个时候发生故障, 非常难以诊断。 一直以来, 我都以为是Java的bug.

  最近偶然得知, jps的工作模式是读取了系统临时文件夹下的pid文件里的内容获得连接信息的。 这个文件夹在Linux下的名字是:/tmp/hsperfdata_$USER ($USER是启动Java程序的用户)。 我们都知道系统临时文件夹可能会被某些临时文件夹工具自动删除, 比如:

  1. tmpwatch:  redhat linux发行版使用的删除工具

  2. tmpreaper: ubuntu linux 发行版使用的删除工具

  这些工具可能是没有安装的。 那么就不会发生删除/tmp/hsperfdata_$USER的事情。

  我们观察到, redhat5.2/5.3 的删除工具的存在一些瑕疵, tmpwatch -umc 会按照最长时间来确定删除。看看umc参数定义:

  Java代码

  -----------------------------------

  If the --atime, --ctime or --mtime options are used in combination, the decision about deleting a file will be based on the maximum of these times.

  -----------------------------------

  -u, --atime

  Make the decision about deleting a file based on the file's atime (access time). This is the default.

  Note that the periodic updatedb file system scans keep the atime of directories recent.

  -m, --mtime

z  Make the decision about deleting a file based on the file's mtime (modification time) instead of the atime.

  -c, --ctime

  Make the decision about deleting a file based on the file's ctime (inode change time) instead of the atime;  for

  directories, make the decision based on the mtime.

z  -----------------------------------

  我们看到, -c 参数是使用文件的inode改变时间。 这就意味着三个参数结合使用, 最后其实仅仅是 -c 参数发挥了作用。

  以上的解释比较废话, 其实发生问题关键原因是java进程的数据文件被删除了。 这些工具其实都能实现删除文件的时候排除某些文件/文件夹的功能。 这样就能避免发生错误删除。 比如排除/tmp/hsperfdata_$USER 文件夹。 我们作了点小小的测试:

  1. 如果java程序是正常退出, /tmp/hsperfdata_$USER/$JAVA_PID 文件是能被正常清理

  2. 如果java程序是非正常退出, 比如使用kill -9 等办法, 那么pid文件将会残留在目录里。 但是, 如果你执行任意一次java命令, 或者加载了jvm程序的命令(比如jps, javac, jstat), 所有无用的pid文件都能被正确的清理。

  一句话, jvm能够自己管理/tmp/hsperfdata_$USER 下的文件有效性。 不用担心残留pid文件过多的情况。

  附录

  redhat修改文件:

  /etc/cron.daily/tmpwatch

  tmpwatch shell 写道

  flags=-umc

  /usr/sbin/tmpwatch "$flags" -x /tmp/hsperfdata_$YOUR_USER_NAME -x /tmp/.X11-unix -x /tmp/.XIM-unix \

  -x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix 240 /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"

没有相关教程
UC浏览器 最先进实用的手机端浏览器,最大限度节省页面浏览流量,点击下载
老虎地图 绿色纯免费GPS定位省流量的最佳手机地图,点击下载
网秦手机安全系列 手机杀毒防盗,防火墙,构建手机安全,点击进入
塞班精品游戏 最流行最给力的塞班S60免签名名精品游戏合集,点击进入
阿里通 手机上轻松拨打网络电话和收发短信,高音质超省话费,资费标准
爱科手机电话 国内最好的手机网络电话领先品牌,价格低廉,点击查看
愤怒的小鸟2 全民挑战超流行休闲游戏力推新作-愤怒的小鸟2,点击查看
魔力旺旺 淘宝卖家首选的交易工具

资源下载排行
文章阅读排行