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


    Unable to open socket file: target process not responding or HotSpot VM not loaded
    The -F option can be used when the target process is not responding
     
    在用jstack工具查看jvm线程的运行情况时出现上述错误。就是因为该进程长时间没有启停,在/tmp/hsperfdata_'username'/文件夹下的该进程文件被Linux自身的机制(tmp下面不能存放很多文件)删除,需重新启停。所以要注意/etc/cron.daily/tmpwatch改文件在生产的情况。否则出现内存泄漏,或者内存溢出时,很难排查,或者出现系统运行缓慢时,想要观察系统运行情况也没办法,再或者,想把现场保存至dump文件中,等待大神解决也不能做。
    解决办法:
     
    对线上服务器的java应用dump操作时发现,以下报错,不能dump。jps也获取不到java进程的pid。
    # jmap -dump:file=/data/dump/jvm_en.hprof 20176
    20176: Unable to open socket file: target process not responding or HotSpot VM not loaded
    The -F option can be used when the target process is not responding
    重启后,jps可以获得该java进程的pid,jstack也可以dump线程。
    而tomcat:
    jdk1.6.24版本下的,jps、jstack都无法操作
    jdk1.6.18版本可以执行jps、jstack。
    二、原因分析
    jvm运行时会生成一个目录hsperfdata_$USER($USER是启动java进程的用户),在linux中默认是/tmp。目录下会有些pid文件,存放jvm进程信息。
    jps、jstack等工具读取/tmp/hsperfdata_$USER下的pid文件获取连接信息。
    2.1jstack报错原因
    jstack报错:Unable to open socket file。是因为这个java进程的pid文件删除了。
    为什么会被删除呢?这是因为linux操作系统为了防止/tmp目录文件过多,有个删除管理机制:tmpwatch。
    查看关键配置/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 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" fi done
    系统每天会用tmpwatch命令检查并删除 /tmp 下超过240小时未访问过的文件和目录。
    2.2高版本jps、jstack不能工作原因
    这是一个从Java 6 update 21 引入的bug sunbug 7009828,在Java 6 update 25修复。具体原因是:
    jdk16_21/24开始,jvm启动时产生进程号的临时文件目录优先使用-Djava.io.tmpdir指定的目录,没有指定-Djava.io.tmpdir参数才使用/tmp/hsperfdata_$USER。
    正好tomcat指定了-Djava.io.tmpdir=${tomcat_home}/tmp/。而jps、jstack从/tmp/hsperfdata_$USER目录读取不到pid信息,所以才报错。
    三、解决办法
    3.1 修改tmpwatch设置
    排查对应的/tmp/hsperfdata_*的目录,让jvm自己来管理,保证jps,jstat等命令可用。
    修改/etc/cron.daily/tmpwatch
    /usr/sbin/tmpwatch "$flags" -x /tmp/hsperfdata_* -x /tmp/.X11-unix -x /tmp/.XIM-unix
    -x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix 240 /tmp
    3.2 修改tomcat配置或者升级jdk
    1)修改tomcat的Djava.io.tmpdir参数,统一使用/tmp目录。
    修改catalina.sh添加
    CATALINA_TMPDIR=/tmp
    重启tomcat
    2)升级jdk到Java 6 update 25.
    3.3 其他java程序重启
    重启java进程,重新生成pid文件。
    参考URl:
    另外说明:
    1、在JDK 64bit 1.7.0_01版本也出现了这个问题。
    2、在CentOS6以后,/etc/cron.daily/tmpwatch有所改变
    #! /bin/sh 
    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_*' 10d /tmp 
    /usr/sbin/tmpwatch "$flags" 30d /var/tmp 
    for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do 
    if [ -d "$d" ]; then 
    /usr/sbin/tmpwatch "$flags" -f 30d "$d" 
    fi 
    done
    上面红色字体就是新加入的。
    目录/etc/cron.daily/,这个目录是每天执行一次计划任务的目录,所以说,如果设置了比一天更短的清理时间,它是不起作用的。
  • 相关阅读:
    xPath用法
    http post 接口
    关于WSSE验证-- 一种验证用户的方法
    java资源文件解读
    dom4j读取xml
    docker安装mysql
    php.ini配置max_execution_time和FPM配置request_terminate_timeout
    《高德拉特约束理论》
    Python爬虫-播报天气信息(生成exe文件)待续
    pyhon-爬虫实战抓取豆瓣top250到mysql
  • 原文地址:https://www.cnblogs.com/yidiandhappy/p/7826383.html
Copyright © 2020-2023  润新知