×
新网 > 虚拟主机 > 正文

深入java虚拟机

  • 作者:新网
  • 来源:新网
  • 浏览:100
  • 2018-05-14 10:24:35

类加载器,顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。

        类加载器,顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。

t01804c593338b31ca5.jpg

<div>         每个这样的实例用来表示一个 Java 类。通过此实例的 newInstance()方法就可以创建出该类的一个对象。实际的情况可能更加复杂,比如 Java 字节代码可能是通过工具动态生成的,也可能是通过网络下载的。基本上所有的类加载器都是 java.lang.ClassLoader类的一个实例。其实我们研究类加载器主要研究的就是类的生命周期。
  首先来了解一下jvm(java虚拟机)中的几个比较重要的内存区域,这几个区域在java类的生命周期中扮演着比较重要的角色:
  方法区:在java的虚拟机中有一块专门用来存放已经加载的类信息、常量、静态变量以及方法代码的内存区域,叫做方法区。
  常量池:常量池是方法区的一部分,主要用来存放常量和类中的符号引用等信息。
  堆区:用于存放类的对象实例。
  栈区:也叫java虚拟机栈,是由一个一个的栈帧组成的后进先出的栈式结构,栈桢中存放方法运行时产生的局部变量、方法出口等信息。当调用一个方法时,虚拟机栈中就会创建一个栈帧存放这些数据,当方法调用完成时,栈帧消失,如果方法中调用了其他方法,则继续在栈顶创建新的栈桢。
  类的生命周期
  当我们编写一个java的源文件后,经过编译会生成一个后缀名为class的文件,这种文件叫做字节码文件,只有这种字节码文件才能够在java虚拟机中运行,java类的生命周期就是指一个class文件从加载到卸载的全过程。一个java类的完整的生命周期会经历加载、连接、初始化、使用、和卸载五个阶段,当然也有在加载或者连接之后没有被初始化就直接被使用的情况,这里我们主要来研究类加载器所执行的部分,也就是加载,链接和初始化。
  下面我先简单看一下类加载器所执行的三部分的简单介绍
  1、加载:查找并加载类的二进制数据
  2、连接
  –验证:确保被加载的类的正确性
  –准备:为类的静态变量分配内存,并将其初始化为默认值
  –解析:把类中的符号引用转换为直接引用
  3、初始化:为类的静态变量赋予正确的初始值
  从上边我们可以看出类的静态变量赋了两回值。这是为什么呢?原因是,在连接过程中时为静态变量赋值为默认值,也就是说,只要是你定义了静态变量,不管你开始给没给它设置,我系统都为他初始化一个默认值。到了初始化过程,系统就检查是否用户定义静态变量时有没有给设置初始化值,如果有就把静态变量设置为用户自己设置的初始化值,如果没有还是让静态变量为初始化值
  类的加载、连接和初始化
  类的加载
  类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构 。这里的class对象其实就像一面镜子一样,外面是类的源程序,里面是class对象,它实时的反应了类的数据结构和信息。
  加载.class文件的方式
  1、从本地系统中直接加载
  2、通过网络下载.class文件
  3、从zip,jar等归档文件中加载.class文件
  4、从专有数据库中提取.class文件
  5、将Java源文件动态编译为.class文件
  类的加载过程
  结论:
  1、类的加载的最终产品是位于堆区中的Class对象
  2、Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口
  Java虚拟机给我们提供了两种类加载器:
  1、Java虚拟机自带的加载器
  1)根类加载器(使用C++编写,程序员无法在Java代码中获得该类)
  2)扩展加载器,使用Java代码实现
  3)系统加载器(应用加载器),使用Java代码实现
  2、用户自定义的类加载器
  java.lang.ClassLoader的子类
  用户可以定制类的加载方式

免责声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,也不承认相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,请发送邮件至:operations@xinnet.com进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

免费咨询获取折扣

Loading