错误本质上是致命的......对于进程或线程?
Posted
技术标签:
【中文标题】错误本质上是致命的......对于进程或线程?【英文标题】:Errors are fatal in nature.... for process or for thread? 【发布时间】:2014-05-22 12:15:49 【问题描述】:在我的程序中有 3 个线程。 Thread 1
负责将当前有 279381 条记录的 mysql 数据库中的记录填充到队列中。 Thread 2
和Thread 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】:抛出Error
s 并没有什么神奇之处,只是它们意味着发生了一些严重的事情,比如内存不足。您通常不想抓住它们,仅此而已。
线程内抛出的未捕获异常会停止线程本身。其他线程不受影响。不过有办法抓住它们,请参阅this question。
【讨论】:
以上是关于错误本质上是致命的......对于进程或线程?的主要内容,如果未能解决你的问题,请参考以下文章
打开CAD出现致命错误:安全系统(保密锁或网络许可)不起作用或未正确安装