jvm讲解一:类的加载、连接和初始化

类的加载:

类的加载是指将类的class文件读入内存中,并为之创建一个java.lang.Class对象,也就是当程序使用任何类是,系统都会为之建立一个java.lang.Class对象(也可以说类是java.lang.Class的实例,详情请百度‘java.lang.Class’)

类的加载使用类加载器完成,JVM提供了几种类加载器以完成类的加载。除此之外,开发者可以通过继承ClassLoader来创建自己的类加载器。

通常可以使用不同的类加载器从不同的来源加载类的二进制数据:

 
从本地文件系统加载class文件,这是通常情况下的类加载方式

 
从jar包加载class文件,这种方式也是很常见的,例如:JDBC编程时用到的数据库驱动加载Class.forName("");就是放在jar包中,JVM可以从jar中直接加载改class文件。

 
通过网络加载class文件

 
把一个java源文件动态编译,并执行加载

类加载器通常无需等到“首次使用”该类时才加载该类,Java虚拟机规范允许系统预先加载某些类。

类的连接:

当类被加载后,系统会生成一个对应的Class对象,接着将会进入到连接阶段,连接阶段负责把类的二进制数据合并到JRE中。类连接又可分为以下三个阶段。

  验证:
验证阶段由于检查被加载的类的内部结构是否正确,并协调与其他类的关系型

  准备:
类准备阶段负责为类变量分配内存,并设置默认的初始值

  解析:
将类的二进制数据长得符号引用替换成直接引用

类的初始化:

虚拟机负责对类进行初始化,主要是对类变量的初始化。在Java类中对类变量之低昂初始值有两种方式:①舍命类变量时指定初始值;②使用静态初始化块为类变量指定初始值。
如下所示:

public class Test
{

    // 声明变量a时指定初始值
    static int a = 5;
    static int b = 9;         // ①
    static int c;
    static
    {
        // 使用静态初始化块为变量b指定出初始值
        b = 6;
        System.out.println("----------");
    }
    ......
}

程序为类变量a、b都显式指定了初始值,分别是5/6,但类变量c则没有指定,它采取默认值0;

声明变量时指定初始值,静态初始化快都将被当成类的初始化语句,JVM会按照这些语句在程序中的排序顺序依次执行它们

如下所示:

public class Test
{
    static
    {
        // 使用静态初始化块为变量b指定出初始值
        b = 6;
        System.out.println("----------");
    }
    // 声明变量a时指定初始值
    static int a = 5;
    static int b = 9;         // ①
    static int c;
    public static void main(String[] args)
    {
        System.out.println(Test.b);
    }
}

上面的代码现在静态初始化块中为b赋值为6;接着程序向下执行,执行到①号代码处,由于这行也属于该类的初始化语句,所以在此为b变量赋值。最终b变为9。
JVM初四花一个类包含如下几个步骤:

 
假如这个类还没有被加载和连接,则程序先加载并连接该类。

 
假如该类的父类还没有被初始化,则先初始化其直接父类。

 
假如类中有初始化语句,则系统依次执行这些初始化语句。

补充②:当系统初始化直接父类时,也是按照这三个步骤;当直接父类还有父类时,则再次重复这三个步骤......以此类推,所以JVM最先初始化的总是java.lang.Object。

时间: 2024-11-11 00:41:16

jvm讲解一:类的加载、连接和初始化的相关文章

类的加载.连接与初始化

加载:查找并加载类的二进制数据 连接: -验证:确保被加载的类的正确性, -准备:为类的静态变量分配内存,并将其初始化为默认值 -解析:把类中的符号引用转换为直接引用 初始化:为类的静态变量赋予正确的初始值 ============================================================================ 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Cl

类的加载连接以及初始化

