【问题标题】: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

【问题讨论】:

    标签: java mysql multithreading exception-handling hsqldb


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-02-06
      • 1970-01-01
      • 2019-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 1970-01-01
      相关资源
      最近更新 更多