iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >JVM加载class文件的原理机制是什么
  • 761
分享到

JVM加载class文件的原理机制是什么

2023-06-30 11:06:42 761人浏览 八月长安
摘要

今天小编给大家分享一下JVM加载class文件的原理机制是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、JVM简介J

今天小编给大家分享一下JVM加载class文件的原理机制是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

一、JVM简介

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

Java语言的一个非常重要的特点就是与平台的 无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改的运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的及其指令执行。这就是Java能够“一次编译,到处运行”的原因。

二、JVM的组成部分

JVM加载class文件的原理机制是什么

由图可以看出,JVM是运行在操作系统之上的,它与硬件没有直接的交互。

JVM加载class文件的原理机制是什么

类加载器 Class Loader

类加载器的作用是加载类文件到内存,比如编写一个HelloWorld.java程序,然后通过javac编译生成class文件。由Class Loader将class文件加载到内存中。但是Class Loader加载class文件有格式要求。
注意:Class Loader只管加载,只要符合文件结构就加载,至于能不能运行,是由Execution Engine负责。
2. 执行引擎 Exexution Engine
执行引擎也叫作解释器,负责解释命令,提交操作系统执行。
3. 本地接口 Native Interface
本地接口的作用是为了融合不同的编程语言为Java所用。它的初衷是为了融合C/C++程序,Java诞生的时候是C/c++横行的时候,要想立足,必须要有一个聪明的、睿智的调用C/C++程序,于是就在内存中专门开辟了一块区域处理标记为native的代码,它的具体做法是Native Method Stack中登记native方法,在Execution Engine执行时加载加载native libraries。目前该方法只有在与硬件有关的应用中才会使用,在企业级应用中已经比较少见,因为现在的异构领域间的通信很发达,比如可以使用Socket通信,也可以使用WEBService等。
4. 运行数据区 Runtime data area
运行数据区使整个JVM的重点。我们所写的程序都被加载到这里,之后才开始运行,Java生态系统如此的繁荣,得益于该区域的优良自治。

三、JVM加载class文件的原理机制

Java中的所有类,必须被装载到JVM中才能运行,这个装载工作是由JVM中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中,作用就是在运行时加载类。
Java类加载器基于三个机制:委托、可见性和单一性。
(1)委托机制是指加载一个类的请求交给父类加载器,如果这个父类加载器不能够找到或加载这个类,那么再加载它。
(2)可见性的原理是子类的加载器可以看见所有的父类加载器加载的类,而父类加载器看不到子类加载器加载的类。
(3)单一性原理是指一个类仅被加载一次,这是由委托机制确保子类加载器不会再次加载父类加载器加载过的类。
2. Java中的类大致分为三种:
(1)系统类
(2)扩展类
(3)由程序员自定义的类
3. 类装载有两种方式
(1)隐式装载:
程序在运行过程中当碰到通过new等方式生成类或者子类对象、使用类或者子类的静态域时,隐式调用类加载器加载对应的的类到JVM中。
(2)显式装载:
通过调用Class.forName()或者ClassLoader.loadClass(className)等方法,显式加载需要的类。
4. 类加载的动态性体现
一个应用程序总是由n多个类组成,Java程序启动时,并不是一次把所有的类全部加载再运行,他总是把保证程序运行的基础类一次性加载到JVM中,其他类等到JVM用到的时候再加载,这样是为了节省内存的开销,因为Java最早就是为嵌入式系统而设计的,内存宝贵,而用到时再加载这也是Java动态性的一种体现。
5. Java类加载器
Java中的类加载器实质上也是也是类,功能是把类加载入JVM中,值得注意的是JVM的类加载器有三个,原因有:一方面是为了分工明确,各自负责各自的区块,另一方面为了实现委托模型。
层次结构如下:
BootStrap Loader(引导类加载器) ----- 负责加载系统类

ExtClassLoader(扩展类加载器) ----- 负责加载扩展类
AppClassLoade(应用类加载器)r ----- 负责加载应用类
6. 类加载器之间如何协调工作的
Java中有三个类加载器,碰到一个类需要加载时,Java采用委托模型机制来协调和区分该由哪个类加载器完成。简单来说就是,“类装载器有载入类的需求时,会先请示其Parent使用其搜索路径帮忙载入”,如果Parent找不到,那么才由自己依照自己的搜索路径搜索类。
实例一:

