虚拟机类加载过程

以下文档约定:
1、每个 Class文件 都有代表着Java语言中的一个 接口 的可能
2、 Class文件 也并非特指某个存在于具体磁盘中的文件,而应当是 一串二进制字节流 ,无论其以何种形式存在,包括但不限于磁盘文件、网络、数据库、内存或者动态产生等。

-----------------------------------------------------------------------------读书笔记摘自 书名:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)作者:周志明


与那些在编译时需要进行连接的语言不同,在Java语言里面,类型的加载、连接和初始化过程都是在 程序运行期间 完成的。


虚拟机的类加载机制

Java虚拟机把描述类的数据从 Class文件 加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型这个过程被称作 虚拟机的类加载机制

类加载器(Class Loader)

Java虚拟机设计团队有意把类加载阶段中的 通过一个类的全限定名来获取描述该类的二进制字节流 这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类。实现这个动作的代码被称为“类加载器”(Class Loader)

-----------------------------------------------------------------------------读书笔记摘自 书名:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)作者:周志明


类加载器双亲委派模型机制?

当一个类收到了类加载请求时,不会自己先去加载这个类,而是将其委派给父类,由父类去加载,如果此时父类不能加载,反馈给子类,由子类去完成类的加载。

类加载器有哪些?

两种不同的类加载器:
一种是启动类加载器BootstrapClassLoader),这个类加载器使用C++语言实现,是虚拟机自身的一部分;

1、启动类加载器

另外一种就是其他所有的类加载器,这些类加载器都由Java语言实现,独立存在于虚拟机外部,并且全都继承自抽象类java.lang.ClassLoader

1、扩展类加载器
2、应用程序类加载器
3、自定义的类加载器


类生命周期

类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期。
在这里插入图片描述
加载验证准备初始化卸载这五个阶段的顺序是确定的,而解析阶段则不一定:它在某些情况下可以在初始化阶段之后再开始。

-----------------------------------------------------------------------------读书笔记摘自 书名:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)作者:周志明


类加载时机

什么情况加载《Java虚拟机规范》未强制约束,由虚拟机实现自由把握。 但是严格规定了 有且只有 六种情况必须立即对类进行 初始化类什么时候执行初始化


类加载(Class Loading)过程

加载验证准备解析初始化

1.加载(Loading)

在加载阶段,虚拟机需要完成以下三件事情:
1、通过一个类的全限定名来获取定义此类的 二进制字节流 。(没有指明要从哪里获取、如何获取。(这里给了开发很大的创作空间))
2、将这个字节流所代表的 静态存储结构 转化为方法区运行时数据结构
3、在Java堆中生成一个代表这个类的 java.lang.Class对象,作为方法区这些数据的访问入口。

注意
1、加载阶段结束后,Java虚拟机外部的二进制字节流就按照虚拟机所设定的格式存储在方法区之中了,方法区中的数据存储格式完全由虚拟机实现自行定义,《Java虚拟机规范》未规定此区域的具体数据结构。
2、非数组类型的加载阶段是加载阶段中获取类的二进制字节流的动作数组类本身不通过类加载器创建,它是由Java虚拟机直接在内存中动态构造出来的数组类的元素类型(Element Type,指的是数组去掉所有维度的类型)还是要靠类加载器来完成加载。


2.验证:

目的是确保Class文件字节流中包含的信息符合《Java虚拟机规范》的全部约束要求,保证这些信息被当作代码运行后不会危害虚拟机自身的安全。

验证阶段大致上会完成下面四个阶段的检验动作:

  • 文件格式验证、
  • 元数据验证、
  • 字节码验证、
  • 符号引用验证。

3.准备:

准备阶段是正式为类 静态变量(即被static修饰的变量)分配内存设置初始值 的阶段。

“通常情况” 下是数据类型的零值

假设一个类变量的定义为:public static int value = 123; 那变量 value 在准备阶段过后的初始值为0而不是123

“特殊情况”

假设上面类变量value的定义修改为:public static final int value = 123; 那变量 value 在准备阶段过后的初始值为123

注意:
1、类变量在方法区就完全是一种对逻辑概念的表述。JDK 7及之前,HotSpot使用永久代来实现方法区;JDK 7及之后,类变量则会随着Class对象一起存放在Java堆
2、 这时候进行内存分配的 仅包括类变量,而不包括实例变量 实例变量将会在对象实例化时随着对象一起分配在Java堆中


4.解析:

解析阶段是Java虚拟机将 常量池 内的 符号引用 替换为 直接引用 的过程。

解析动作主要针对类或接口字段类方法接口方法方法类型方法句柄调用点限定符这7类符号引用进行。

