2、jvm基础知识(二)

类的生命周期


加载

1、加载(Loading)阶段第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息。

程序员可以使用Java代码拓展的不同的渠道。

2、类加载器在加载完类之后,Java虚拟机会将字节码中的信息保存到内存的方法区中。在方法区生成一个

InstanceKlass对象,保存类的所有信息。

3、在堆中生成一份与方法区中数据类似的java.lang.Class对象, 作用是在Java代码中去获取类的信息

连接

⚫ 连接(Linking)阶段的第一个环节是验证,验证的主要目的是检测Java字节码文件是否遵守了《Java虚拟机规

范》中的约束。这个阶段一般不需要程序员参与。

⚫ 主要包含如下四部分,具体详见《Java虚拟机规范》:

1.文件格式验证,比如文件是否以0xCAFEBABE开头,主次版本号是否满足当前Java虚拟机版本要求。

2.元信息验证,例如类必须有父类(super不能为空)。

3.验证程序执行指令的语义,比如方法内的指令执行到一半强行跳转到其他方法中去。

4.符号引用验证,例如是否访问了其他类中private的方法等

⚫ 准备阶段为静态变量(static)分配内存并设置初值。final修饰的基本数据类型的静态变量,准备阶段直接会将

代码中的值进行赋值。

⚫ 解析阶段主要是将常量池中的符号引用替换为直接引用。符号引用就是在字节码文件中使用编号来访问常量池中

的内容。直接引用不在使用编号,而是使用内存中地址进行访问具体的数据。

⚫ 解析阶段主要是将常量池中的符号引用替换为直接引用。

⚫ 直接引用不在使用编号,而是使用内存中地址进行访问具体的数据。

初始化

⚫ 初始化阶段会执行静态代码块中的代码,并为静态变量赋值。

⚫ 初始化阶段会执行字节码文件中clinit部分的字节码指令。

类的卸载

判定一个类可以被卸载。需要同时满足下面三个条件:

1、此类所有实例对象都已经被回收,在堆中不存在任何该类的实例对象以及子类对象。

2、加载该类的类加载器已经被回收。

3、该类对应的 java.lang.Class 对象没有在任何地方被引用。

什么是类加载器,有哪些常见的类加载器

类加载器负载在类的加载过程中将字节码信息以流的方式获取并加载到内存中。JDK8及之前如下:

类加载器负载在类的加载过程中将字节码信息以流的方式获取并加载到内存中。JDK9之后均由Java实现:

⚫ 启动类加载器(Bootstrap ClassLoader)是由Hotspot虚拟机提供的类加载器,JDK9之前使用C++编写的、JDK9之

后使用Java编写。

⚫ 默认加载Java安装目录/jre/lib下的类文件,比如rt.jar,tools.jar,resources.jar等。

⚫ 扩展类加载器(Extension Class Loader)是JDK中提供的、使用Java编写的类加载器。JDK9之后由于采用了模块化,

改名为Platform平台类加载器。

⚫ 默认加载Java安装目录/jre/lib/ext下的类文件。

⚫ 应用程序类加载器(Application Class Loader)是JDK中提供的、使用Java编写的类加载器。默认加载为应用程序

classpath下的类。

⚫ 自定义类加载器允许用户自行实现类加载的逻辑,可以从网络、数据库等来源加载类信息。自定义类加载器需要继承自

ClassLoader抽象类,重写findClass方法

有几种类加载器?

1.启动类加载器(Bootstrap ClassLoader)加载核心类

2.扩展类加载器(Extension ClassLoader)加载扩展类

3.应用程序类加载器(Application ClassLoader)加载应用classpath中的类

4.自定义类加载器,重写findClass方法。

JDK9及之后扩展类加载器(Extension ClassLoader)变成了平台类加载器(Platform

ClassLoader)

什么是双亲委派机制

类加载有层级关系,上一级称之为下一级的父类加载器。

双亲委派机制指的是:当一个类加载器接收到加载类的任务时,会向上查找是否加载过,再由顶向下进行加载。

每个类加载器都有一个父类加载器,在类加载的过程中,每个类加载器都会先检查是否已经加载了该类,如果已经加载则直接返回,否则会将加载请求委派给父类加载器

每个类加载器都有一个父类加载器,在类加载的过程中,每个类加载器都会先检查是否已经加载了该类,如

果已经加载则直接返回,否则会将加载请求委派给父类加载器。

双亲委派机制有什么用?

什么是双亲委派机制?

双亲委派机制指的是:当一个类加载器接收到加载类的任务时,会向上交给父类加载

器查找是否加载过,再由顶向下进行加载。

双亲委派机制的作用:保证类加载的安全性,避免重复加载

打破双亲委派机制

ClassLoader中包含了4个核心方法:

ClassLoader中包含了4个核心方法,他们的调用关系如下:

ClassLoader中包含了4个核心方法,对Java程序员来说,打破双亲委派机制的唯一方法就是实现自定义类加载器

重写loadClass方法,将其中的双亲委派机制代码去掉。

ClassLoader中包含了4个核心方法,对Java程序员来说,打破双亲委派机制的唯一方法就是实现自定义类加载器

重写loadClass方法,将其中的双亲委派机制代码去掉

什么是双亲委派机制?

双亲委派机制指的是:当一个类加载器接收到加载类的任务时,会自底向上交给父类

加载器查找是否加载过,再由顶向下进行加载。

双亲委派机制的作用:保证类加载的安全性,避免重复加载。

打破双亲委派机制的方法:实现自定义类加载器,重写defineClass方法,将双亲委

派机制的代码去除。

相关推荐
阿龟在奔跑4 小时前
引用类型的局部变量线程安全问题分析——以多线程对方法局部变量List类型对象实例的add、remove操作为例
java·jvm·安全·list
王佑辉5 小时前
【jvm】方法区常用参数有哪些
jvm
王佑辉5 小时前
【jvm】HotSpot中方法区的演进
jvm
Domain-zhuo5 小时前
什么是JavaScript原型链?
开发语言·前端·javascript·jvm·ecmascript·原型模式
Theodore_10221 天前
7 设计模式原则之合成复用原则
java·开发语言·jvm·设计模式·java-ee·合成复用原则
我是苏苏1 天前
Web开发:ORM框架之使用Freesql的DbFrist封装常见功能
java·前端·jvm
天草二十六_简村人1 天前
Java语言编程,通过阿里云mongo数据库监控实现数据库的连接池优化
java·jvm·数据库·mongodb·阿里云·微服务·云计算
老码沉思录2 天前
Android开发实战班 - 数据持久化 - Room 数据库应用
android·jvm·数据库
起名字真南2 天前
【C++】深入理解 C++ 中的继承进阶:多继承、菱形继承及其解决方案
java·jvm·c++·chatgpt·aigc
偶尔。5352 天前
JVM垃圾回收算法详解
jvm