package ClassLoaderTest;public class ClassLoaderTest {    public static void main(String[] args) {        ClassLoader c1 = ClassLoaderTest.class.getClassLoader();        System.out.println(c1);        ClassLoader c1Parent = c1.getParent();        System.out.println(c1Parent);        ClassLoader c1Root = c1Parent.getParent();        System.out.println(c1Root);    }}

执行结果:

JVM加载class文件的原理机制是什么

可以看出ClassLoaderTest是由AppClassLoader加载器加载的。AppClassLoader的Parent加载器是ExtClassLoader。但是ExtClassLoader的Parent是null,在Java中是无法获取的。
实例二:

public class Test2 {    public void test(){        System.out.println(Test2.class);        System.out.println(this.getClass());        System.out.println(Test2.class.getClassLoader());    }}public class Test1 {    public static void main(String[] args) {        System.out.println(Test1.class.getClassLoader());        Test2 test2 = new Test2();        test2.test();    }}

执行结果:

JVM加载class文件的原理机制是什么

预先加载和依需求加载
Java运行环境为了优化系统,提高程序的执行速度,在JRE运行的开始会将Java运行所需要的基本类采用预先加载(pre-loading)的方法全部加载到内存当中,因为这些单元在Java程序运行的过程当中要经常使用的,主要包括JRE的rt.jar文件里面所有的.class文件。
当java.exe虚拟机开始运行以后,它会找到安装在机器上的JRE环境,然后把控制权交给JRE,JRE的类加载器会自动将lib目录下的rt.jar基础类别文件库加载进内存,这些文件是Java程序执行所必需的,所以系统在开始就将这些文件加载,避免以后的多次IO操作,从而提高程序执行效率。然而我们在程序中需要使用自定义的类的时候就要使用依需求加载(load-on-demand)的方式,就是在Java程序需要用到的时候再加载,以减少内存的消耗。
8. ClassLoader中一些 重要的方法

JVM加载class文件的原理机制是什么

什么地方适用类加载器
最经典的例子就是AppletClassLoader,他被用来加载Applet使用的类,而Applet大部分是在网上使用,而非本地的操作系统使用。使用不同的类加载器,你可以从不同的源地址加载同一个类,它们被视为不同的类。J2EE使用多个类加载器加载不同地方的类,例如War文件由Web-app类加载器加载,而EJB-JAR中的类由另外的类加载器加载。有些服务器也支持热部署,这是由类加载器实现。你也可以使用类加载器来加载数据库或者其他持久层的数据。
10. 类加载器的阶层体系
Java类加载器的工作原理:
当执行Java的.class文件的时候,java.exe会帮助我们找到jRE,接着找到JRE内部的jcm.dll,这才是真正的Java虚拟机器,最后加载动态库,激活Java虚拟机器。虚拟机激活以后,会先做一些初始化的动作,比如说读取系统参数等。一旦初始化动作完成后,就会产生第一个类加载器-----Bootstrap Loader,Bootstrap Loader是由C++撰写而成,这个Bootstrap所做的初始工作中,除了一些基本的初始化动作之外,最重要的就是加载Launcher.java之中的ExtClassLoader,并设定其parent为null,代表其父加载器为BootstrapLoader。然后Bootstrap loader再要求加载Launcher.java之中的AppClassLoader,并设定其parent为之前产生的ExtClassLoader实体。这两个类加载器都是以静态类的形式存在的。注意:Launcher E x t C l a s s L o a d e r . c l a s s 与 L a u n c h e r ExtClassLoader.class与Launcher ExtClassLoader.class与LauncherAppClassLoader.class都是由Bootstrap Loader所加载,所以Parent和由哪个类加载器加载没有关系。
三者之间的关系:
Bootstrap Loader <&mdash;(extends)-----ExtClassLoader <&mdash;(extends)&mdash;AppClassLoader
这三个类加载器构成了Java的类加载体系。它们分别从以下的路径寻找程序所需要的类:
Bootstrap Loader:sun.boot.class.path
ExtClassLoader:java.ext.dirs
AppClassLoader:java.class.path
这三个参数可以通过System.getProperty()函数得到具体对应的路径。

以上就是“JVM加载class文件的原理机制是什么”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: JVM加载class文件的原理机制是什么

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

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

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

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

