JVM类加载的过程详解
创作时间:
作者:
@小白创作中心
JVM类加载的过程详解
引用
1
来源
1.
http://www.cdweb.net/article/cgicsd.html
JVM类加载的过程主要包括加载、验证、准备、解析和初始化五个阶段。下面将详细介绍每个阶段的具体步骤:
1. 加载
在加载阶段,JVM主要完成以下三件事:
- 通过一个类的全限定名来获取该类的二进制字节流
- 将这个字节流的静态存储结构转化为方法区运行时数据结构
- 在内存堆中生成一个代表该类的
java.lang.Class
对象,作为该类数据的访问入口
2. 验证
验证、准备、解析这三步可以看做是一个连接的过程,将类的字节码连接到JVM的运行状态之中。验证的主要目的是确保Class文件的字节流中包含的信息符合当前虚拟机的要求,不会威胁到JVM的安全。验证主要包括以下几个方面的验证:
- 文件格式的验证:验证字节流是否符合Class文件的规范,是否能被当前版本的虚拟机处理
- 元数据验证:对字节码描述的信息进行语义分析,确保符合Java语言规范
- 字节码验证:通过数据流和控制流分析,确定语义是合法的,符合逻辑的
- 符号引用验证:这个校验在解析阶段发生
3. 准备
准备阶段为类的静态变量分配内存,初始化为系统的初始值。对于final static
修饰的变量,直接赋值为用户的定义值。例如:
public static int a = 7;
在准备阶段过后的初始值为0,而不是7。
4. 解析
解析阶段将常量池内的符号引用转为直接引用(如物理内存地址指针)。
5. 初始化
初始化阶段是真正开始执行类中定义的Java代码的阶段。具体来说:
- 初始化阶段是执行类构造器
<clinit>()
方法的过程。类构造器<clinit>()
方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static
块)中的语句合并产生的。 - 当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。
- 虚拟机会保证一个类的
<clinit>()
方法在多线程环境中被正确加锁和同步。
热门推荐
解放碑夜游全攻略:重庆火锅+洪崖洞夜景+精彩夜生活
解放碑商圈:创新引领夜间经济新发展
铝膜房子:高层住宅的绿色新宠
景宁安置房引入铝模技术,提升建筑品质
海南南山文化旅游区:自然与文化的完美融合
用RSS告别信息焦虑,重获数字生活主动权
社交媒体上的"新闻推送"如何助力英语学习?
秋冬养生新选择:破壁灵芝孢子粉的科学使用指南
古早甜蜜年味不能少 春节将至闽南特色糕粿热销
黄龙水草玉:代表意义与收藏价值全解析
唐卡属于什么文化?
微信、QQ、淘宝、京东:手机号码安全绑定指南
北京互联网法院:手机号码隐私权保护新动向
揭秘骚扰电话背后的手机号码泄露真相
南湾礼堂、柳林矿坑、武胜关林场:信阳新晋网红打卡地
探秘城阳城遗址:信阳的文化瑰宝
鸡公山:信阳必打卡避暑胜地
住宅室外台阶设计规范与案例解析:打造安全实用的建筑入口
断路器的综合指南:操作、功能、接线方法、类型的原理
桂林秋冬摄影攻略:4个绝美打卡地,专业摄影师带你拍出大片
北京吃货必打卡!全国特色家常菜大集合
地三鲜家常做法大揭秘:香喷喷的东北味!
国家反诈中心教你识破电话骗局
攀枝花警方揭秘:如何识别冒充客服的诈骗电话?
《封神第二部》都江堰太平洋影城热映中!
冬日探秘:青州九龙峪徒步与露营全攻略
冬日青州两日游:从古城到云门山
去西藏必吃的神奇草药——红景天
红景天配西洋参:补气养阴的黄金搭档
红景天:高原人参的养生之道