zoukankan      html  css  js  c++  java
  • JVM加载class文件的原理机制

    Java中的所有类,都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类,而它的工作就是把class文件从硬盘读取到内存中。在写程序的时候,我们几乎不需要关心类的加载,因为这些都是隐式装载的,除非我们有特殊的用法,像是反射,就需要显式的加载所需要的类。

    Java类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是基类)完全加载到jvm中,至于其他类,则在需要的时候才加载。这当然就是为了节省内存开销。

    Java的类加载器有三个,对应Java的三种类:

    Bootstrap Loader // 负责加载系统类 (指的是内置类,像是String,对应于C#中的System类和C/C++标准库中的类)
    |
    - - ExtClassLoader //负责加载扩展类(就是继承类和实现类)
    |
    - - AppClassLoader //负责加载应用类(程序员自定义的类)

    三个加载器各自完成自己的工作,但它们是如何协调工作呢?哪一个类该由哪个类加载器完成呢?为了解决这个问题,Java采用了委托模型机制。

    委托模型机制的工作原理很简单:当类加载器需要加载类的时候,先请示其Parent(即上一层加载器)在其搜索路径载入,如果找不到,才在自己的搜索路径搜索该类。这样的顺序其实就是加载器层次上自顶而下的搜索,因为加载器必须保证基础类的加载。之所以是这种机制,还有一个安全上的考虑:如果某人将一个恶意的基础类加载到jvm,委托模型机制会搜索其父类加载器,显然是不可能找到的,自然就不会将该类加载进来。

    我们可以通过这样的代码来获取类加载器:

    ClassLoader loader = ClassName.class.getClassLoader();
    ClassLoader ParentLoader = loader.getParent();

    注意一个很重要的问题,就是Java在逻辑上并不存在BootstrapKLoader的实体!因为它是用C++编写的,所以打印其内容将会得到null。
    前面是对类加载器的简单介绍,它的原理机制非常简单,就是下面几个步骤:

    
    

    1.装载:查找和导入class文件;

    
    

    2.连接:

    (1)检查:检查载入的class文件数据的正确性;

    (2)准备:为类的静态变量分配存储空间;

    (3)解析:将符号引用转换成直接引用(这一步是可选的)

    
    

    3.初始化:初始化静态变量,静态代码块。

    这样的过程在程序调用类的静态成员的时候开始执行,所以静态方法main()才会成为一般程序的入口方法。类的构造器也会引发该动作。

     
  • 相关阅读:
    centos crash debug
    go get Unknown SSL protocol error in connection to gopkg.in
    Tensorflow serving with Kubernetes
    Spring 集成 Swagger UI
    Docker Registry V2 Garbage Collection
    Docker Registry V2 with Nginx
    Zabbix磁盘性能监控
    Zabbix CPU utilization监控参数
    Windows挂载Gluster复制卷
    Redis持久化存储(三)
  • 原文地址:https://www.cnblogs.com/androidsj/p/5477510.html
Copyright © 2011-2022 走看看