有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java jvm挂起并杀死3&jmap失败

我有一个tomcat流程,即:

  1. 所有线程均未运行,所有传入连接都处于同步\u RECV状态
  2. 对kill-3没有反应
  3. jmap和jstack未能连接到它

    sudo -u tomcat /usr/java/jdk1.6.0_45/bin/jmap -heap 19938
    Attaching to process ID 19938, please wait...
    Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process
    
    sudo -u tomcat /usr/java/jdk1.6.0_45/bin/jmap -heap -F 19938
    
    Attaching to process ID 19938, please wait...
    Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process
    
  4. gc stat的输出没有改变,甚至时间戳也没有改变

    sudo -u tomcat /usr/java/jdk1.6.0_45/bin/jstat -gc -t 19938 1000 5
    
    Timestamp        S0C    S1C    S0U    S1U      EC       EU        OC         OU       PC     PU    YGC     YGCT    FGC    FGCT     GCT
           370651.7 33408.0 33536.0  0.0   32416.0 3078592.0 2424720.7 6291456.0   74894.4   262144.0 71831.7     77    8.268   1      0.033    8.301
           370651.7 33408.0 33536.0  0.0   32416.0 3078592.0 2424720.7 6291456.0   74894.4   262144.0 71831.7     77    8.268   1      0.033    8.301
           370651.7 33408.0 33536.0  0.0   32416.0 3078592.0 2424720.7 6291456.0   74894.4   262144.0 71831.7     77    8.268   1      0.033    8.301
           370651.7 33408.0 33536.0  0.0   32416.0 3078592.0 2424720.7 6291456.0   74894.4   262144.0 71831.7     77    8.268   1      0.033    8.301
           370651.7 33408.0 33536.0  0.0   32416.0 3078592.0 2424720.7 6291456.0   74894.4   262144.0 71831.7     77    8.268   1      0.033    8.301
    

环境信息

  1. linux

    Linux xxxx 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
    
  2. jdk

    java version "1.6.0_45"
    Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
    Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)
    
  3. JAVA_选项

    -server -Xms9g -Xmx9g -Xss256k -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+UseParallelGC -XX:ParallelGCThreads=24 -XX:+UseParallelOldGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/tomcatdump  
    -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/tmp/tomcatlog.log -XX:NewSize=3g -XX:MaxNewSize=3g -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
    

更新

连接的SYN_RECV状态是LVS的一个问题,我认为LVS检测到tomcat的异常并将服务切换到其他服务器,导致最后一个ACK交付到另一个服务器,然后这个服务器上的连接将停留在SYN_RECV状态,但我不知道这与jvm有什么关系,这要感谢@Stephen C

更新2

这个进程已经在这个状态上停留了一个多星期,CPU使用率非常低


共 (1) 个答案

  1. # 1 楼答案

    1)。。。这可能是一个网络问题;e、 g.https://serverfault.com/questions/273807/all-connections-from-this-network-get-stuck-in-syn-recv-state-connections-from

    2)不确定。但是请注意,Linux上Tomcat的标准启动脚本将标准输出和标准错误重定向到日志文件。在"catalina.out" log file中查找线程转储

    3)。。。根据https://stackoverflow.com/a/2943651/139985,您需要以启动JVM的同一用户的身份运行jmap/jstack。它可能不是root

    4)。。。这可以用GC不需要运行这一事实来解释


    更新

    SELinux也可能会成为阻碍

    我担心,虽然您可能觉得网络配置正确,但这一级别肯定有问题。SYN_RECV状态是TCP“三方握手”中的一种状态,在网络堆栈中建立连接时发生。Java不参与这个过程。基本上,有很多Java线程试图启动套接字连接,但是连接都被阻塞了