zoukankan      html  css  js  c++  java
  • 第七章——虚拟机类加载机制——学习总结

    类的生命周期

    7.2、开始类加载、类初始化的时机。

      1)类加载过程的第一个阶段:加载。虚拟机规范中没有进行强制约束,交由具体的虚拟机实现来自由把握。

      2)初始化 阶段,虚拟机规范中严格规定了有且只有4种情况必须立即对类进行“初始化”(加载,验证,准备自然在初始化之前开始)。

        a)遇到new、getstatic、putstatic、invokestatic四条字节码指令时,若类没被初始化,则要立即初始化。

        b)使用java.lang.reflect包的方法对类进行反射调用时,若类没被初始化,则要立即初始化。

        c)当初始化一个类时,若它的父类还没被初始化,则需先初始化父类。

        d)当虚拟机启动时,用户需要指定一个要执行的主类(包括main()方法的那个类),虚拟机会先初始化这个主类。

      以上四种情况的行为称作对一个类的主动引用。除此之外所有引用类的方式,都不会触发类的初始化,称为被动引用。

      以下贴3个被动引用的场景例子:

      

      

      

      扩展:

      

    7.3类加载过程,具体动作。

      1.加载:

        

        

        虚拟机规范的这三点比较笼统,具体实现上灵活度高。

      2.验证:  

        这一阶段的目的:为了确保class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身安全。

        

        1.文件格式验证:

        

        2.元数据验证:主要检查语言规范。

        

        3.字节码验证

        

        4.符号引用验证

        

        总结:

        

    7.3准备

       准备阶段是正式为类变量(被static修饰的变量)分配内存并设置初始值(数据类型的“零值”)的阶段,这些内存都将在方法区中分配。

      举例:

        public static int value = 123;在此阶段,它的零值是   0;

        public static int value = 123;在此阶段,它的零值是   123;

        零值对应表:

          

    7.4解析

      是虚拟机将常量池中的符号引用替换为直接应用的过程。

      

      

    7.5初始化

      

      

      

    类加载器

      1、什么是类加载器。

        

      

        

        

        

        

  • 相关阅读:
    十二、redis常用的运维命令及注意参数
    十一,redis的主从集群
    十、redis的持久化配置
    九、Redis的消息发布和订阅
    八、Redis 中的事务
    apache、nginx、iis日志记录的各个字段内容与含义
    Pikachu-RCE
    Pikachu-SQL-Inject(SQL注入漏洞)
    Pikachu-CSRF(跨站请求伪造)
    Pikachu-XSS(跨站脚本)漏洞
  • 原文地址:https://www.cnblogs.com/wzk1992/p/6956457.html
Copyright © 2011-2022 走看看