下载Word文档
猜你喜欢
  • JVM加载class文件的原理机制是什么
    今天小编给大家分享一下JVM加载class文件的原理机制是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、JVM简介J...
    99+
    2023-06-30
  • JVM加载class文件的原理机制实例详解
    目录一、JVM简介二、JVM的组成部分三、JVM加载class文件的原理机制一、JVM简介 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于...
    99+
    2022-11-13
  • JVM类加载机制过程以及原理是什么
    这篇文章主要介绍“JVM类加载机制过程以及原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JVM类加载机制过程以及原理是什么”文章能帮助大家解决问题。一、做一个小测试通过注释,标注出下面两个...
    99+
    2023-07-05
  • jvm类加载器,类加载机制是什么
    这篇文章主要介绍“jvm类加载器,类加载机制是什么”,在日常操作中,相信很多人在jvm类加载器,类加载机制是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”jvm类加载器,类加载机制是什么”的疑惑有所帮助!...
    99+
    2023-06-16
  • 一篇文章弄懂JVM类加载机制过程以及原理
    目录一、做一个小测试二、类的初始化步骤:三、看看你写对了没?四、类的加载过程五、类加载器的分类1、启动类加载器(引导类加载器)2、扩展类加载器3、应用程序类加载器(系统类加载器)六、...
    99+
    2023-02-07
    jvm加载类的过程和机制 jvm加载类原理机制 java类加载原理
  • SpringBoot中bootstrap.properties文件加载的原理是什么
    这篇文章主要介绍“SpringBoot中bootstrap.properties文件加载的原理是什么”,在日常操作中,相信很多人在SpringBoot中bootstrap.properties文件加载的原理是什么问题上存在疑惑,小编查阅了各...
    99+
    2023-06-22
  • Node.js中模块加载机制的原理是什么
    这期内容当中小编将会给大家带来有关Node.js中模块加载机制的原理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。简单例子老规矩,讲原理前我们先来一个简单的例子,从...
    99+
    2022-10-19
  • SpringBoot属性文件加载原理是什么
    本篇内容介绍了“SpringBoot属性文件加载原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言首先我们来看一个问题。就是我们在...
    99+
    2023-06-29
  • jvm垃圾回收机制的原理是什么
    JVM(Java虚拟机)的垃圾回收机制是自动管理内存的一种机制,它通过识别和释放不再被程序使用的对象,以防止内存泄漏和内存溢出等问题...
    99+
    2023-09-25
    jvm
  • Java中类加载机制及热部署的原理是什么
    这篇文章主要介绍了Java中类加载机制及热部署的原理是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、什么是类加载类的加载指的是将类的.class文件的二进制数据读入到...
    99+
    2023-06-15
  • Java反射机制原理和Class获取方式是什么
    这篇文章主要讲解了“Java反射机制原理和Class获取方式是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java反射机制原理和Class获取方式是什么”吧!一、Java反射机制是什么...
    99+
    2023-06-29
  • PHP插件机制的原理是什么
    这篇文章主要讲解了“PHP插件机制的原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP插件机制的原理是什么”吧!插件,亦即Plug-in,是指一类特定的功能模块(通常由第三方开发...
    99+
    2023-06-17
  • Java类的加载机制是什么
    这篇文章主要讲解了“Java类的加载机制是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java类的加载机制是什么”吧!1、什么是类的加载类的加载指的是将类的.class文件中的二进制数...
    99+
    2023-06-17
  • require加载器的原理是什么
    这篇文章给大家介绍require加载器的原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.node模块化的实现node中是自带模块化机制的,每个文件就是一个单独的模块,并且它遵循的是CommonJS规范,也就...
    99+
    2023-06-14
  • node中事件机制的原理是什么
    今天就跟大家聊聊有关node中事件机制的原理是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Publish/Subscribe(发布/订阅模式)...
    99+
    2022-10-19
  • webpack的异步加载原理是什么
    这篇文章主要讲解了“webpack的异步加载原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“webpack的异步加载原理是什么”吧!webpack ...
    99+
    2022-10-19
  • AngularJS 事件发布机制的原理是什么
    AngularJS 事件发布机制的原理是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。未读消息提醒当器具用户或技术机构对非...
    99+
    2022-10-19
  • php加载文件的方法是什么
    这篇文章主要介绍php加载文件的方法是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php加载文件的方法:1、使用“include '文件名'”语句加载;2、使用“require '文件名...
    99+
    2023-06-15
  • node中koa中间件机制的原理是什么
    今天就跟大家聊聊有关node中koa中间件机制的原理是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。koakoa是由express原班人马打造的...
    99+
    2022-10-19
  • node.js中事件轮询机制的原理是什么
    node.js中事件轮询机制的原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。借助libuv库实现的概括事件轮询机制:分为六个阶段...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作