So this is a design problem, but I still want to know why.I can't catch outofmemoryerror in java even with
Catch(Throwable t) {
}So Why I can't catch it ? Or more specifically, why java design this error can't be catched?
Catch(Throwable t) {
}So Why I can't catch it ? Or more specifically, why java design this error can't be catched?
错误是不能被catch的
内存不足被JAVA语言设计成错误了,为什么要设计成错误呢?
我个人认为是为了方便,简单,高效,符合JAVA客户需求等等,如果设计成异常会比较麻烦,也没有必要,最重要的是不合理。
• Java.laERROR.OutOfMemoryError //内存不足
• Java.laERROR.StackOverflowError //StackOverflow
② Exception类的子类RuntimeException的子类以外的子类
• Java.io.IOException //输入输出错误
• Java.io.FileNotFoundException //找不到文件(IOException的子类)
• Java.sql.SQLException //DB访问异常
③ RuntimeException类的子类
在程序运行中到处都有可能发生,由程序员的错误造成的异常。或者,在设计时没有考虑到的情况下发生的异常。
• Java.laERROR.ArithmeticException //整数运算时用0做除数
• Java.laERROR.ArrayIndexOutOfBoundsException //数组下标错误
• Java.laERROR.IllegalArgumentException //参数值错误
• Java.laERROR.NullPointerException //访问空指针错误
-Xmx<size>:堆的最大值,如果最大值过小,所需内存超出堆的最大值时,虚拟机会提示内存溢出。
这个解决
to 说我程序逻辑出错的: 我程序的一个feature就是用尽可能多的内存,然后如果内存不够了,我再释放一点;所有我正准备catch OutOfMemory异常后释放呢,可是现在catch不住。
to 说 OutOfMemory被捕获不合理的:我认为语言设计至少要有统一性,不能说有些Error是可以被捕获的,有些Error类却是捕获不了的,这样太违背直觉了。而且捕获outofmemory也不是难事么,这个和stackOverflow不一样,毕竟OutOfMemory的时候系统状态还是正常的;况且这个异常被捕获还是很有价值的,比如C++里面的new也会抛出OutOfMemory异常,可以被捕获后释放一些不太重要的内存,然后继续使用。
我认为OutOfMemoryError捕获失败不是语言级的问题 是虚拟机自身能力的问题 捕获OutOfMemory完全符合java的语法 编译期运行期也不会报任何错
可能在虚拟机抛出OutOfMemoryError的时候 虚拟机用自身所能控制的那点内存已经没有能力干别的事情了