美文网首页troubleshooting整理
不可逆的类初始化过程

不可逆的类初始化过程

作者: andersonoy | 来源:发表于2017-07-01 12:53 被阅读0次
  • 不可逆的类初始化过程

    • 类的加载过程简单来说loaded->linked->initialized这么几个阶段
    • 类的初始化
      class BadClass{ private static int a=100; static{ System.out.println("before init"); int b=3/0; System.out.println("after init"); } public static void doSomething(){ System.out.println("do somthing"); } }
      public static void main(String args[]){ try{ BadClass.doSomething(); }catch (Throwable e){ e.printStackTrace(); } BadClass.doSomething(); }
      • 会打印多次before init吗?
      • 只输出了一次before init,这是为什么呢?
      • jvm规范规定有且只有5中主动使用的情况下必须立即初始化类
        • new getstatic putstatic invokestatic
        • java.lang.reflect的方法对类进行反射时
        • 初始一个类时父类没有初始化时
        • main()方法的类
        • JDK7的动态语言支持....
      • 但是这个过程是不可逆的,也就是说当我们执行一遍之后再也不会执行了,如果在执行这个方法过程中出现了异常没有被捕获,那这个类将永远不可用,虽然我们上面执行BadClass.doSomething()的时候catch住了异常,但是当代码跑到这里的时候,在jvm里已经将这个类打上标记了,说这个类初始化失败了,下次再初始化的时候就会直接返回并抛出类似的异常java.lang.NoClassDefFoundError: Could not initialize class BadClass,而不去再次执行初始化的逻辑
        enum ClassState { unparsable_by_gc = 0, // object is not yet parsable by gc. Value of _init_state at object allocation. allocated, // allocated (but not yet linked) loaded, // loaded and inserted in class hierarchy (but not linked yet) linked, // successfully linked/verified (but not initialized yet) being_initialized, // currently running class initializer fully_initialized, // initialized (successfull final state) initialization_error // error happened during initialization };
      • 如果clinit执行失败了,抛了一个未被捕获的异常,那将这个类的状态设置为initialization_error,并且无法再恢复,因为jvm会认为你这次初始化失败了,下次肯定也是失败的,为了防止不断抛这种异常,所以做了一个缓存处理,不是每次都再去执行clinit,因此大家要特别注意,类的初始化过程可千万不能出错,出错就可能只能重启了哦。
  • References

相关文章

  • 不可逆的类初始化过程

    不可逆的类初始化过程类的加载过程简单来说loaded->linked->initialized这么几个阶段类的初始...

  • 不可逆的类初始化过程

    类的加载过程说复杂很复杂,说简单也简单,说复杂是因为细节很多,比如说今天要说的这个,可能很多人都不了解;说简单,大...

  • Daager2基本框架讲解

    依赖注入 就是目标类(目标类需要进行依赖初始化的类,下面都会用目标类一词来指代)中所依赖的其他的类的初始化过程,不...

  • 第五课、类的加载连接与初始化过程详解

    类的加载、连接与初始化过程详解 类的加载、连接与初始化 1、过程:加载-->连接(验证-->准备-->解析) --...

  • 技术问 - 类的初始化过程

    类的初始化过程: 代码: 在内存中的执行过程: 类的初始化过程 创建对象并赋值在内存中的过程: 创建对象并赋值说明...

  • 类加载连接初始化阶段

    一、类的生命周期和加载阶段概述 类的生命周期 类的加载连接初始化过程 二、类的加载连接初始化详细过程  加载 使用...

  • JobManager源码分析

    JobManager类 JobManager类用于对提交的任务进行管理。 初始化 JobManager初始化的过程...

  • 类初始化过程

    当一个类被初始化时,子类和父类的初始化过程是怎么样的?如果包含静态变量和静态代码块?

  • 类初始化过程

    初始化过程是这样的: 1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化; 2.然后,...

  • 类初始化过程

    https://www.cnblogs.com/jackyrong/archive/2008/08/12/1266...

网友评论

    本文标题:不可逆的类初始化过程

    本文链接:https://www.haomeiwen.com/subject/gslycxtx.html