1、JVM 类加载

厨子大约 3 分钟JVM原创面试题类加载机制程序厨

1、JVM类加载

1.0 JVM 类加载机制

JVM的类加载机制,总共分为 5 部分,加载,验证,准备,解析,初始化。

加载

  • 将该类解析成二进制字节流

  • 将表示该类的二进制流,转储为方法区运行时的数据结构。

  • 在堆中生成一个表示该数据结构的对象,然后该对象作为 访问该数据结构的入口

验证

这一段主要是保证加载出的二进制字节流符合JVM虚拟机的要求,保证不会对虚拟机造成伤害。

准备

验证完之后,发现没有问题,我们开始对类分配内存,初始化默认值等。

解析

将常量池内的符号引用替换为直接引用的过程

符号引用:使用一组符号来描述所引用的目标,符号可以是任何形式的字面量。

直接引用:直接引用时可以直接指向目标的指针、相对偏移量或者是一个能间接定位到目标的句柄。

初始化

JVM开始真正执行JAVA类中编写的代码,将主导权交给应用程序。

1.1 什么是类加载器

通过一个类的全限定名来获取描述此类的二进制字节流”。

类加载器的主要分为这几种,启动类加载器,拓展类加载器,程序类加载器。用户自定义类加载器。

另外的话,判断两个类是否相同,需要判断是否使用同一个类进行加载,如果来自于一个 Class文件,但是不是一个加载器加载的话,那也不是同一个类。

1.2 JVM类加载模型

类加载过程使用双亲委派机制进行加载

1.3 说说双亲委派机制

加载过程:除了启动类加载器,其余所有的类加载器都有父加载器,他们之间为组合关系。

双亲委派加载过程:某个类加载器在收到加载过程之后,首先不会自己去尝试加载,会优先请求自己的父加载器进行加载。(如果加载过,则返回给子加载器)进行不断向上请求,直到启动类加载器,如果启动类加载不了,再下沉到子加载器进行加载。

1.4 双亲委派机制的意义

防止某些系统级别的类被篡改,因为这些类已经被 启动类加载器加载过了,所以其他类没有机会再去加载了,进而防止了一个恶意代码注入的问题。

1.5 如何打破双亲委派机制

双亲委派模型只是虚拟机的规范,比如我们设置的类则可以不遵守这个规范,重写 loadClass方法即可。

1.6 内存模型

内存模型
内存模型