zoukankan      html  css  js  c++  java
  • 描述一下JVM加载class文件的原理机制?

    当程序主动使用某个类时,如果该类还未被加载到内存中,系统会通过

    加载

    连接

    初始化

    三个步骤来对该类进行初始化,如果没有意外,JVM将会连续完成这三个步骤,所以有时也把这三个步骤统称为类加载或类初始化。

    类加载指的是将类的class文件读入内存,并为之创建一个java.lang.Class对象,也就是说当程序中使用任何类时,系统都会为之建立一个java.lang.Class对象。

    类的加载由类加载器完成,类加载器通常由JVM提供,这些类加载器也是我们前面所有程序运行的基础,JVM提供的这些类加载器通常被称为系统类加载器。除此之外,开发者可以通过继承ClassLoader基类来创建自己的类加载器。

    通过使用不同的类加载器,可以从不同来源加载类的二进制数据,通常有如下几种来源:

    A.从本地文件系统来加载class文件,这是前面绝大部分类加载方式。

    B.从JAR包中加载class文件,这种方式也是很常见的,前面介绍JDBC编程时用到的数据库驱动类就是放在JAR文件中,JVM可以从JAR文件中直接加载该class文件。

    C.通过网络加载class文件。

    D.把一个Java源文件动态编译、并执行加载。

    JVM启动时,会形成由三个类加载器组成的初始类加载器层次结构:

    1Bootstrap ClassLoader:根类加载器。

    2Extension ClassLoader:扩展类加载器。

    3System ClassLoader:系统类加载器。

    Bootstrap ClassLoader被称为引导(也称为原始或根)类加载器。它负责加载Java的核心类。在SunJVM中,当执行java.exe的命令时使用-Xbootclasspath选项或使用-D选项指定sun.boot.class.path系统属性值可以指定加载附加的类。

    Extension Classloader被称为扩展类加载器,它负责加载JRE的扩展目录(%JAVA_HOME%/jre/lib/ext或者由java.ext.dirs系统属性指定的目录)中JAR包的类。

    通过这种方式,我们就可以为Java扩展核心类以外的新功能,只要我们把自己开发的类打包成JAR文件,然后放入JAVA_HOME/jre/lib/ext路径即可(对于笔者的安装环境来说,扩展路径为:D:/Java/jdk1.7.0/jre/lib/ext)。

    System Classloader被称为系统(也称为应用)类加载器,它负责在JVM启动时加载来自java命令的-classpath选项、java.class.path系统属性,或CLASSPATH环境变量所指定的JAR包和类路径。程序可以通过ClassLoader的静态方法getSystemClassLoader()获取系统类加载器。如果没有特别指定,则用户自定义的类加载器都以类加载器作为父加载器。

    Java Program!
  • 相关阅读:
    Mysql 重做日志及与二进制日志的区别
    【MySql】性能优化之分析命令
    ubuntu一些基本软件安装方法
    Linux学习笔记
    exp/imp三种模式——完全、用户、表
    Oracle学习日志20150302
    如何在macOS Sierra中运行CORE Keygen破解程序
    国内各大互联网公司技术站点集合
    React Native资料
    React Native集成到现有项目(非cocoa pods)
  • 原文地址:https://www.cnblogs.com/programb/p/14068549.html
Copyright © 2011-2022 走看看