1

数日間アプリを実行した後、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) を作成しました。

ThreadPoolExecutorAPP2 を使用して APP1 を実行すると、一部のスレッドが古いデータで複数回再利用される場合に、APP1の動作が異なることがわかりました。私のコードは次のようなものです: App1:

    myProcessor processor = new myProcessor(data);
    threadExecuter.execute(processor);

myProcessorrunnable を実装しており、データはプライベート変数に格納されています。

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 を通常どおり実行すると、このようなことは決して起こりません。

誰かが以前にそのような行動に遭遇したことがありますか?

4

0 に答える 0