2011-03-24 59 views
4

我們最近有一種情況,生產計算機因大量線程轉儲而關閉。它是樹脂網絡服務器,它給了'全線程轉儲Java HotSpot(TM)64位服務器虛擬機(14.0-b16混合模式):'。Bizzare線程塊創建原始數組

有大量的BLOCKED線程,但它們讓我感到困惑。即,一個是這樣的:

"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) 

凡串的碼有

return new String(data); 

那些看起來像被阻擋的陌生地方。

任何人都可以提出一個原因,這些電話會被阻止?

感謝, -kal

+0

它阻塞「新」,所以這可能是由內部內存管理或垃圾收集器造成的。這可能是因爲內存不足(內存不足異常不會引發延遲)。 – josefx 2011-03-24 17:16:32

回答

2

這聽起來像這種方法可以稱爲很多,併產生大量的垃圾。當GC運行這些方法時,分配對象在等待GC時可能顯示爲阻塞。

我會嘗試更新的JVM。例如Java 6更新24(具有JVM版本19或20),因爲您似乎擁有較舊的JVM。