相关疑难解决方法(0)

当没有足够的内存来抛出OutOfMemoryError时会发生什么?

我知道每个对象都需要堆内存,堆栈上的每个原语/引用都需要堆栈内存.

当我尝试在堆上创建一个对象并且没有足够的内存来执行此操作时,JVM会在堆上创建一个java.lang.OutOfMemoryError并将其抛给我.

所以隐含地,这意味着JVM在启动时保留了一些内存.

当这个保留的内存用完时会发生什么(它肯定会用完,下面的讨论),而且JVM上没有足够的内存来创建java.lang.OutOfMemoryError的实例?

它只是挂起来吗?或者他会抛弃我,null因为newOOM的实例没有记忆?

try {
    Object o = new Object();
    // and operations which require memory (well.. that's like everything)
} catch (java.lang.OutOfMemoryError e) {
    // JVM had insufficient memory to create an instance of java.lang.OutOfMemoryError to throw to us
    // what next? hangs here, stuck forever?
    // or would the machine decide to throw us a "null" ? (since it doesn't have memory to throw us anything more useful …
Run Code Online (Sandbox Code Playgroud)

java language-agnostic

206
推荐指数
7
解决办法
3万
查看次数

共享异常实例是否安全

我们正在制作类似Excel的系统.当我们打开文档并发现不支持的函数时,我们抛出了异常.我们只支持excel函数的小子集,这可能经常发生.问题是当有很多单元格包含不受支持的函数时,会创建大量的异常实例.创建这些许多异常实例会消耗不可忽视的时间.

我们在异常类中没有任何特殊属性.我们需要知道的是抛出异常的事实.我们刚发现错误已发生并将单元格标记为错误.

所以我们决定共享一个异常实例并在需要时抛出它.多个线程可以抛出异常实例.我怀疑堆栈跟踪可能已损坏,但是,我们没有看到它.我们只是捕获异常,并将相应的单元格标记为错误.

我的问题是:在这种情况下,共享异常实例是否安全? 好吧,我看了下面的文章: Java:Exception类是线程安全的吗? 但背景似乎有所不同.

感谢您提前阅读这个长期问题和回复.

java exception-handling exception

6
推荐指数
2
解决办法
419
查看次数