广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >JAVA虚拟机(JVM)详细介绍(五)——类加载机制
  • 645
分享到

JAVA虚拟机(JVM)详细介绍(五)——类加载机制

java教程JVM 2015-12-28 20:12:58 645人浏览 无得
摘要

上篇中我们讲解了Class文件,这篇我们说说虚拟机是如何加载这些Class文件的?Class文件中的信息进入到虚拟机后会发生什么变化?这就涉及到了类加载机制。类加载机制是把类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始

上篇中我们讲解了Class文件,这篇我们说说虚拟机是如何加载这些Class文件的?Class文件中的信息进入到虚拟机后会发生什么变化?这就涉及到了类加载机制。

类加载机制是把类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的java类型。这一系列的过程都是在程序运行期间完成的。

类加载器

类加载器就是下图中红框的部分,它通过一个类的全限定名来获取描述此类的二进制字节流,从而将java类动态地加载进JVM的内存空间中。

20190619151934876.png

适用情景

对于一个非数组类的加载阶段,可以使用系统提供的引导类加载器来完成,也可以由用户自定义的类加载器去完成。
对于数组类而言,其由java虚拟机直接创建,不通过类加载器。

双亲委派机制

双亲委派机制是类加载所采取的一种方式。如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成。每一层的类加载器均是如此。只有当父加载器反馈自己无法完成这个请求时,子加载器才会尝试自己去加载。

20190619151231136.png

类比到现实:小明想买一个玩具挖土机,可他又不好意思直接张口说。所以,发生了下面的对话。

小明去问他爸爸:爸爸你有挖土机吗?
爸爸说:没有哎
接着爸爸问爷爷:爸爸爸爸,你有挖土机吗?
爷爷说:没有哎
接着爷爷问太爷爷:爸爸爸爸,你有挖土机吗?
太爷爷说:我也没有。让重孙子去买一个吧。
结果小明就高高兴兴地自己去买了一个玩具挖土机。

分类

启动类加载器是使用c++实现的,是虚拟机自身的一部分。
其它类加载器是由java语言实现的,独立于虚拟机外部,并且全都继承自抽象类java.lang.ClassLoader。

好处

以String类为例。就算是用户自己写了一个String类的实现,那对此类进行加载时,也只会委派给启动类加载器来对jdk中原本的String类进行加载,而自定义的String类永远不会被调用。这样保证了系统的安全

什么时候进行类加载?

有且只有以下5种方式必须立即对类进行加载

(1)使用new实例化对象的时候;读取或配置一个类的静态字段(被final修饰、已在编译期把结果放入常量池的静态字段除外)的时候;调用一个类的静态方法的时候。

(2)使用java.lang.reflect包的方法对类进行反射调用的时候。如果类没有进行过初始化,则需要先触发其初始化。

(3)当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。

(4)当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的类),虚拟机会先初始化这个主类

类加载过程详述

类加载过程分为5步。大部分都是由虚拟机主导和控制的,除了以下两种情形:

在加载阶段

开发人员可以通过自定义类加载器参与

在初始化阶段

会执行开发人员的代码去初始化类变量和其它资源

1、加载