类加载 JAVA程序对于类的使用可以分为两个方式: 一:主动使用 二:被动使用 JAVA程序只有对类时主动使用,才完成类的初始化 那?怎么才算对类的初始化呢? 以下便是对类的初始化几个类型 创建类的实例 访问某个类或接口的静态变量,或者对该静态变量赋值 调用类的静态方法 反射 初始了继承该类的子类 JAVA虚拟机启动的时候就已经注明为启动的类 说完了主动使用,还差被动使用呢?为了顺便理解一部分主动加载,可以看下面的代码哦 package com.waibizi; public class dem

JVM中java类的加载时机(转载:http://blog.csdn.net/chenleixing/article/details/47099725)

Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的加载机制.类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括了:加载(Loading).验证(Verification).准备(Preparation).解析(Resolution).初始化(Initialization).使用(using).和卸载(Unloading)七个阶段.其中验证.准备和解析三个部分统称为连接(Linki

JVM中java类的加载时机

Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的加载机制. 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括了:加载(Loading).验证(Verification).准备(Preparation).解析(Resolution).初始化(Initialization).使用(using).和卸载(Unloading)七个阶段.其中验证.准备和解析三个部分统称为连接(Link

java 类的加载、连接和初始化

JVM和类 调用Java命令运行Java程序时,该命令将会启动一条Java虚拟机进程,不管该Java程序启动了多少条线程,创建了多少个变量,它们都处于该Java虚拟机进程里,共享该JVM进程的内存区.当系统出现以下几种情况时,JVM进程将被终止: 程序运行到最后正常结束: 程序运行到使用System.exit()或Runtime.getRuntime.exit()代码结束程序: 程序运行过程中遇到未捕获的异常或错误而结束: 程序所在的平台强制结束了JVM进程. 类的加载 当程序主动使用某个类时,

java 类的加载过程

ClassLoader的主要职责就是负责各种class文件到jvm中,ClassLoader是一个抽象的class,给定一个class文件的二进制名,ClassLoader会尝试加载并且在jvm中生成构建这个类的各个数据结构,然后使其分布在对应的内存区域中. 1类的加载过程简介 类的记载过程一般分为三个比较大的阶段,分别是加载阶段,连接阶段和初始化阶段,如下图所示 加载阶段:主要负责查找并且加载类的二进制数据文件,其实就是class文件. 连接阶段:连接阶段所做的工作比较多,细分的话还可以分为如

JVM 1.类的加载、连接、初始化

Java类的加载是由类加载器来完成的,过程如下: 首先,加载是把硬盘.网络.数据库等的class文件中的二进制数据加载到内存的过程,然后会在Java虚拟机的运行时数据区的堆区创建一个Class对象,用来描述该类,再在方法区存放这些二进制数据,用来保存类对应的数据结构 Java的类加载器有哪些? 下面的String对象是由bootstrap根类加载器加载的,而自定义类C是由系统加载器加载的: /** * 源文档中这样描述: * Some implementations may use null t

(二十六)类加载机制和类的加载、连接(验证、准备、解析)和初始化

一.概念 在代码编译后,就会生成JVM(Java虚拟机)能够识别的二进制字节流文件(*.class).而JVM把Class文件中的类描述数据从文件加载到内存,并对数据进行校验.转换解析.初始化,使这些数据最终成为可以被JVM直接使用的Java类型,这个说来简单但实际复杂的过程叫做JVM的类加载机制. Class文件中的"类"从加载到JVM内存中,到卸载出内存过程有七个生命周期阶段.类加载机制包括了前五个阶段. 如下图所示: 其中,加载.验证.准备.初始化.卸载的开始顺序是确定的,注意,

【转】JVM类的加载与初始化

版权声明: 本文原创作者:书呆子Rico 作者博客地址:http://blog.csdn.net/justloveyou_/ 摘要: 我们知道,一个.java文件在编译后会形成相应的一个或多个Class文件,这些Class文件中描述了类的各种信息,并且它们最终都需要被加载到虚拟机中才能被运行和使用.事实上,虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型的过程就是虚拟机的类加载机制.本文概述了JVM加载类的时机和生命周