zoukankan      html  css  js  c++  java
  • JVM之类加载

    类加载:将Class文件中的数据加载到内存,对数据校验,转化解析,初始化,最终形成可被虚拟机直接使用的Java类型

    生命周期:加载-----验证------准备------解析----初始化------使用------卸载

    类加载的过程包括了加载、验证、准备、解析、初始化五个阶段,解析阶段执行顺序不确定,可以在初始化阶段之后开始(支持动态绑定),这几个阶段按顺序开始,而不是进行或者完成,通常是交叉混合进行的,

     

    加载:类加载器:   启动类加载器:Bootstrap ClassLoader,c++实现 加载核心库 java.*

              加载存放在JDKjrelib下无法被Java程序直接引用

             扩展类加载器:Extension ClassLoader:加载Java平台中拓展功能的Jar包,加载扩展库 javax.*

                可以直接使用扩展类加载器

             应用程序类加载器:加载类路径(ClassPath)所指定的类, 加载程序所在的目录

          开发者可以直接使用该类加载器,一般情况下这个就是程序中默认的类加载器

                                             

    双亲委派模型:当一个类收到类加载请求,将请求委派给父类加载器完成,每一层都是如此,最终所有加载请求传到最顶层的启动类加载器,当父类无法完成加载,交给子类加载,要加载类先检查是否已经加载,是不是自己应该加载的类。自底向上检查类是否已经加载 自顶向下尝试加载类

    好处:就是Java类随着它的类加载器(说白了,就是它所在的目录)一起具备了一种带有优先级的层次关系,保证了某个类在各种类加载器中都是同一个类,只被加载一次

    验证:确保Class文件中的字节流包含的信息符合当前虚拟机的要求,包括文件格式,元数据,字节码,符号引用的验证

    准备:正式为类变量分配内存并设置类变量初始值的阶段

    解析:虚拟机将常量池中的符号引用转化为直接引用的过程

    初始化:真正开始执行类中定义的Java程序代码

     

    分派:静态分派:依赖静态类型来定位方法执行版本的分派动作,都称为静态分派 如方法重载

       动态分派:在运行期根据实际类型确定方法的指向版本 如方法重写

       单分派:方法的接收者和参数统称为方法字量,根据一个字量对目标方法选择

       多分派:根据多个字量对目标方法选择

    Java是静多动单的语言

     用不同的类加载器得到的类是不同的!!!只有名字和类加载器相同才会得到相同的类

    在 Java 虚拟机判断两个类是否相同的时候,使用的是类的定义加载器。也就是说,哪个类加载器启动类的加载过程并不重要,重要的是最终定义这个类的加载器

    参考:https://www.ibm.com/developerworks/cn/java/j-lo-classloader/index.html

  • 相关阅读:
    java maven 操作 收集的一些命令
    Java多线程,线程交替执行
    java类同时引用父类和接口的成员变量,需要指明是父类的还是接口的
    artTemplate 模板使用
    Dubbo 只注册,只订阅
    Tomcat灵活配置多项目,多端口,多域名,多虚拟目录
    CentOS7.2 安装nginx-1.10.3
    CentOS7.2 安装zookeeper3.4.9
    CentOS7.2 安装Redis3.2.8
    CentOS7.2 切换成iptables规则
  • 原文地址:https://www.cnblogs.com/team42/p/7045362.html
Copyright © 2011-2022 走看看