zoukankan      html  css  js  c++  java
  • 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/,这个目录是每天执行一次计划任务的目录,所以说,如果设置了比一天更短的清理时间,它是不起作用的。
  • 相关阅读:
    2.12 使用@DataProvider
    2.11 webdriver中使用 FileUtils ()
    Xcode8 添加PCH文件
    The app icon set "AppIcon" has an unassigned child告警
    Launch Image
    iOS App图标和启动画面尺寸
    iPhone屏幕尺寸、分辨率及适配
    Xcode下载失败 使用已购项目页面再试一次
    could not find developer disk image
    NSDate与 NSString 、long long类型的相互转化
  • 原文地址:https://www.cnblogs.com/yidiandhappy/p/7826383.html
Copyright © 2011-2022 走看看