まず、お使いのWebアプリケーションサーバのPIDを見つける:あなたはtomcatのより別のサーバを実行している場合、またはあなたが実行している複数のインスタンスを持っている場合
ps aux | grep tomcat
は、コマンドを調整します。その後
、ファイルにそのサーバーのすべてのスレッドをダンプ:
jstack 12345 > jstack.txt
12345は、あなたが最初のステップで見つかったPIDです。
次に、バンドルのソースコードを見て、サービスアクティベータを探します。それは、典型的には、次のようになりますの
package fr.free.nrw;
[import section]
public class ServiceActivator implements BundleActivator {
private ServiceRegistration registration;
@Override
public void start(BundleContext context) throws Exception {
registration = context.registerService(
MyService.class.getName(), new MyServiceImpl(), null);
}
@Override
public void stop(BundleContext context) throws Exception {
registration.unregister();
}
}
をメモ:
- 名前空間、
- クラス名、
- 停止方法名。彼らは
fr.free.nrw
、ServiceActivator
とstop
、およびこれら3からフルネームfr.free.nrw.ServiceActivator.stop
を取得している上記の例では、例えば
。
jstack.txt
を開き、フルネームを検索してください。ファイルが数千行の長さであっても、おそらく唯一のヒットがあるでしょう、それは問題のスレッドです:何かになる段落の先頭に上がる、このファイルで
at org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.unregister(ServiceRegistrationImpl.java:222)
at fr.free.nrw.ServiceActivator.stop(ServiceActivator.java:30)
at org.eclipse.osgi.internal.framework.BundleContextImpl$4.run(BundleContextImpl.java:830)
at org.eclipse.osgi.internal.framework.BundleContextImpl$4.run(BundleContextImpl.java:1)
at java.security.AccessController.doPrivileged(Native Method)
at org.eclipse.osgi.internal.framework.BundleContextImpl.stop(BundleContextImpl.java:823)
このように:手にこの情報を使用して
"fileinstall-/home/nico/p/liferay/osgi/modules" #37 daemon prio=5 os_prio=0 tid=0x00007f39480e3000 nid=0x384f waiting on condition [0x00007f395d169000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000000eb8defb8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
、あなたはスレッド化問題の種類が起こっている知られているだろう、とあなたは、通常のJavaスレッドのデバッグ手法(12)とそれを解決することができるようになります。
モジュール内でアクティベータを使用していますか?状態の停止とは、Activator.stop()メソッドが呼び出されたが、まだ返されていないことを意味します。あなたのスレッドの1つは、そのメソッドにあるはずです。 –
@ChristianSchneider:ServiceActivatorを追加しました。 –
jstackを使用して問題を解決するのは良い方法です。それはスレッドダンプを作成しましたが、スレッドのほとんどは約5-10行あります。はるかに大きいスレッドを探します。特にServiceActivator.stopメソッド呼び出しがあります。次に、デッドロックや長い睡眠を引き起こしているものが表示されます。 –