错误本质上是致命的......对于进程或线程?

Posted

技术标签:

【中文标题】错误本质上是致命的......对于进程或线程?【英文标题】:Errors are fatal in nature.... for process or for thread? 【发布时间】:2014-05-22 12:15:49 【问题描述】:

在我的程序中有 3 个线程。 Thread 1 负责将当前有 279381 条记录的 mysql 数据库中的记录填充到队列中。 Thread 2Thread 3 从队列中读取和处理记录,并将它们插入到 HSQL 数据库中。根据我的期望,我在Thread 1 上得到了OutOfMemoryError,但令我惊讶的是,我的Thread 3 并没有终止我的进程,而是仍在运行。 这不是一种奇怪的行为吗? 我一直认为Errors 是致命的。它们处于jvm 级别,并且程序在它们发生时终止。但我认为Errors 是特定于线程的,如果程序即使在它们发生时也可以继续,为什么我们不允许捕捉它们? 还是还有一些我不知道的事情?我希望专家会对此有所了解。

我正在附加控制台输出。

LL populated :: 558759
Rows Read from Hospital Database ::279381
Total Rows in HSQL :: 119699    8931464
In Read HSQL
LL populated :: 558759Exception in thread "Thread-1" java.lang.OutOfMemoryError: Java heap space
    at java.nio.CharBuffer.wrap(CharBuffer.java:369)
    at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:265)
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125)
    at java.io.OutputStreamWriter.write(OutputStreamWriter.java:207)
    at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:129)
    at java.io.PrintStream.newLine(PrintStream.java:545)
    at java.io.PrintStream.println(PrintStream.java:807)
    at XXXX.readResultSet(XXXX.java:196)    
    at java.lang.Thread.run(Thread.java:722)
java.sql.SQLException: java.lang.OutOfMemoryError: Java heap space
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
    at org.hsqldb.jdbc.JDBCStatement.executeQuery(Unknown Source)
    at YYYY.readHSQL(YYYY.java:203)
    at java.lang.Thread.run(Thread.java:722)
Caused by: org.hsqldb.HsqlException: java.lang.OutOfMemoryError: Java heap space
    at org.hsqldb.error.Error.error(Unknown Source)
    at org.hsqldb.result.Result.newErrorResult(Unknown Source)
    at org.hsqldb.StatementDMQL.execute(Unknown Source)
    at org.hsqldb.Session.executeCompiledStatement(Unknown Source)
    at org.hsqldb.Session.executeDirectStatement(Unknown Source)
    at org.hsqldb.Session.execute(Unknown Source)
    ... 6 more
Caused by: java.lang.OutOfMemoryError: Java heap space
    at org.hsqldb.QuerySpecification.buildResult(Unknown Source)
    at org.hsqldb.QuerySpecification.getSingleResult(Unknown Source)
    at org.hsqldb.QuerySpecification.getResult(Unknown Source)
    at org.hsqldb.StatementQuery.getResult(Unknown Source)
    ... 10 more

In Read HSQL
Total Rows in HSQL :: 119699    8931464
In Read HSQL
Total Rows in HSQL :: 119699    8931464
In Read HSQL

【问题讨论】:

【参考方案1】:

抛出Errors 并没有什么神奇之处,只是它们意味着发生了一些严重的事情,比如内存不足。您通常不想抓住它们,仅此而已。

线程内抛出的未捕获异常会停止线程本身。其他线程不受影响。不过有办法抓住它们,请参阅this question。

【讨论】:

以上是关于错误本质上是致命的......对于进程或线程?的主要内容,如果未能解决你的问题,请参考以下文章

打开CAD出现致命错误:安全系统(保密锁或网络许可)不起作用或未正确安装

多线程编程

如何从子进程中的致命错误中拯救父进程

python并发编程之进程池,线程池concurrent.futures

Windows 进程激活服务的致命通信错误

游戏更新就出现发生致命错误Win32Error怎么回事