初始化

/**
     * @初始化
     *      初始化对于类或接口来说,就是执行它的初始化方法
     *      @在执行下列需要引用类或接口的java虚拟机指令是——new,getstatic,putstatic,invokestatic
     *          这些指令都会通过字段或方法引用来直接或间接的引用某个类
     *
     *          执行new指令,如果指令引用的类或接口没有初始化,那就初始化它。
     *          getstatic,putstatic,invokestatic 那些解析好的字段或方法中的类或接口如果还没有初始化,那就初始化
     *
     *          初始化调用java.lang.invoke.MethodHandle实例时,该实例是由java虚拟机所解析出来的种类
     *
     *          在调用类库中的某些反射方法时
     *
     *          在对类的某个子类进行初始化时
     *
     *          在被选定为java虚拟机启动时的初始类
     *
     *      @在类或接口初始化之前,它必须被链接过,经过验证,准备阶段,并且有可能已经解析完
     *
     *      @java虚拟机支持多线程,所以在初始化类或接口的时候要特别注意线程同步问题,可能其他一些线程也想要初始化相同名称的类或接口。
     *          也有可能在初始化一些类或接口时,又会递归的触发对这个类或接口本身的初始化操作。
     *          java虚拟机实现需要负责处理好线程同步和递归初始化
     *
     *          class 对象已经被验证和准备过,但还没有被初始化
     *          class 对象正在被其他特定线程初始化
     *          class 对象已经成功被初始化且可以使用
     *          class 对象处于错误的状态,可能因为尝试初始化时失败过
     *
     *          每个类或接口C都有一个唯一的初始化锁LC,如何实现从C到LC的映射,可由java虚拟机实现自省决定。
     *              1、同步C的初始化锁LC.这个操作会导致当前线程一直等待,直到可以获得LC锁
     *              2、如果C的class对象显示当前C的初始化是由其他线程正在进行的,那么当前线程就释放LC锁并进入阻塞状态
     *                  直到它知道初始化工作已经由其他线程完成,此时当前线程就需要重试这一过程
     *                  执行初始化过程,线程的中断状态不受影响。
     *              3、如果C的class对象显示C的初始化正由当前进程进行, 那就表明这是对初始化的递归请求,释放LC并正常返回
     *              4、如果C的class对象显示Class已经初始化完成,那就不需要再做什么了,释放LC并正常返回。
     *              5、如果C的Class对象显示它处于一个错误的状态,那就不能在完成初始化了。释放LC并抛出异常——NoClassDefFoundException
     *              6、否则,记录当前线程正在初始化C的class对象,随后释放LC,根据属性出现在classfile的顺序,利用ContantValue属性来初始化C中的final ,static子墩啊
     *              7、如果C是类,并且父类没有初始化,那在父类上进行递归完整的初始化过程——验证和准备
     *                  如果初始化父类出现异常,那么获取LC后将C的class对象设置为错误状态,并通知所有等待线程,最后释放LC并异常退出。
     *              8、通过查询C的定义加载器来判定C是否开启了断言机制
     *              9、执行C的类或接口的初始化方法
     *              10、如果正常执行了初始化方法,那就获取LC,并把C的class对象标记为已经完全初始化,通知所有等待线程,释放LC,正常的退出整个过程
     *              11、否则,类或接口初始化方法就必定因为抛出一个异常而中断退出。
     *              12、获取LC,标记C的class对象有错误发生,通知所有正在等待的线程,释放LC,将异常或上一步中具体错误对象作为此次意外中断的原因
     *
     */

绑定本地方法和退出java虚拟机

/**
     * @绑定本地方法实现
     *      为了使用一个非java语言编写的native方法,而将其集成到虚拟机过程中_绑定。
     *          绑定避免和链接发生冲突。
     */
    /**
     * @java虚拟机退出
     *      java虚拟机退出条件是,某个线程调用Runtime类或System类的exit方法
     *          或者Runtime类的halt方法,并且java安全管理器也允许这次exit或halt方法。
     *      JNI规范描述了其API来加载或卸载java虚拟机时,java虚拟机退出的情况。
     */