JVM --字节码的加载

ClassLoader类加载器

  常见的类加载器有BootStrapClassLoader<-ExtClassLoader<-AppClassLoader<-用户ClassLoader

BootStrapClassLoader:加载Java自带的核心类;

ExtClassLoader加载在/jre/lib/ext目录下的jar包,同样用户可以将jar放在该目录下。

AppClassLoader 加载classpath下面的内容,

加载过程:

读取文件并加载,首先申请父类的加载器进行加载,如果父类加载器无法加载,再由子类来加载,最终找不到该类,那么将会抛出ClassNotFoundException;

第二步,链接。对已经加载的字节码进行解析、校验,看是不是符合一定的规范,否则抛出ClassNotFoundError.然后实现内存的分配。

第三步,初始化。调用构造函数,对静态变量、static块初始化。

值得注意的是,在类加载的过程中,会阻塞多个线程。

其实ClassLoader本身就是Java类,而这些类是由JVM内核来实现加载。

时间: 2024-08-02 23:32:12

JVM --字节码的加载的相关文章

java面试题jvm字节码的加载与卸载

虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换分析和初始化,最终形成可以被虚拟节直接使用的JAVA类型,这就是虚拟机的类加载机制. 类从被加载到虚拟机内存到卸载出内存的生命周期包括:加载->连接(验证->准备->解析)->初始化->使用->卸载 初始化的5种情况: 1.使用new关键字实例化对象时,读取或设置一个类的静态字段,除被final修饰经编译结果放在常量池的静态字段,调用类的静态方法时. 2.使用java.lang.reflect包方法对

JVM总结(五):JVM字节码执行引擎

JVM字节码执行引擎 运行时栈帧结构 局部变量表 操作数栈 动态连接 方法返回地址 附加信息 方法调用 解析 分派 –“重载”和“重写”的实现 静态分派 动态分派 单分派和多分派 JVM动态分派的实现 基于栈的字节码解释执行引擎 基于栈的指令集与基于寄存器的指令集 JVM字节码执行引擎 虚拟机是相对于“物理机”而言的,这两种机器都有代码执行能力,其区别主要是物理机的执行引擎是直接建立在处理器.硬件.指令集和操作系统层面上的,而虚拟机的执行引擎是自己实现的.因此程序员可以自行制定指令集和执行引擎的

JVM自定义类加载器加载指定classPath下的所有class及jar

一.JVM中的类加载器类型 从Java虚拟机的角度讲,只有两种不同的类加载器:启动类加载器和其他类加载器. 1.启动类加载器(Boostrap ClassLoader):这个是由c++实现的,主要负责JAVA_HOME/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作. 2.其他类加载器:由java实现,可以在方法区找到其Class对象.这里又细分为几个加载器 a).扩展类加载器(Extension ClassLoader):负责用于加载JAVA_HOM

JVM字节码增强

JVM——字节码增强技术简介 Java字节码增强指的是在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修改.Java字节码增强主要是为了减少冗余代码,提高性能等. 实现字节码增强的主要步骤为: 1.修改字节码 在内存中获取到原来的字节码,然后通过一些工具(如 ASM,Javaasist)来修改它的byte[]数组,得到一个新的byte数组. 2.使修改后的字节码生效 有两种方法: 1) 自定义ClassLoader来加载修改后的字节码: 2)替换掉原来

看看Spring的源码——Bean加载过程

最近几天跟同事聊起Spring的一些问题,对一些地方有些疑问,趁这两天有点空,看看Spring的源码,了解下具体的实现细节.本文基于Spring 4.0.5版本. 首先Web项目使用Spring是通过在web.xml里面配置org.springframework.web.context.ContextLoaderListener初始化IOC容器的. <listener> <listener-class>org.springframework.web.context.ContextL

JVM进程jar包加载分析

有时在一个应用中,会依赖很多的jar包,难免会出现引用不同jar包中的同名类,或者jar包冲突,这时搞清楚: JVM启动时加载了哪些jar包 或者一个类来自哪个jar中来就非常重要了. 一.查看JVM加载了哪些jar包 启动JVM,通过如下命令获取进程号: jps -lm 1 其中参数: -l:输出main所在类的全名,如果执行的是jar包,则输出jar包路径 -m:输出jvm进程启动时传递给main函数的参数 jps还有参数-v:输出jvm进程启动时JVM参数. 使用如下命令: jinfo +

JVM——字节码增强技术简介

Java字节码增强指的是在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修改.Java字节码增强主要是为了减少冗余代码,提高性能等. 实现字节码增强的主要步骤为: 1.修改字节码 在内存中获取到原来的字节码,然后通过一些工具(如 ASM,Javaasist)来修改它的byte[]数组,得到一个新的byte数组. 2.使修改后的字节码生效 有两种方法: 1) 自定义ClassLoader来加载修改后的字节码: 2)替换掉原来的字节码:在JVM加载用户的C

JVM字节码格式

字节码格式 字节码是JVM的机器语言.JVM加载类文件时,对类中的每个方法,它都会得到一个字节码流.这些字节码流保存在JVM的方法区中.在程序运行过程中,当一个方法被调用时,它的字节码流就会被执行.根据特定JVM设计者的选择,它们可以通过解释的方式,即时编译(Just-in-time compilation)的方式或其他技术的方式被执行. 方法的字节码流就是JVM的指令(instruction)序列.每条指令包含一个单字节的操作码(opcode)和0个或多个操作数(operand).操作码指明要

JVM | 字节码指令基础

操作数栈管理指令 1)pop.pop2:将操作数栈的栈顶一个或两个元素出栈.2)dup.dup2.dup_x1.dup2_x1.dup_x2.dup2_x2:复制栈顶一个或两个数值并将复制值或双份的复制值重新压入栈顶.3)swap:将栈最顶端两个数值互换. public static void main(String[] args) { heavyMethod(); } 对应的字节码: public static void main(java.lang.String[]); Signature: