Как выяснить, почему нить застряла?
Я вижу эту ветку в моем 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, но на самом деле не очень далеко.
Обратите внимание, что это живой процесс, а не то, что я запускаю в своем отладчике локально, и после перезапуска он работает нормально, поэтому он кажется прерывистым.
Любая помощь будет оценена!
Спасибо!
Обновление с использованием смешанного режима в 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>
...
2 ответа
Может быть, это не застряло. Это просто вызов нового DateTimeZone() в цикле, и конструктор выполняет некоторые вычисления. Каждый раз, когда вы смотрите на этот поток, он находится внутри DateTimeZone(), но каждый раз это другой DateTimeZone().
Который затем отбрасывается. Случалось со мной довольно много раз.
Как обнаружил @naumcho, это оказалось ошибкой ( https://github.com/JodaOrg/joda-time/issues/171).
На основании предоставленной информации (следы стека двух разных потоков + исходная строка) можно было бы предположить взаимоблокировку, поскольку оба потока пытаются создать новый объект того же типа. FixedDateTimeZone
,
Следующим шагом для подтверждения будет использование GDB для проверки кадров стека __pthread_cond_wait()
,