奇怪的线程块创建原始数组

时间:2011-03-24 17:04:44

标签: java thread-safety deadlock blocking resin

我们最近遇到了生产机器发生大规模线程转储的情况。它是树脂网络服务器,它提供了'全线程转储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

1 个答案:

答案 0 :(得分:2)

听起来这个方法可能被称为很多,并产生大量垃圾。当GC运行这些方法时,分配对象在等待GC时似乎是阻塞的。

我会尝试更新的JVM。例如Java 6更新24(其中包含JVM内部版本19或20),因为您似乎拥有较旧的JVM。