当前位置:网站首页>JVM类加载简介
JVM类加载简介
2022-08-05 00:41:00 【xmh-sxh-1314】
类加载和初始化只进行一次
1,加载(需要类加载器的支持):这个阶段会在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的入口。注意这里不一定非得要从一个Class文件获取,这里既可以从ZIP包中读取(比如从jar包和war包中读取),也可以在运行时计算生成(动态代理),也可以由其它文件生成(比如将JSP文件转换成对应的Class类)。
2,验证:这一阶段的主要目的是为了确保Class文件的字节流中包含的信息是否符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。
3,准备(都是默认值):准备阶段是正式为类变量分配内存并设置类变量初始值(通常情况下是数据类型的零值)的阶段,这些变量所使用的内存都将在方法区中进行分配。这时候进行内存分配的仅包括类变量(被static修饰的变量),而不包括实例变量,实例变量将会在对象实例化的时候随着对象一起分配在Java堆中。
4,解析:解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。
5.初始化:执行类构造器clinit()方法的过程,这个方法是由编译器自动收集类中所有的类变量的赋值动作和静态语句块中的语句合并而成
类初始化阶段是类加载过程的最后一步,到了这个阶段才真正开始执行类中定义的Java程序代码(或者说是字节码)。在准备阶段,变量已经赋过一次系统要求的初始值,而在初始化阶段,则根据程序员通过程序制定的主观计划去初始化类变量和其他资源。
注意以下几点:
1.编译器收集的顺序是由语句在源文件中出现的顺序决定的,
静态语句块中只能访问到定义在静态语句块之前的变量,而定义在它之后的变量,在前面的静态语句块可以赋值,但不能访问,代码解释如下:
复制代码
public class Test{
static{
i=0;//给变量赋值可以编译通过
sout(i);//编译器会提示非法向前引用
}
static int i = 1;
}
复制代码
2.初始化方法执行的顺序,虚拟机会保证在子类的初始化方法执行之前,父类的初始化方法已经执行完毕,
3.虚拟机会保证一个类的clinit()方法在多线程环境中被正确加锁和同步
4.当访问一个java类的静态域时,只有真正声明这个域的类才会被初始化
类的主动引用(会发生初始化)
new一个类的对象
调用类的静态成员(除了final常量)和静态方法
反射调用时
启动main方法所在的类
虚拟机会保证在子类的初始化方法执行之前,父类的初始化方法已经执行完毕,
类的被动引用(不会发生初始化)
引用常量不会引发类的初始化:常量在编译阶段就存入调用类的常量池中
通过数组进行类引用,不会触发初始化
访问一个静态域(静态变量)时,只有真正声明这个域的类才会被初始化(子类)
类加载器:
1.作用:将字节码文件加载到内存中,将静态数据转成方法区运行时数据结构,在堆中生成一个Class类对象,作为方法区类数据的方法的访问入口
层次结构(树状结构)
2.ClassLoader相关方法:
3,类加载器的代理
边栏推荐
- Software test interview questions: BIOS, Fat, IDE, Sata, SCSI, Ntfs windows NT?
- could not build server_names_hash, you should increase server_names_hash_bucket_size: 32
- Software testing interview questions: the difference and connection between black box testing, white box testing, and unit testing, integration testing, system testing, and acceptance testing?
- Mysql_12 多表查询
- 克服项目管理中恐惧心理
- Redis visual management software Redis Desktop Manager2022
- Software testing interview questions: What are the seven-layer network protocols?
- RK3399平台开发系列讲解(内核调试篇)2.50、嵌入式产品启动速度优化
- 仅3w报价B站up主竟带来1200w播放!品牌高性价比B站投放标杆!
- 如何用 Solidity 创建一个“Hello World”智能合约
猜你喜欢
SV class virtual method of polymorphism
QSunSync Qiniu cloud file synchronization tool, batch upload
[230]连接Redis后执行命令错误 MISCONF Redis is configured to save RDB snapshots
二叉树[全解](C语言)
元宇宙:未来我们的每一个日常行为是否都能成为赚钱工具?
机器学习(公式推导与代码实现)--sklearn机器学习库
MongoDB construction and basic operations
LiveVideoStackCon 2022 上海站明日开幕!
仅3w报价B站up主竟带来1200w播放!品牌高性价比B站投放标杆!
[idea] idea configures sql formatting
随机推荐
【idea】idea配置sql格式化
软件测试面试题:系统测试的策略有?
进程间通信和线程间通信
Countdown to 1 day!From August 2nd to 4th, I will talk with you about open source and employment!
TinyMCE disable escape
Software Testing Interview Questions: What do you think about software process improvement? Is there something that needs improvement in the enterprise you have worked for? What do you expect the idea
2022 Hangzhou Electric Multi-School 1004 Ball
QSunSync 七牛云文件同步工具,批量上传
Software test interview questions: BIOS, Fat, IDE, Sata, SCSI, Ntfs windows NT?
tiup telemetry
2022牛客多校第三场 J题 Journey
【unity编译器扩展之模型动画拷贝】
[230] Execute command error after connecting to Redis MISCONF Redis is configured to save RDB snapshots
金九银十面试跳槽季;你准备好了吗?
【Unity编译器扩展之进度条】
软件测试面试题:关于自动化测试工具?
2 用D435i运行VINS-fusion
《WEB安全渗透测试》(28)Burp Collaborator-dnslog外带技术
软件测试面试题:软件测试类型都有哪些?
Software testing interview questions: What are the seven-layer network protocols?