还不理解 Error 和 Exception 吗,看这篇就够了( 三 )


 
其中包括两部分,由所有线程共享的数据区和线程隔离的数据区组成,在上面的 Java 内存模型中,只有程序计数器是不会发生 OutOfMemoryError 情况的区域,程序计数器控制着计算机指令的分支、循环、跳转、异常处理和线程恢复,并且程序计数器是每个线程私有的 。

什么是线程私有:表示的就是各条线程之间互不影响,独立存储的内存区域 。
如果应用程序执行的是 Java 方法,那么这个计数器记录的就是虚拟机字节码指令的地址;如果正在执行的是 Native 方法,这个计数器值则为空(Undefined) 。
除了程序计数器外,其他区域:方法区(Method Area)、虚拟机栈(VM Stack)、本地方法栈(Native Method Stack) 和 堆(Heap) 都是可能发生 OutOfMemoryError 的区域 。
  • 虚拟机栈:如果线程请求的栈深度大于虚拟机栈所允许的深度,将会出现 StackOverflowError 异常;如果虚拟机动态扩展无法申请到足够的内存,将出现 OutOfMemoryError 。
  • 本地方法栈和虚拟机栈一样
  • 堆:Java 堆可以处于物理上不连续,逻辑上连续,就像我们的磁盘空间一样,如果堆中没有内存完成实例分配,并且堆无法扩展时,将会抛出 OutOfMemoryError 。
  • 方法区:方法区无法满足内存分配需求时,将抛出 OutOfMemoryError 异常 。
一道经典的面试题一道非常经典的面试题,NoClassDefFoundError 和 ClassNotFoundException 有什么区别?
在类的加载过程中,JVM 或者 ClassLoader 无法找到对应的类时,都可能会引起这两种异常/错误,由于不同的 ClassLoader 会从不同的地方加载类,有时是错误的 CLASSPATH 类路径导致的这类错误,有时是某个库的 jar 包缺失引发这类错误 。NoClassDefFoundError 表示这个类在编译时期存在,但是在运行时却找不到此类,有时静态初始化块也会导致 NoClassDefFoundError 错误 。
ClassLoader 是类路径装载器,在Java 中,类路径装载器一共有三种两类
一种是虚拟机自带的 ClassLoader,分为三种
启动类加载器(Bootstrap) ,负责加载 $JAVAHOME/jre/lib/rt.jar扩展类加载器(Extension),负责加载 $JAVAHOME/jre/lib/ext/*.jar应用程序类加载器(AppClassLoader),加载当前应用的 classpath 的所有类
第二种是用户自定义类加载器
Java.lang.ClassLoader 的子类,用户可以定制类的加载方式 。

还不理解 Error 和 Exception 吗,看这篇就够了

文章插图
 
另一方面,ClassNotFoundException 与编译时期无关,当你尝试在运行时使用反射加载类时,ClassNotFoundException 就会出现 。
简而言之,ClassNotFoundException 和 NoClassDefFoundError 都是由 CLASSPATH 中缺少类引起的,通常是由于缺少 JAR 文件而引起的,但是如果 JVM 认为应用运行时找不到相应的引用,就会抛出 NoClassDefFoundError 错误;当你在代码中显示的加载类比如 Class.forName() 调用时却没有找到相应的类,就会抛出
java.lang.ClassNotFoundException 。
  • NoClassDefFoundError 是 JVM 引起的错误,是 unchecked,未经检查的 。因此不会使用 try-catch 或者 finally 语句块;另外,ClassNotFoundException 是受检异常,因此需要 try-catch 语句块或者 try-finally 语句块包围,否则会导致编译错误 。
  • 调用 Class.forName()、ClassLoader.findClass() 和 ClassLoader.loadClass() 等方法时可能会引起 java.lang.ClassNotFoundException,如图所示

还不理解 Error 和 Exception 吗,看这篇就够了

文章插图
 
  • NoClassDefFoundError 是链接错误,发生在链接阶段,当解析引用找不到对应的类,就会触发;而 ClassNotFoundException 是发生在运行时的异常 。
文章参考:
https://www.java67.com/2012/12/noclassdeffounderror-vs-classnotfoundexception-java.html
《极客时间-Java核心技术 36 讲》
《深入理解 Java 虚拟机》第二版
《Effective Java 第三版》
https://www.cnblogs.com/xiohao/p/3547443.html
https://blog.csdn.net/qq_29229567/article/details/80773970
https://blog.csdn.net/riemann_/article/details/87522352
《Java编程思想》
https://www.cnblogs.com/xz816111/p/8466048.html
https://docs.oracle.com/javase/specs/jls/se9/html/jls-11.html#jls-11.1.1
jdk 1.8 源码注释




推荐阅读