jvm溢出不动了,jmap无法导出hprof
neptune
2013-05-10
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 100.00 100.00 100.00 50.86 244 46.568 149 8659.363 8705.930 jvm直接就不动了。 jmap -dump:format=b,file=test.bin 568 856: 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 无法导出,加了-F的参数也不行。有没有什么好办法,可以把堆内存的对象导出来吗? |
|
RednaxelaFX
2013-05-10
CPU吃满了所以无法响应了。但-F也不行这个比较糟糕⋯这样的话就算gdb也应该连不上(jmap -F是基于Serviceability Agent的,底下用的是ptrace跟gdb一样。)
-F多试几次⋯呗。另外试试看pstack能不能连上。 JVM版本和启动参数发一下 |
|
neptune
2013-05-11
RednaxelaFX 写道 CPU吃满了所以无法响应了。但-F也不行这个比较糟糕⋯这样的话就算gdb也应该连不上(jmap -F是基于Serviceability Agent的,底下用的是ptrace跟gdb一样。)
-F多试几次⋯呗。另外试试看pstack能不能连上。 JVM版本和启动参数发一下 java version "1.6.0_32" Java(TM) SE Runtime Environment (build 1.6.0_32-b05) Java HotSpot(TM) 64-Bit Server VM (build 20.7-b02, mixed mode) -server -Djava.awt.headless=true -Xmx8g -Xms8g -Xmn3g -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+UseParNewGC -XX:ParallelGCThreads=23 -XX:MaxTenuringThreshold=4 -XX:SurvivorRatio=1 -XX:TargetSurvivorRatio=70 -XX:+UseConcMarkSweepGC -XX:ConcGCThreads=6 -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -XX:+CMSParallelRemarkEnabled -XX:+CMSScavengeBeforeRemark -XX:CMSMaxAbortablePrecleanTime=1000 -XX:CMSFullGCsBeforeCompaction=0 -XX:+UseCMSCompactAtFullCollection -XX:+UseCompressedOops -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintHeapAtGC -Xloggc:/java_log/tomcat_gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:+DisableExplicitGC -XX:HeapDumpPath=/heap_dump -XX:ErrorFile=/java_log/tomcat_java_error.log 运行了一晚上总于生成了一个3.3G的hprof文件,用MAT看了一下基本知道问题的原因了,是通过ThreadWithAttributes(tomcat的线程对象)看到的问题原因,可能是使用了-F的参数原因,在MAT中没有直观的看见大量的相同对象。 生产环节JDK6U32,中jstat看到结果: S0 S1 E O P YGC YGCT FGC FGCT GCT 0.00 100.00 100.00 100.00 50.86 244 46.568 149 8659.363 8705.930 在JDK6U45中(测试环境)也做了相同的操作: heap的各个区域增长的也非常的快,但到最后还是会恢复到正常了,难道是我的测试压力不够,还是jdk6u32的版本有什么bug. |
|
RednaxelaFX
2013-05-11
JDK6u45针对HotSpot VM的bugfix只有安全相关的,应该没啥新的GC相关bugfix才对⋯
|
|
anglestudio
2013-06-10
为什么老年代和永久带满了呢?回收了那么多次
|
|
neptune
2013-06-19
这段时间比较忙,现在有点空,问题解决如下:
-F 在负载均衡的一台机器上,执行成功了,但执行了4个多小时。 用MAT看后发现如下,造成100% 1.有一个同事,写的程序不靠谱,一个List持有20万行对象。 2.另一个同事,设置了fetchSize=20000(使用Oracle11g的驱动),造成了oracle11g分配为connection分配的defineBytes和defineChars属性合起来有128M多。这段代码刚上线,使用的人比较多,连接池中的连接对象都是128m。大家一定要小心oracle驱动的fetchSize设置。 这些问题比较隐秘,要不是写了个Connection和PreparedStatement的监控程序,还真的不能被发现呀。 |