2014-09-02 47 views
1

我看到這個線程在我的jstack中看起來並沒有移動。任何關於如何弄清楚爲什麼卡住的指針?我沒有看到任何鎖或任何東西,唯一可疑的是「Object.wait()」引用。如何弄清爲什麼線卡死?

"main" prio=10 tid=0x00007f3a8000b000 nid=0x942 in Object.wait() [0x00007f3a89539000] 
    java.lang.Thread.State: RUNNABLE 
     at org.joda.time.DateTimeZone.<clinit>(DateTimeZone.java:95) 
     at org.joda.time.format.DateTimeFormatter.withZoneUTC(DateTimeFormatter.java:301) 
     at com.amazonaws.auth.AWS4Signer.<clinit>(AWS4Signer.java:44) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:525) 
     at java.lang.Class.newInstance0(Class.java:372) 
     at java.lang.Class.newInstance(Class.java:325) 
     at com.amazonaws.auth.SignerFactory.createSigner(SignerFactory.java:121) 
     at com.amazonaws.auth.SignerFactory.lookupAndCreateSigner(SignerFactory.java:107) 
     at com.amazonaws.auth.SignerFactory.getSigner(SignerFactory.java:80) 
     at com.amazonaws.AmazonWebServiceClient.computeSignerByServiceRegion(AmazonWebServiceClient.java:311) 
     at com.amazonaws.AmazonWebServiceClient.computeSignerByURI(AmazonWebServiceClient.java:284) 
     at com.amazonaws.AmazonWebServiceClient.setEndpoint(AmazonWebServiceClient.java:160) 

而且,在堆棧的頂部DateTimeZone.java線95是這樣的:

public static final DateTimeZone UTC = new FixedDateTimeZone("UTC", "UTC", 0, 0); 

還有另外一個線程也停留在一個相似的地方:

"FeatureManagerService" daemon prio=10 tid=0x00007f3a8056a800 nid=0x94f in Object.wait() [0x00007f3a84151000] 
    java.lang.Thread.State: RUNNABLE 
     at com.amazonaws.util.DateUtils.<clinit>(DateUtils.java:35) 
     at com.amazonaws.services.s3.internal.ServiceUtils.<clinit>(ServiceUtils.java:59) 
     at com.amazonaws.services.s3.internal.S3Signer.sign(S3Signer.java:123) 
     at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:348) 
     at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:245) 
     at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3711) 
     at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3664) 
     at com.amazonaws.services.s3.AmazonS3Client.listObjects(AmazonS3Client.java:620) 
     at com.amazonaws.services.s3.AmazonS3Client.listObjects(AmazonS3Client.java:603) 

並且DateUtils.java:35是:

private static final DateTimeZone GMT = new FixedDateTimeZone("GMT", "GMT", 0, 0); 

我已經試着用jvisualvm/jhat進行調查,但並沒有真正走得很遠。

請注意,這是一個實時進程,而不是我在本地調試器中運行的,在重新啓動後它工作正常,因此它似乎是間歇性的。

任何幫助,將不勝感激!

謝謝!

更新使用jstack混合模式似乎給一些更深入的瞭解 - 這是等待一個調用pthread_cond_wait:

----------------- 2370 ----------------- 
0x00007f3a89115414  __pthread_cond_wait + 0xc4 
0x00007f3a8833a03c  _ZN13ObjectMonitor4waitElbP6Thread + 0x7dc 
0x00007f3a88117fbb  _ZN13instanceKlass15initialize_implE19instanceKlassHandleP6Thread + 0x36b 
0x00007f3a881182ca  _ZN13instanceKlass10initializeEP6Thread + 0x6a 
0x00007f3a8814d3f3  _ZN18InterpreterRuntime4_newEP10JavaThreadP19constantPoolOopDesci + 0x143 
0x00007f3a7d01d9ee  * org.joda.time.DateTimeZone.<clinit>() bci:0 line:95 (Interpreted frame) 
0x00007f3a7d0004f7  <StubRoutines> 
... 
+0

有任何其他線程處理?有線程轉儲? – ssnobody 2014-09-02 15:55:50

+0

還有其他一些線索 - 我應該尋找什麼? – naumcho 2014-09-02 16:04:07

+0

@ssnobody在創建FixedDateTimeZone之前發現另一個線程被卡住了 – naumcho 2014-09-02 16:15:59

回答

0

也許這不是卡住了。它只是在一個循環中調用新的DateTimeZone(),構造函數會進行一些計算。每次查看此線程時,它都位於DateTimeZone()內部 - 但每次都是不同的DateTimeZone()。

然後被丟棄。發生在我身上的不少次數。

+0

你完全正確,這就是有時會發生的情況,但通常你可以通過變量的地址來判斷,在這種情況下地址保持不變,這讓我覺得它不是一個循環。好主意,但。 – naumcho 2014-09-02 17:39:59

0

正如@naumcho發現的,這被證明是一個錯誤(https://github.com/JodaOrg/joda-time/issues/171)。

根據提供的信息(兩個不同線程+源代碼行的堆棧跟蹤),可能會懷疑發生死鎖,因爲兩個線程都試圖實例化一個新類型相同的對象FixedDateTimeZone

下一步確認將使用GDB檢查圍繞__pthread_cond_wait()的堆棧幀。

相關問題