异常
# Exception 和 Error区别?
Exception 是程序本身可以处理的异常;
Error是程序无法处理的错误
# 检查性异常
Java 代码在编译过程中,如果受检查异常没有被
catch
或者throws
关键字处理的话,就没办法通过编译;
- IOException;
- ClassNotFoundException;
- SQLException;
# 非检查性异常
RuntimeException
及其子类都统称为非受检查异常;
NullPointerException
(空指针错误)ArrayIndexOutOfBoundsException
(数组越界错误)- OutOfMemoryError
- StackOverFlowError
IllegalArgumentException
(参数错误比如方法入参类型错误)NumberFormatException
(字符串转换为数字格式错误,IllegalArgumentException
的子类)ClassCastException
(类型转换错误)SecurityException
(安全错误比如权限不够)
# OOM异常
堆溢出
原因:
创建超大对象,大数组;
可能一次性查询了数据库全部结果,没有做结果限制;
内存泄漏;
找到持有的对象,修改代码设计,如关闭没有释放的连接;
上游系统请求流量飙升;
添加服务器资源,或者限流降级;
方法区或运行时常量池溢出
主流框架里面大量使用动态代理,反射,或cglib这类字节码技术,增强的类越多,就需要越大的方法区保证动态生成的新类型载入内存;
栈溢出
无限递归,线程数过多,栈上分配;