符号引用(Symbolic References) :以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可。
直接引用(Direct References) :是可以直接指向目标的指针相对偏移量或者是一个能间接定位到目标的句柄


5.初始化

类的初始化阶段是类加载过程的最后一个步骤,之前介绍的几个类加载的动作里,除了在加载阶段用户应用程序可以通过自定义类加载器的方式局部参与外,其余动作都完全由Java虚拟机来主导控制。直到初始化阶段,Java虚拟机才真正开始执行类中编写的Java程序代码,将主导权移交给应用程序。

进行准备阶段时,变量已经赋过一次系统要求的初始零值,而在初始化阶段,则会根据程序员通过程序编码制定的主观计划去初始化类变量其他资源。我们也可以从另外一种更直接的形式来表达:初始化阶段就是执行类构造器<clinit>()方法的过程

参考:类构造器<clinit>(),实例构造器< init>() 学习笔记

-----------------------------------------------------------------------------读书笔记摘自 书名:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)作者:周志明

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 虚拟机加载慢可能是由于以下原因:1. 虚拟机配置不足,例如内存、CPU等资源不够,导致加载速度变慢。2. 虚拟机所在的物理机器性能不足,例如硬盘读写速度慢、网络带宽不足等。3. 虚拟机镜像文件过大,导致加载时间变长。4. 虚拟机所在的网络环境不稳定,例如网络延迟高、丢包率高等。解决方法:1. 增加虚拟机的配置,例如增加内存、CPU等资源。2. 优化物理机器的性能,例如更换硬盘、升级网络带宽等。3. 压缩虚拟机镜像文件大小,或者使用更小的镜像文件。4. 优化网络环境,例如使用更稳定的网络连接、优化网络配置等。 ### 回答2: 虚拟机在加载过程中出现慢的情况,可能是由于以下几个方面的原因: 1.硬件资源不足:在运行虚拟机时,需要一定的计算资源和内存资源支持。如果计算机的硬件配置较低,特别是内存容量不足,就会导致虚拟机加载较慢。此时可以考虑升级计算机硬件,或者关闭其他不必要的程序,释放内存资源。 2.磁盘空间不足:虚拟机加载需要使用硬盘空间来读取和写入数据。如果虚拟机所在的磁盘空间不足,就会导致加载慢。此时可以尝试清理磁盘垃圾文件,删除不必要的文件,释放硬盘空间。 3.网络连接问题:虚拟机加载过程中可能需要从网络中下载相关文件,如果网络连接不稳定或网速较慢,就会导致加载慢。此时可以尝试更换网络环境,连接更稳定、速度更快的网络。 4.虚拟机设置问题:虚拟机的一些配置项也可能会影响其加载速度。可以尝试调整虚拟机的配置项,例如增加虚拟机的内存分配、调整虚拟机的启动选项等,以提高加载速度。 总结起来,虚拟机加载慢可能是由于计算机硬件资源不足、磁盘空间不足、网络连接问题或虚拟机设置问题所导致。通过升级硬件、清理磁盘空间、优化网络环境、调整虚拟机设置等方法,可以改善虚拟机加载慢的问题。 ### 回答3: 虚拟机加载慢可能由多个因素导致。首先,可能是由于计算机硬件配置不佳,例如内存不足、处理器速度较低等。虚拟机需要占用一定的计算资源来运行,如果硬件配置不够强大,就会导致加载速度变慢。解决这个问题的方法是升级计算机硬件,增加内存和更新处理器。 其次,虚拟机本身的配置也可能导致加载缓慢。如果虚拟机的配置设置不当,例如分配的内存不够、磁盘空间不足等,都会导致虚拟机加载速度慢。正确地配置虚拟机以适应需要的资源,可以通过增加内存和磁盘空间来改善加载速度。 另外,网络连接的稳定性也会影响虚拟机加载速度。虚拟机可能需要从云端下载或更新软件,如果网络连接不稳定或带宽较低,就会导致加载速度变慢。确保良好的网络连接,可以通过使用有线网络连接替代无线连接,或者选择高速稳定的网络提供商来改善加载速度。 最后,虚拟机软件本身的版本和更新也会对加载速度产生影响。虚拟机软件通常会有更新和改进,选择更新到最新版本的虚拟机软件可以提高加载速度并修复一些已知的性能问题。 总之,虚拟机加载慢可能是由于计算机硬件配置不佳、虚拟机配置不当、网络连接不稳定或虚拟机软件问题等原因所导致的。根据具体情况,通过升级硬件、适当配置虚拟机、改善网络连接和更新虚拟机软件,可以改善虚拟机加载速度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值