我们最近遇到了生产机器发生大规模线程转储的情况。它是树脂网络服务器,它提供了'全线程转储Java HotSpot(TM)64位服务器VM(14.0-b16混合模式):'。
有大量的BLOCKED线程,但它们让我很困惑。 IE,一个就像:
"resin-8576" daemon prio=10 tid=0x00007f871827b800 nid=0x6b5 waiting for monitor entry [0x00007f864a7e6000]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.lang.String.toCharArray(String.java:2725)
at java.lang.Thread.setName(Thread.java:1051)
at com.caucho.server.port.TcpConnection.run(TcpConnection.java:605)
at com.caucho.util.ThreadPool$Item.runTasks(ThreadPool.java:730)
at com.caucho.util.ThreadPool$Item.run(ThreadPool.java:649)
at java.lang.Thread.run(Thread.java:619)
那里的代码是
char result[] = new char[count];
另一个就像
"resin-8574" daemon prio=10 tid=0x00007f8718277800 nid=0x6b3 waiting for monitor entry [0x00007f864a9e8000]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.lang.String.valueOf(String.java:2840)
at java.lang.Thread.getName(Thread.java:1061)
at com.caucho.server.port.TcpConnection.run(TcpConnection.java:603)
at com.caucho.util.ThreadPool$Item.runTasks(ThreadPool.java:730)
at com.caucho.util.ThreadPool$Item.run(ThreadPool.java:649)
at java.lang.Thread.run(Thread.java:619)
其中String的代码是
return new String(data);
这些似乎是被封锁的奇怪地方。
有人能说出这些电话会阻塞的原因吗?
谢谢, -kal
答案 0 :(得分:2)
听起来这个方法可能被称为很多,并产生大量垃圾。当GC运行这些方法时,分配对象在等待GC时似乎是阻塞的。
我会尝试更新的JVM。例如Java 6更新24(其中包含JVM内部版本19或20),因为您似乎拥有较旧的JVM。