异常主要是处理编译期不能捕获的错误。出现问题时能继续顺利执行下去,而不致使程序终止,确保程序的健壮性。java
处理过程:产生异常状态时,若是当前的context不具有处理当前异常的能力,将在heap上new出来一个异常对象,中止当前的执行路线,把产生的异常对象抛给更高层的context。面试
Throwable:异常类 Error:系统异常;不能恢复;Exception :普通异常;可恢复sql
利用try/catch/finally处理异常数据库
某些事物(除内存外)在异常处理完后须要恢复到原始状态,如:开启的文件,网络链接等。数组
异常表示程序运行过程当中可能出现的非正常状态,运行时异常表示虚拟机的一般操做中可能遇到的异常,缓存
是通常常见的运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,可是并不要求必须声明抛出网络
未被捕获的运行时异常。指针
异常分为runtime exception和checked exception对象
checked exception :java编译器强制要求catch此类异常,如io异常、sql异常。递归
runtime exception:不须要强制性处理,一旦出现异常,交由虚拟机接管。
NullPointException:空指针
ArrayIndexOutOfBoundsException:数组越界
IllegalArgumentException:参数非法
BufferOverflowExeption:缓存溢出
ClassNotFoundException:在编译时没法找到指定类
ClassCastException:类型强转
ExceptionInInitializerError:静态初始值或静态变量初始值期间发生异常
UnsatisfiedLinkError:JNI加载dll或者so文件时未找到
NoClassDefFoundError:在编译时能找到合适的类,而在运行时不能找到合适的类
产生缘由:
一、内存中加载的数据量过于庞大,如上一次从数据库取出过多的数据。
二、集合类中有对对象的引用,使用完后未清空,使得JVM不能回收。
三、代码中存在死循环或循环产生过多重复的对象实体。
四、使用的第三方软件中的Dug
五、启动参数内存值设定的太小
一、检查代码中是否有死循环或递归循环
二、检查是否有大循环重复产生新对象实体。
三、检查对数据库查询中,是否有一次得到所有数据的查询,通常来讲,若是一次取出十万条记录到内存中,就可能引发内存溢出,这个问题
比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引发内存溢出,所以对于数据库查询尽可能采用分页
的方式查询。
四、检查LIst、Map等集合对象是否有使用后,未清除的问题,List、Map等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。
五、检查对大文件的读取是否采用类nio的方式。