编程语言有两种:

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加载机制相关推荐

  1. 【死磕JVM】五年 该知道JVM加载机制了!

    类加载 Java虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程 和那些编译时需要连接工作的语言不 ...

  2. java jvm 加载_Jvm是如何加载Java类的?

    前言 我们知道Java语言的类型可以分为两大类:基本类型「primitive types」和引用类型「reference types」. 对于Java的基本数据类型是Java虚拟机定义好的.至于另一大 ...

  3. 【死磕JVM】五年 整整五年了 该知道JVM加载机制了!

    类加载 Java虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程 和那些编译时需要连接工作的语言不 ...

  4. java jvm 加载类的顺序_java JVM-类加载静态初始化块调用顺序

    测试类加载的全过程 public class Have { static { System.out.println("加载Have");//先加载Have再调用main方法 } p ...

  5. 常见Java面试题之JVM加载class文件的原理机制

    JVM加载class文件的原理机制 JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的 ...

  6. java文件读入原理_描述一下JVM加载class文件的原理机制

    1.JVM 简介 JVM 是我们Javaer 的最基本功底了,刚开始学Java 的时候,一般都是从"Hello World "开始的,然后会写个复杂点class ,然后再找一些开源 ...

  7. Java提高篇——JVM加载class文件的原理机制

    阅读目录 1.JVM 简介 2.JVM 的组成部分 3.JVM加载class文件的原理机制 在面试java工程师的时候,这道题经常被问到,故需特别注意. 回到顶部 1.JVM 简介 JVM 是我们Ja ...

  8. JVM class加载机制的总结 收藏

    JVM class加载机制的总结 收藏 一 Java2类装载机制的缺省实现 我们知道在Java中实例化一个对象以前,需要将对象的类文件加载到虚拟机并完成连接和类型初始化等操作(事实上很多情况下,不实例 ...

  9. J2EE JVM加载class文件的原理机制

    JVM加载class文件的原理机制 1.Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中 2.java中的 ...

最新文章

  1. 《深度学习革命》作者:GAN令我惊艳,现在的人们对AI操之过急了
  2. mysql数据库开启慢查询日志
  3. Git本地缓存问题 修改密码后git无法拉取
  4. 交换机配置工具_二层网管交换机应用—环路检测
  5. 34Linux日期指令
  6. 源码角度解释fragment的坑(二)
  7. java数组循环扩容_Java中实现数组动态扩容的两种方法
  8. 【Go】使用压缩文件优化io (二)
  9. JavaWeb基于session和cookie的数据共享
  10. c语言程序设计基础教程pdf,C语言程序设计基础教程.pdf
  11. [新增:鸵鸟]软件开发团队的脓包:皇帝的新装、口号党、鸵鸟、废话迷
  12. htmlcleaner+xpath抓取网页数据
  13. jwplayer 初始化设置项
  14. win7计算机资源管理器卡住,Win7电脑资源管理器一直卡住怎么办_Win7电脑资源管理器一直卡住的解决方法 - 系统家园...
  15. docker 安装 shipyard(中文版) 集群管理平台
  16. 互联网人典型体检报告?
  17. HDU 2072 单词数 Trie 如何debug一颗Trie
  18. Preserving Semantic Neighborhoods for RobustCross-modal Retrieval
  19. Git、GitLab这辈子的错都报完了 You have not concludedUnlink of file、 Pulling is not possible、Your local changes
  20. python 白噪声检验-利用python实现平稳时间序列的建模方式

热门文章

  1. 开源项目工时系统_SpringBoot 微信点餐开源系统!综合运用项目,值得一看!
  2. win8看不到win7局域网计算机名,实现Win7旗舰版与win8.1系统局域网里文件共享的设置方法【图】...
  3. 函数不可访问_关于可重入函数
  4. c语言基础学python_D11——C语言基础学PYTHON
  5. python写入文件中文乱码_记一次python写入txt文件正常,但是写入csv文件中文乱码问题...
  6. dialog能提交数据吗_你的数据库,能撑起多少并发,有数吗?
  7. 5G时代到来,是机遇还是灾难?
  8. nginx实现ip端口转发_Nginx实现端口转发
  9. HDLBits答案(20)_Verilog有限状态机(7)
  10. java在dos中如何测试_[求助]怎么在java中模拟dos命令行