运行应用程序几天后,我发现在 /root 文件夹中创建了一些 JVM 崩溃报告日志文件以该信息开头
# 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 Runtime Environment (build 1.6.0_26-b03) Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode) Linux ubuntu 2.6.32-36-server #79-Ubuntu SMP 2011 年 11 月 8 日星期二 22:44:38 UTC 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)。
当我使用 APP2 运行 APP1 时,我发现 APP1 中的行为ThreadPoolExecutor
有所不同,其中一些线程多次使用其旧数据重用。我的代码是这样的: App1:
myProcessor processor = new myProcessor(data);
threadExecuter.execute(processor);
myProcessor
正在实现可运行,并且数据存储在私有变量中。
这是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 运行了两次,而当我从命令行正常运行 App1 时,它从未发生过。
以前有人遇到过这种行为吗?