常见的异常
1.相关错误和异常
错误:
- StackOverflowError:栈满会抛出该错误。无限递归就会导致StackOverflowError
- OOM—Java heap space:堆满会抛出该错误。
- OOM—GC overhead limit exceeded:正常情况是GC只会占到很少一部分时间。但是如果用超过98%的时间来做GC,而且收效甚微,就会被JVM叫停。下例中,执行了多次
Full GC
,但是内存回收很少,最后抛出了OOM:GC overhead limit exceeded
错误。 - OOM—GC Direct buffer memory:使用
native
方法,直接在堆外分配内存。当堆外内存(也即本地物理内存)不够时,就会抛出这个异常。 - OOM—unable to create new native thread:在高并发应用场景时,如果创建超过了系统默认的最大线程数,就会抛出该异常。Linux单个进程默认不能超过1024个线程。解决方法要么降低程序线程数,要么修改系统最大线程数
vim /etc/security/limits.d/90-nproc.conf
。 - OOM—Metaspace:元空间满了就会抛出这个异常。元空间就是以前的永久代,区别是原空间不占用虚拟机内存,而是直接占用物理内存,元空间就是线程共享的方法区,里面存放的是1、虚拟机加载的类信息。2、常量池。3、静态变量。4、即时编译后的代码
异常:
-
并发修改异常:
ArrayList
不是线程安全类,在多线程同时写的情况下,会抛出java.util.ConcurrentModificationException
异常。 -
**
RejectedExecutionException
拒绝执行异常:调用new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue());创建一个线程池,采用默认的拒绝策略的时候。若进入线程池的线程超过能容忍的最大线程数的时候。会爆出拒绝执行异常。RejectedExecutionException
AbortPolicy**:默认的策略,直接抛出
RejectedExecutionException
异常,阻止系统正常运行。当等待队列满时,且达到最大线程数,再有新任务到来,就需要启动拒绝策略
2. Error 和 Exception 区别是什么?
- Error 类型的错误通常为虚拟机相关错误,如系统崩溃,内存不足,堆栈溢出等,编译器不会对这类错误进行检测,JAVA 应用程序也不应对这类错误进行捕获,一旦这类错误发生,通常应用程序会被终止。
- Exception 类的错误是可以在应用程序中进行捕获并处理的