为什么JVM类加载器必须在首次使用之前不报告问题?

时间:2016-02-15 21:41:38

标签: java jvm

我正在阅读下面的文章,并不理解以下段落背后的原因:

  

类加载器可以选择在预期最终使用时尽早加载类型。如果选择此策略,则类加载器不得报告在加载期间遇到的任何问题(通过抛出java.lang.LinkageError的子类),直到该类型的第一次活动使用。换句话说,只有在需要时才能加载类型。

这背后有具体原因吗?可能会出现什么样的问题,为什么需要在该类型首次使用时特别报告?我对JVM的理解有限,因此任何其他资源都会受到赞赏。

http://www.developer.com/java/other/article.php/2248831/Java-Class-Loading-The-Basics.htm

2 个答案:

答案 0 :(得分:2)

如果加载器预取了一组相关的类,但是实际上从未使用过违规的类,那么抛出错误将没有用处或者没必要。

对于可能发生的问题类型的示例,可能在类级别变量声明中具有格式错误的正则表达式可能会在加载时导致问题。或者可能存在依赖性问题,其中一个导入丢失。

那么,如果该类从未使用过,为什么要抛出错误?

答案 1 :(得分:0)

显然,这是由Java语言规范,12.2.1 The loading process部分强调的(强调我的):

  

加载过程由类ClassLoader及其实现   子类。

     

ClassLoader的不同子类可以实现不同的加载   政策。特别是,类加载器可以缓存二进制文件   类和接口的表示,基于它们预取它们   预期用法,或一起加载一组相关类。这些   活动可能对正在运行的应用程序完全透明   例如,如果找不到新编译的类的版本   因为旧版本由类加载器缓存。 是的   但是,类加载器的责任是反映加载错误   只有在程序中可能没有出现的地方   预取或小组加载

     

如果在类加载期间发生错误,则表示其中一个的实例   将抛出以下类LinkageError的子类   指向(直接或间接)使用类型的程序:

     
      
  • ClassCircularityError:无法加载类或接口,因为它是自己的超类或超接口(第8.1.4节,   §9.1.3,§13.4.4)。
  •   
  • ClassFormatError:声称指定请求的已编译类或接口的二进制数据格式错误。
  •   
  • NoClassDefFoundError:相关的类加载器找不到所请求的类或接口的定义。
  •   
     

因为加载涉及新数据结构的分配,所以它可能   失败并出现OutOfMemoryError。