2014-09-02 2 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) 

Кроме того, линия 95 в DateTimeZone.java в верхней части стека это:

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, но на самом деле не очень далеко.

Обратите внимание, что это живой процесс, а не то, что я запускаю в своем отладчике локально, и после перезапуска он работает нормально, поэтому он кажется прерывистым.

Любая помощь будет оценена!

Спасибо!

Update используя смешанный режим в 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

+0

Есть еще несколько тем - что я должен искать? – naumcho

+0

@ssnobody нашел еще одну цепочку, застрявшую перед созданием FixedDateTimeZone – naumcho

ответ

0

Может быть, это не пристало. Это просто вызов новой DateTimeZone() в цикле, и конструктор выполняет некоторые вычисления. Каждый раз, когда вы смотрите на этот поток, он находится внутри DateTimeZone(), но каждый раз он отличается от DateTimeZone().

Которая затем отбрасывается. Случилось со мной несколько раз.

+0

. Вы совершенно правы, что это иногда происходит, но вы обычно можете сказать по адресу переменной и в этом случае адрес остается таким же, что заставляет меня думать, что это не цикл. Хорошая идея. – naumcho

0

Как найдено @naumcho, это оказалось ошибкой (https://github.com/JodaOrg/joda-time/issues/171).

Основываясь на предоставленной информации (трассировки стека двух разных нитей + исходная строка), можно было заподозрить тупик, потому что оба потока пытаются создать экземпляр нового объекта того же типа FixedDateTimeZone.

Следующий шаг, чтобы подтвердить, что использовать GDB для проверки кадров стека вокруг __pthread_cond_wait().

Смежные вопросы