数日間アプリを実行した後、JVM クラッシュ レポートが /root フォルダーに作成されることがわかりました。ログ ファイルはこの情報で始まります。
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00007f050013cdeb, pid=31295, tid=139659437045504
#
# JRE version: 6.0_26-b03
# Java VM: Java HotSpot(TM) 64-Bit Server VM (20.1-b02 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C [libc.so.6+0x86deb] unsigned long+0x15b
#
以下の動作はUbuntuでのみ発生することがわかりました
Java バージョン "1.6.0_26" Java(TM) SE ランタイム環境 (ビルド 1.6.0_26-b03) Java HotSpot(TM) 64 ビット サーバー VM (ビルド 20.1-b02、混合モード) Linux ubuntu 2.6.32-36-server #79-Ubuntu SMP Tue Nov 8 22:44:38 UTC 2011 x86_64 GNU/Linux
ただし、Windows 7 Professional 32 ビットで実行される同じ jar は正しく動作します。
Java バージョン "1.6.0_22" Java(TM) SE ランタイム環境 (ビルド 1.6.0_22-b04) Java HotSpot(TM) クライアント VM (ビルド 17.1-b03、混合モード)
ThreadPoolExecutor を使用していくつかのオブジェクトを処理するマルチスレッド Java アプリ (APP1) があります。Linux でコマンド ラインから実行すると、期待どおりに動作します。ProcessBuilder.start
次に、マルチスレッド アプリの実行に使用する別の Java アプリ (APP2) を作成しました。
ThreadPoolExecutor
APP2 を使用して APP1 を実行すると、一部のスレッドが古いデータで複数回再利用される場合に、APP1の動作が異なることがわかりました。私のコードは次のようなものです: App1:
myProcessor processor = new myProcessor(data);
threadExecuter.execute(processor);
myProcessor
runnable を実装しており、データはプライベート変数に格納されています。
myProcessor
これはクラスのコードです
private class myProcessor implements Runnable {
public myProcessor(Data data)
{
myData=data;
}
private Data myData;
DataDAO datadao=new DataDAO();
public void run() {
Boolean processed = false;
if (myData != null) {
if(Logger.isDebug())
{
Logger.logInfo("-- thread:"+ Thread.currentThread().getName()+" processing "+myData.getId());
}
processed = dataHandler.process(myData.getMade(), myData.getText(), myData.getSc().getComp(), myData.getSc(), myData.getOp(),myData.getId());
myData.setProcessed(processed);
myData.setStatus(1);
try {
if(myData.isProcessed()) datadao.UpdateProcessedStatus(myData);
} catch (SQLException ex) {
Logger.logError(ex);
}
}
}
}
ログ ファイルを確認すると、スレッド名が同じデータ ID で 2 回実行されていることがわかります。コマンド ラインから App1 を通常どおり実行すると、このようなことは決して起こりません。
誰かが以前にそのような行動に遭遇したことがありますか?