Java—JVM加载机制
编程语言有两种:
1、编译型语言 将代码一次性编译成计算机可识别的二进制文件,语言有C和C++
2、解释型语言 通过解释器,一行行读取我们编写的代码转换成二进制数据后执行,JVM就是解释器,语言有java和kotlin lei
类加载器:
1.启动类加载器(Bootstrap ClassLoader):加载JVM自身工作需要的类,它由JVM自己实现。它会加载JAVA_HOME/jre/lib下的文件。
2.扩展类加载器(Extension ClassLoader):负责加载JVM扩展类,jvm里面lib目录中的ext中的jar包
3.应用程序类加载器(Application ClassLoader):根据ClassPath指定路径,寻找应用程序所有加载class字节码文件,从字节码文件中加载类型对应的class对象,我们自己编写的代码以及使用的第三方的jar包都是由它来加载。
一个类,由不同的类加载器实例加载的话,会在方法区产生两个不同的类,彼此不可见,并且在堆中生成不同Class实例。
双亲委托模型
如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行。
如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式
优点:避免类的重复加载,避免了java的核心API被篡改。
类的生命周期:
一、类的加载
在加载的时候,虚拟机将我们写的.java文件,编译成字节码后加载到内存里,然后在内存中生成一个java.lang.Class对象,作为方法区这个类的各种数据的访问入口。
二、类的连接
类的加载过程后生成了类的java.lang.Class对象,接着会进入连接阶段,连接阶段负责将类的二进制数据合并入JRE(Java运行时环境)中。类的连接大致分三个阶段。
1、验证:验证此class字节流是安全的、没有被修改的、可以被正常使用的.
2、准备:为类的静态变量(static)在方法区分配内存,并赋默认初值(0值或null值)。
如static int a = 5; 静态变量a被赋默认值0。
静态常量(static final)会被赋程序设定的初值。
如static final int a = 5; 静态常量a就会在准备阶段被直接赋值为5,而静态变量是在初始化阶段进行的。
对于一般的成员变量是在类实例化时候,随对象一起分配在堆内存中。
3、解析:JVM将常量池中的符号引用转换成直接引用的过程。
三、类的初始化
类初始化是类加载的最后一步,除了加载阶段,用户可以通过自定义的类加载器参与,其他阶段都完全由虚拟机主导和控制。到了初始化阶段才真正执行Java代码。
类的初始化的主要工作是为静态变量赋程序设定的初值。
如static int a = 100;在准备阶段,a被赋默认值0,在初始化阶段就j会被赋值为100。
java虚拟机规范中严格规定了有且只有五种情况必须对类进行初始化:
1、使用new字节码指令创建类的实例,或者使用getstatic、putstatic读取或设置一个静态字段的值(放入常量池中的常量除外),或者调用一个静态方法的时候,对应类必须进行过初始化。
2、通过java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则要首先进行初始化。
3、当初始化一个类的时候,如果发现其父类没有进行过初始化,则首先触发父类初始化。
4、当虚拟机启动时,用户需要指定一个主类(包含main()方法的类),虚拟机会首先初始化这个类。
5、使用jdk1.7的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getStatic、REF_putStatic、RE_invokeStatic的方法句柄,并且这个方法句柄对应的类没有进行初始化,则需要先触发其初始化。
Java—JVM加载机制相关推荐
- 【死磕JVM】五年 该知道JVM加载机制了!
类加载 Java虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程 和那些编译时需要连接工作的语言不 ...
- java jvm 加载_Jvm是如何加载Java类的?
前言 我们知道Java语言的类型可以分为两大类:基本类型「primitive types」和引用类型「reference types」. 对于Java的基本数据类型是Java虚拟机定义好的.至于另一大 ...
- 【死磕JVM】五年 整整五年了 该知道JVM加载机制了!
类加载 Java虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程 和那些编译时需要连接工作的语言不 ...
- java jvm 加载类的顺序_java JVM-类加载静态初始化块调用顺序
测试类加载的全过程 public class Have { static { System.out.println("加载Have");//先加载Have再调用main方法 } p ...
- 常见Java面试题之JVM加载class文件的原理机制
JVM加载class文件的原理机制 JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的 ...
- java文件读入原理_描述一下JVM加载class文件的原理机制
1.JVM 简介 JVM 是我们Javaer 的最基本功底了,刚开始学Java 的时候,一般都是从"Hello World "开始的,然后会写个复杂点class ,然后再找一些开源 ...
- Java提高篇——JVM加载class文件的原理机制
阅读目录 1.JVM 简介 2.JVM 的组成部分 3.JVM加载class文件的原理机制 在面试java工程师的时候,这道题经常被问到,故需特别注意. 回到顶部 1.JVM 简介 JVM 是我们Ja ...
- JVM class加载机制的总结 收藏
JVM class加载机制的总结 收藏 一 Java2类装载机制的缺省实现 我们知道在Java中实例化一个对象以前,需要将对象的类文件加载到虚拟机并完成连接和类型初始化等操作(事实上很多情况下,不实例 ...
- J2EE JVM加载class文件的原理机制
JVM加载class文件的原理机制 1.Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中 2.java中的 ...
最新文章
- 《深度学习革命》作者:GAN令我惊艳,现在的人们对AI操之过急了
- mysql数据库开启慢查询日志
- Git本地缓存问题 修改密码后git无法拉取
- 交换机配置工具_二层网管交换机应用—环路检测
- 34Linux日期指令
- 源码角度解释fragment的坑(二)
- java数组循环扩容_Java中实现数组动态扩容的两种方法
- 【Go】使用压缩文件优化io (二)
- JavaWeb基于session和cookie的数据共享
- c语言程序设计基础教程pdf,C语言程序设计基础教程.pdf
- [新增:鸵鸟]软件开发团队的脓包:皇帝的新装、口号党、鸵鸟、废话迷
- htmlcleaner+xpath抓取网页数据
- jwplayer 初始化设置项
- win7计算机资源管理器卡住,Win7电脑资源管理器一直卡住怎么办_Win7电脑资源管理器一直卡住的解决方法 - 系统家园...
- docker 安装 shipyard(中文版) 集群管理平台
- 互联网人典型体检报告?
- HDU 2072 单词数 Trie 如何debug一颗Trie
- Preserving Semantic Neighborhoods for RobustCross-modal Retrieval
- Git、GitLab这辈子的错都报完了 You have not concludedUnlink of file、 Pulling is not possible、Your local changes
- python 白噪声检验-利用python实现平稳时间序列的建模方式
热门文章
- 开源项目工时系统_SpringBoot 微信点餐开源系统!综合运用项目,值得一看!
- win8看不到win7局域网计算机名,实现Win7旗舰版与win8.1系统局域网里文件共享的设置方法【图】...
- 函数不可访问_关于可重入函数
- c语言基础学python_D11——C语言基础学PYTHON
- python写入文件中文乱码_记一次python写入txt文件正常,但是写入csv文件中文乱码问题...
- dialog能提交数据吗_你的数据库,能撑起多少并发,有数吗?
- 5G时代到来,是机遇还是灾难?
- nginx实现ip端口转发_Nginx实现端口转发
- HDLBits答案(20)_Verilog有限状态机(7)
- java在dos中如何测试_[求助]怎么在java中模拟dos命令行