java - jvm hang and kill -3 & jmap 失败

标签 java tomcat garbage-collection jvm java-6

我有一个 tomcat 进程是:

  1. 所有线程都没有运行,所有传入连接都停留在 SYNC_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_OPTS

    -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) ... 这可能是网络问题;例如https://serverfault.com/questions/273807/all-connections-from-this-network-get-stuck-in-syn-recv-state-connections-from .

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

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

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


更新

SELinux 也有可能成为障碍。

恐怕在您看来网络配置正确,但在那个级别肯定有问题。 SYN_RECV 状态是 TCP“3 次握手”中的一种状态,发生在网络堆栈中建立连接时。 Java 不参与该过程。基本上,您有许多尝试启动套接字连接的 Java 线程,但连接都被卡住了。

关于java - jvm hang and kill -3 & jmap 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28739600/

相关文章:

java - Xstream 创建类并导致痛苦的永久集合

java - 通过可分割的槽 Activity 获取特定领域

java - 处理大量大型 jpg

java - Ant 构建 : Some input files use or override a deprecated API

java - 如何区分实现和规范

tomcat - java.util.concurrent.ExecutionException : java. lang.OutOfMemoryError: tomcat 中的 PermGen 空间

java - 如何使用 Avro (schemaRegistry) 对 Kafka Streams 进行功能测试?

java - java如何选择最强的密码在jsse中使用?

java - 每次加载图像时堆都会增长

javascript - 如何在 Chrome 中查找未被销毁但已被 GC 处理的 Javascript 对象?