首页 > 其他分享 >JVM-part1-类加载子系统组成,及流程

JVM-part1-类加载子系统组成,及流程

时间:2024-04-21 18:33:22浏览次数:27  
标签:文件 Java ClassLoader 子系统 part1 阶段 JVM Class 加载

类加载子系统的作用:

将所需要的Class文件进行加载,加载流程存在一下几个阶段:

  1. 第一个阶段为加载阶段(Loading阶段):这个阶段是将引导类加载器和非引导类加载器需要加载的Class文件进行加载。
    具体来说:
  • 引导类加载器(BootStrapClassLoader):这个加载器的作用是将java_home/jre/lib下的Class文件进行加载,它是由C、C++语言编写的,通过getClassLoader().parent()的方式进行获取的结果为null
  • 非引导类加载器:也就是通过Java代码编写的类加载器(继承java.lang.ClassLoader),它有三部分:
    • 扩展类加载器(Extension ClassLoader):这是引导类加载器之后的第二优先级的加载器,通常负责加载Java的扩展库,也就是位于JDK的jre/lib/ext目录下或者由系统变量java.ext.dirs指定的路径下的类或包。
    • 应用类加载器(Application ClassLoader):也称为系统类加载器,这是ClassLoader层次结构中的第三级,它负责加载CLASSPATH上指定的类库。它是Java应用程序默认使用的类加载器。
    • 用户自定义类加载器(Custom ClassLoader):用户可以创建自己的类加载器,这些类加载器一般继承自ClassLoader类或其子类,以实现特殊的类加载逻辑,比如从特定的存储介质(网络、加密文件等)加载类和资源。

(注意哈,它们之间的关系是层级关系,类似于文件夹,引导>拓展>引用>自定义)

说到类加载器就涉及到了双亲委派机制:
什么是双亲委派机制:简单来说就是在加载一个Class文件的时候都会寻找上级,看上级是否能加载这个Class文件,如果所有的上级都不行,才轮到自己加载

为什么要使用这种机制:使用这种机制就可以解决类重复加载问题,也可以为Java的核心类如String呀起一个保护作用

2.第二个阶段为连接阶段(Linking阶段):Linking阶段分为三个阶段,分别为

  • 校验阶段(Verify):他的作用是确保加载的Class文件是合法的,是否符合Java虚拟机的规划要求,具体分为
    • 格式校验:验证Class文件结构是否正确,例如字节码文件是不是以CAFEBABE开头等
    • 安全校验:验证Class文件是否对虚拟机产生危害等等
      ...
  • 准备阶段(Perpare):这个阶段的作用是为类中的类变量(静态变量)在方法区(元空间)分配内存并赋默认值,这里需要注意,如果是static修饰并且用final修饰的变量会在分配了内存之后直接赋值(因为final修饰的变量不能进行修改,所以就在分配内存之后就进行赋值)
  • 解析阶段(Resolve):它的主要作用是将常量池(Constant Pool)中的符号引用转化为直接引用(内存地址),这里可以通过javap -v xxx.class 文件将class文件转化为字节码之后进行观察Constant Pool部分。

3.第三个阶段为初始化阶段(Initialization阶段):将准备阶段中的静态变量进行赋值,执行静态代码块(执行clinit部分)

标签:文件,Java,ClassLoader,子系统,part1,阶段,JVM,Class,加载
From: https://www.cnblogs.com/just1t/p/18149310

相关文章

  • GraalVM-云原生时代的JVM(Java)
    一、GraalVM是什么?GraalVM是Oracle开源的一款通用虚拟机产品,官方称之为UniversalGraalVM,是新一代的通用多语言高性能虚拟机。它可以运行多种编程语言,如Java、JavaScript、Python等,并提供了即时编译(JIT)和AOT编译(AOT)的支持。GraalVM还支持在不同语言之间互相调用,以及嵌入到其他......
  • JVM——面试
    https://juejin.cn/post/6998527815964426271https://juejin.cn/post/7101120209540349959垃圾回收器Serial(新生代)+SerialOld(老年代)特点:单线程垃圾回收器,垃圾回收过程中需要STW,适用于运行在Client模式下的虚拟机;新生代标记复制算法,老年代标记整理算法。ParNew(新......
  • 无源RLC电路和阻抗匹配 part1:串并联RLC网络
    串联RLC网络回路阻抗Z(jw)=R+jwL+1/jwC;回路阻抗幅值与相角分别为当wL=1/wC时,即w=w0=1/LC,阻抗幅值达到最小值,此时回路阻抗为纯电阻R,在输入激励vi下,电流达到最大值并与vi同相,w0即为谐振频率。w<w0时,回路呈容性,阻抗相角趋近-π/2;w>w0时,回路呈感性,阻抗相角趋近π/2。品质因......
  • JVM学习笔记
    1.运行时数据区1.2运行时数据区及线程概述JVM将内存划分为俩种类型的数据区域线程共享:JVM启动时创建,退出时才销毁线程私有:线程创建时创建,线程退出时销毁1.2.1运行时数据区JVM内存布局规定了Java运行过程中内存申请,分配,管理的策略,保证高效运行。不同JVM在内存划分和管理......
  • wsl命令之子系统网络端口映射
    查看端口映射netshinterfaceportproxyshowall添加映射#netshinterfaceportproxyaddv4tov4listenport=[win10端口]listenaddress=0.0.0.0connectport=[虚拟机的端口]connectaddress=[虚拟机的ip]netshinterfaceportproxyaddv4tov4listenport=80listenadd......
  • JVM性能优化 —— 类加载器,手动实现类的热加载
    一、类加载的机制的层次结构每个编写的”.java”拓展名类文件都存储着需要执行的程序逻辑,这些”.java”文件经过Java编译器编译成拓展名为”.class”的文件,”.class”文件中保存着Java代码经转换后的虚拟机指令,当需要使用某个类时,虚拟机将会加载它的”.class”文件,并创建对应的cl......
  • 在Windows中使用Linux子系统
    摘要本文描述如何在Windows11中使用Ubuntu。安装1、打开Windows可选功能2、安装Linux的内核补丁https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package3、安装Linux子系统在“Windows应用商店”里就能找......
  • 社交圈子系统,包含Uni前端源码 ,App+H5+小程序 ,后端thinkphp源码+商业版
    系统介绍系统基于TP6+Uni-app框架开发;客户移动端采用uni-app开发,管理后台TH6开发。系统支持微信公众号端、微信小程序端、H5端、PC端多端账号同步,可快速打包生成APP;我们为你准备了完善的后台管理,不需要你懂PHP,按照教程10分钟安装完即可使用,堪比深夜的杜蕾斯还方便。......
  • 传输线理论part1:电报方程
    传输线与导线的区别由于射频信号的波长较短,导致信号波长与电路物理尺寸可以比拟(几分之一到几个波长),进而在电路两端产生相位差。另外由于电路的寄生电感、寄生电容变得不可被忽略,最终导致信号在传输线两端产生电压、电流差。由于以上原因,传输线中的信号传输需要用麦克斯韦方程......
  • 【异常】FATAL ERROR in native method: JDWP loaded classes, jvmtiError=JVMTI_ERRO
    一、异常内容IDEA启动微服务之后,提示FATALERRORinnativemethod:JDWPloadedclasses,jvmtiError=JVMTI_ERROR_OUT_OF_MEMORY(110)FATALERRORinnativemethod:JDWPloadedclasses,jvmtiError=JVMTI_ERROR_OUT_OF_MEMORY(110) atsun.misc.Unsafe.defineAnonym......