JVM如何加载字节码文件?
当Java编译器编译好.class文件之后,我们需要使用JVM来运行这个class文件。那么最开始的工作就是要把字节码从磁盘输入到内存中,这个过程我们叫做【加载 】。加载完成之后,我们就可以进行一系列的运行前准备工作了,比如: 为类静态变量开辟空间,将常量池存放在方法区内存中并实现常量池地址解析,初始化类静态变量等等。这篇文章我们要好好谈谈JVM是如何加载class文件的?
类加载机制
类从被加载到虚拟机内存到卸载出内存的生命周期包括:加载->连接(验证->准备->解析)->初始化->使用->卸载
载
将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口,这个过程需要类加载器参与。
链接 将java类的二进制代码合并到JVM的运行状态之中的过程
验证:确保加载的类信息符合JVM规范,没有安全方面的问题
准备:正式为类变量(static变量)分配内存并设置类变量初始值的阶段,这些内存都将在方法去中进行分配
解析:虚拟机常量池的符号引用替换为字节引用过程
初始化
初始化阶段是执行类构造器<clinit>()方法的过程。类构造器<clinit>()方法是由编译器自动收藏类中的所有类变量的赋值动作和静态语句块(static块)中的语句合并产生
当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化
虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确加锁和同步
当范围一个Java类的静态域时,只有真正声名这个域的类才会被初始化
java装载类使用“全盘负责委托机制”:
是指一个ClassLoader装载一个类时,除非显示使用另一个ClassLoader,该类所依赖及引用的类也由这个ClassLoader载入。“委托机制”是指先委托父类装载器寻找目标类,只有在找不到的情况下才从自己的路径中查找并载入。这一点是从安全的方面考虑的,试想一下如果有人写了一个恶意的基础类(如java.lang.String)并加载到JVM将引起严重后果,但是全盘负责制,java.lang.String永远是由根装载器来装载的,避免以上情况发生。
- JVM如何加载class文件
- JVM如何加载.Class文件
- 学习笔记02 - JVM如何加载.Class文件
- 如何在不重启 JVM 的情况下重新加载证书文件?
- 描述一下JVM加载class文件的原理机制?
- 详解如何加载SKILL文件及allegro.ilinit内容解析
- 2018-01-18 jvm加载.class文件(加载、连接(验证、准备、解析)、初始化、使用、卸载)
- 如何按需动态加载js文件
- JVM加载class文件的原理
- Web前端性能优化——如何有效提升静态文件的加载速度
- jVM加载class文件的原理机制
- JVM加载class文件的一些理解
- 如何通过AS3加载外部SWF文件,调用外部文件文档类的方法?
- Android设备如何加载.so文件以及如何适配
- vue如何才能正确打包,文件加载不会出错
- Spring如何加载XSD文件(org.xml.sax.SAXParseException: Failed to read schema document错误的解决方法)
- JVM加载class文件的原理机制
- 菜鸟入坑》JVM如何加载类
- Class类文件结构、类加载机制以及字节码执行
- requriejs 加载如何加载jquery文件