虚拟机需要完成的事情:
(1) 通过一个类的全限定名来获取定义此类的二进制字节流。
(2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
(3)在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

20190619163630357.jpg

2、验证

验证的目的是确保Class文件的字节流中包含的信息符合当前虚拟机的要求,不会危害虚拟机自身的安全。
其分为4个步骤:文件格式验证,元数据验证,字节码验证,符号引用验证。其中文件格式验证是直接对字节流进行操作的,其余3项是在方法区中进行的。

3、准备

此阶段是正式为类变量分配内存并设置类变量初始值的阶段。其是在方法区中进行分配的。有两个注意点:

(1)此时只是对类变量(被static修饰的变量)进行内存分配,而不是对象变量。给对象分配内存是在对象实例化时,随着对象一起分配到java堆中。

(2)如果一个类变量没有被final修饰,则其初始值是数据类型的零值。比如int类型的是0,boolean类型的是false。举个例子来说明:

public static int value=123;

在准备阶段过后的初始值为0而不是123,因为这个时候尚未开始执行任何java方法,而把value赋值为123的putstatic指令是程序被编译后,存放于类构造器< clinit >()方法之中。所以把value赋值为123的动作将在初始化阶段才会执行。

public static final int value=123;

此时因为有final,所以在准备阶段value就已经被赋值为123了。

4、解析

解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。可对类或接口、字段、类方法、接口方法等进行解析。

符号引用是什么:

符号引用就是包含类的信息,方法名,方法参数等信息的字符串,它供实际使用时在该类的方法表中找到对应的方法。

直接引用是什么:

直接引用就是偏移量,通过偏移量可以直接在该类的内存区域中找到方法字节码的起始位置。
符号引用是告诉你此方法的一些特征,你需要通过这些特征去寻找对应的方法。直接引用就是直接告诉你此方法在哪。

5、初始化

此阶段用于初始化类变量和其它资源,是执行类构造器< clinit >()方法的过程,此时才是真正开始执行类中定义的java程序代码。

以上是对JAVA虚拟机类加载机制的详细讲解,更多相关问题请访问PHP中文网:JAVA视频教程

--结束END--

本文标题: JAVA虚拟机(JVM)详细介绍(五)——类加载机制

本文链接: https://www.lsjlt.com/news/3475.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JAVA虚拟机(JVM)详细介绍(五)——类加载机制
    上篇中我们讲解了Class文件,这篇我们说说虚拟机是如何加载这些Class文件的?Class文件中的信息进入到虚拟机后会发生什么变化?这就涉及到了类加载机制。类加载机制是把类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始...
    99+
    2015-12-28
    java教程 JVM
  • java类加载机制详细介绍
    文章转载自:http://www.pythonheidong.com/blog/article/1152/在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题:class Grandpa{ static ...
    99+
    2019-02-20
    java教程 java
  • Java 类加载机制详细介绍
    一、类加载器  类加载器(ClassLoader),顾名思义,即加载类的东西。在我们使用一个类之前,JVM需要先将该类的字节码文件(.class文件)从磁盘、网络或其他来源加载到内存中,并对字节码进行解析生成对应的Class对象,这就是类加...
    99+
    2023-05-31
    java 加载机制
  • JAVA虚拟机(JVM)详细介绍(一)——JVM概述
    首先,对以上的四部分进行解释。(1)自动内存管理讲的是java运行时数据区里的部分,分为内存划分和垃圾收集器。(2)执行子系统讲的是画红圈的三部分:类文件结构、类加载机制、字节码执行引擎。(3)优化分别为编译期优化和运行期优化。(4)并发讲...
    99+
    2016-06-30
    java教程 JVM
  • JAVA虚拟机(JVM)详细介绍(七)——JVM优化
    还以这个图为例,从.java到.class是编译过程,从.class到机器码是解释过程。下面对其进行分别优化。在优化过程中,对编译阶段的优化主要是对前端编译器的优化,在运行阶段的优化,主要是对即时编译器的优化。编译器优化编译过程以上为jav...
    99+
    2017-09-20
    java教程 JVM
  • jvm虚拟机类加载机制详解
    目录1 概述2 类的加载时机3 类的加载过程3.1 加载3.2 验证3.3 准备3.4 解析3.5 初始化4 类加载器4.1 双亲委派模型4.2 破坏双亲委派模型1 概述 ​ Jav...
    99+
    2022-11-13
  • JAVA虚拟机(JVM)详细介绍(三)——垃圾收集机制
    在上一篇中我们说过,自动内存管理分为两部分:给对象分配内存和回收分配给对象的内存。这篇我们说说后者,即回收分配给对象的内存。回收内存要用到垃圾收集机制,英文名儿是GC(Garbage Collection)。在本部分我们要解决如下几个问题:...
    99+
    2017-01-27
    java教程 JVM
  • JAVA虚拟机(JVM)详细介绍(四)——类文件结构
    讲完了自动内存管理,我们来说说执行子系统。执行子系统讲解的是JVM如何执行程序。Class文件概述这篇我们只讲讲Class文件。Class文件又名类文件或字节码文件。javac将.java文件(源代码)编译成.class文件(字节码),jv...
    99+
    2016-02-29
    java教程 JVM
  • Java虚拟机JVM类加载机制(从类文件到虚拟机)
    目录一、类加载机制简介二、类加载机制过程 2.1、加载(Load)2.2、连接(Linking)2.3、初始化(Initialize)三、类加载器Classloader&n...
    99+
    2022-11-12
  • JVM类加载机制及生命周期的详细介绍
    这篇文章主要讲解了“JVM类加载机制及生命周期的详细介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JVM类加载机制及生命周期的详细介绍”吧!一.目标:什么是类的加载?类的生命周期?类加载...
    99+
    2023-06-02
  • JAVA虚拟机(JVM)详细介绍(八)——高效并发
    内存模型内存模型是在特定的操作协议下,对特定的内存或高速缓存进行读写访问的过程抽象。其主要目标是定义程序中各个变量的访问规则。主内存和工作内存所有的变量都存储在主内存中,每条线程还有自己的工作内存,其工作内存中是被线程使用到的变量的主内存副...
    99+
    2017-08-31
    java教程 JVM
  • 【Java系列】Java虚拟机—类加载器介绍
    什么是Java虚拟机  Java虚拟机(Java Virtual Machine,JVM)是一个能够执行 Java 字节码的虚拟计算机。它是 Java 技术的核心部分,是 Java 应用程序运行的基础。 Java 程序在编译后会...
    99+
    2023-09-01
    java 开发语言 原力计划
  • 详细分析JVM类加载机制
    目录前言1. jvm 的组成2. 类加载1. 加载  2. 链接3. 初始化3. 类加载器引导类加载器(启动类加载器)扩展类加载器应用程序类加载器4. 双亲委派机...
    99+
    2022-11-13
  • java虚拟机JVM类加载机制原理(面试必问)
    目录1、类加载的过程。1)加载2)验证3)准备4)解析5)初始化2、Java 虚拟机中有哪些类加载器?1)启动类加载器(Bootstrap ClassLoader):2)扩展类加载器...
    99+
    2022-11-12
  • JAVA虚拟机(JVM)详细介绍(六)——字节码执行引擎
    JVM中的执行引擎在执行java代码的时候,一般有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择。栈帧定义:栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,它位于虚拟机栈里面。作用:每个方法从调用开始到...
    99+
    2014-07-03
    java教程 JVM
  • Android虚拟机与类加载机制详情
    目录JVM与Dalvik基于栈的虚拟机字节码指令执行过程基于寄存器的虚拟机寄存器基于寄存器的虚拟机ART与Dalvikdex2aotdexopt与dexaotAndroid N的运作...
    99+
    2022-11-13
  • java虚拟机原理:类加载过程详解
    目录一、Java 类加载过程1、字节码编译2、加载3、连接4、初始化总结一、Java 类加载过程 1、字节码编译 编写好 Java 源码 Student.java , 使用 ja...
    99+
    2022-11-12
  • 如何深入理解Java虚拟机JVM类加载初始化
    如何深入理解Java虚拟机JVM类加载初始化,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 Classloader的作用,概括来说就是将编译后的class装载、...
    99+
    2023-06-17
  • Java虚拟机类加载器之双亲委派机制模型案例
    1. 双亲委派模型是什么? 当某个类加载器需要加载某个.class字节码文件时,它首先把这个任务委托给它的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类...
    99+
    2022-11-12
  • Java虚拟机之对象创建过程与类加载机制及双亲委派模型
    目录一、对象的创建过程: 1、对象的创建过程:2、对象的访问方式:二、类加载机制:2.1、加载阶段:2.2、验证阶段:2.3、准备阶段:2.4、解析阶段:2.5、初始化:2...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作