我有一个tomcat进程:
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
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
环境信息;
的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
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)
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
UPDATES2
此过程已停留在此状态超过一周,且CPU使用率非常低
答案 0 :(得分:0)
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 e。
中查找线程转储对于3)...根据https://stackoverflow.com/a/2943651/139985,您需要以启动JVM的同一用户身份运行jmap
/ jstack
。它可能不是root
。
对于4)......这可以通过GC不需要运行来解释。
<强>更新强>
SELinux也可能会阻碍。
我担心虽然您可能认为网络配置正确,但在该级别肯定存在问题。 SYN_RECV状态是TCP“三次握手”中的状态,当在网络堆栈中建立连接时发生该状态。 Java不参与该过程。基本上你有很多尝试启动Socket连接的Java线程,但是连接都被卡住了。