我知道每个对象都需要堆内存,堆栈上的每个原语/引用都需要堆栈内存.
当我尝试在堆上创建一个对象并且没有足够的内存来执行此操作时,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) 我们正在制作类似Excel的系统.当我们打开文档并发现不支持的函数时,我们抛出了异常.我们只支持excel函数的小子集,这可能经常发生.问题是当有很多单元格包含不受支持的函数时,会创建大量的异常实例.创建这些许多异常实例会消耗不可忽视的时间.
我们在异常类中没有任何特殊属性.我们需要知道的是抛出异常的事实.我们刚发现错误已发生并将单元格标记为错误.
所以我们决定共享一个异常实例并在需要时抛出它.多个线程可以抛出异常实例.我怀疑堆栈跟踪可能已损坏,但是,我们没有看到它.我们只是捕获异常,并将相应的单元格标记为错误.
我的问题是:在这种情况下,共享异常实例是否安全? 好吧,我看了下面的文章: Java:Exception类是线程安全的吗? 但背景似乎有所不同.
感谢您提前阅读这个长期问题和回复.