JVM 类加载机制

JVM 类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程。

加载

加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这个类的

java.lang.class 对象,作为方区这个类的各种数据的入口,注意这里不一定非得要

从一个class文件获取,这里既可以从zip 包中读出(比如从 jar 包),也可以由其它文件

生成(比如将JSP文件 转换成对应的Class类)

验证

这一阶段的主要目的是为保证Class文件的字节流包含的信息是否符合当前虚拟机的要求

,并且不会危害虚拟自身的安全

准备

准备阶段是正式为类变量分配内存并设置类变量的初始值阶段,既在方法区中分配这些变量

所使用的内存空间,注意这里所说的初始值概念,比如一个类变量定义为:

public static int v=80;

准备阶段后初始值 为0 而不是80

解析

解析阶段将类中的符号引用转换为直接引用,即将类、方法和字段的引用解析为内存地址

初始化

初始化阶段是类加载最后一个阶段,前面的类加载阶段之后,除了在加载阶段可以自定义类加载器以外,其它操作都由 JVM 主导。到了初始阶段,才开始真正执行类中定义的 Java 程序代码。

初始化阶段是执行类构造器方法的过程。方法是由编译器自动收集类中的类变量的赋值操作和静态语句块中的语句合并而成的。虚拟机会保证子方法执行之前,父类的方法已经执行完毕,如果一个类中没有对静态变量赋值也没有静态语句块,那么编译器可以不为这个类生成()方法。

注意以下几种情况不会执行类初始化:

  1. 通过子类引用父类的静态字段,只会触发父类的初始化,而不会触发子类的初始化。

  2. 定义对象数组,不会触发该类的初始化。

  3. 常量在编译期间会存入调用类的常量池中,本质上并没有直接引用定义常量的类,不会触发定义常量所在的类。

  4. 通过类名获取 Class 对象,不会触发类的初始化。

  5. 通过 Class.forName 加载指定类时,如果指定参数 initialize 为 false 时,也不会触发类初始化,其实这个参数是告诉虚拟机,是否要对类进行初始化。

  6. 通过 ClassLoader 默认的 loadClass 方法,也不会触发初始化动作。

相关推荐
Filwaod14 小时前
Java面试现场:从Redis缓存到分布式事务,水货程序员李四的‘表演‘
java·jvm·spring boot·redis·mysql·面试·多线程
2401_8676239814 小时前
解决Navicat多图纸模型工作区协同报错怎么办_外键关联与语法解析
jvm·数据库·python
sinat_3834373614 小时前
如何为表名加上图标前缀_根据表前缀自动匹配图标
jvm·数据库·python
wang3zc14 小时前
如何在 Go 中为权威 DNS 服务器实现持久化域名记录存储
jvm·数据库·python
duke86926721414 小时前
如何在Bootstrap中实现响应式的统计数据卡片
jvm·数据库·python
2401_8463395614 小时前
如何优化SQL存储过程复杂排序_减少内存压力与重排操作
jvm·数据库·python
ㄟ留恋さ寂寞14 小时前
PHP怎么实现SAML单点登录_PHP企业级SSO解决方案【指南】
jvm·数据库·python
m0_7406532215 小时前
告别重复编码-Symfony自动化开发指南
jvm·数据库·python
iAm_Ike15 小时前
placeholder属性在IE9下有效吗_低版本表单提示替代方法【技巧】
jvm·数据库·python
m0_7414817816 小时前
SQL删除包含敏感信息的数据_使用数据脱敏后执行删除
jvm·数据库·python