【Java 虚拟机原理】Java 类中的类加载初始化细节 ( 只使用类中的常量时加载类不会执行到 ‘初始化‘ 阶段 )

简介: 【Java 虚拟机原理】Java 类中的类加载初始化细节 ( 只使用类中的常量时加载类不会执行到 ‘初始化‘ 阶段 )

文章目录

一、类加载初始化时机

二、常量加载示例

三、数组加载示例





一、类加载初始化时机


类加载时机 : Java 程序执行时 , 并不是一开始将所有的字节码文件都加载到内存中 , 而是用到时才进行加载 ;


通过 new 关键字创建实例对象 ;

通过 Class 反射 获取类 ; 如 : Class.forName(“Xxx”) 获取类 ;

序列化 / 反序列化 ;

调用 clone 克隆对象 ;

有 main 函数的类 , 会默认自动加载 ;

调用子类 , 如果之前没有加载过父类 , 则 自动加载父类 ;

访问 类 的 静态变量

image.png


有些类加载操作 , 不需要执行 加载 -> 连接 ( 验证 , 准备 , 解析 ) -> 初始化 这个完整的流程 ;


如 : 如果是 public final static 修饰的常量值 , 在编译阶段 , 就会将该值放到常量池中 ; 在类加载的过程中 , 只要执行到 加载 -> 连接 ( 验证 , 准备 , 解析 ) 阶段 , 就可以完成常量池的初始化 , 即使没有执行 初始化 这个步骤 , 也不影响使用类中的常量值 ;



在 连接 的 准备 阶段 , 为 普通 的 静态变量 进行 默认赋值 , 但是针对 静态常量 , 直接进行 指定赋值 ;


但是 普通的 静态变量 的 指定赋值 , 是在 初始化 阶段 完成的 ;



类 在 " 初始化 " 阶段 , 调用 静态代码块 ;






二、常量加载示例


类加载时 , 如果只用到了类中的常量 , 则只进行 " 加载 -> 连接 ( 验证 , 准备 , 解析 ) " 两个过程 :


public class Student {
    // 常量
    public static final int age = 18;
    static {
        // 加载类的 " 初始化 " 阶段才执行 静态代码块
        //  如果只是进行了 " 连接 " , 没有进行 初始化 , 则不会调用该代码块
        System.out.println("Student 静态代码块调用");
    }
}


主函数 :


public class Main {
    public static void main(String[] args) {
        int age = Student.age;
        System.out.println("main 函数 age = " + age);
    }
}


执行结果 :


image.png



上述 Student 类中的 静态代码块 没有被执行 , 说明 类加载 的流程中 , " 初始化 " 步骤 , 没有被执行 ;


找到 Student.class 字节码文件 , 然后使用


javap -v -Student.class


查看该字节码文件的附加信息 ;


在 " 常量表 " 中 , 发现了常量值 18 1818 , 这个常量值是在编译阶段就编译到了字节码中 ; 在 " 连接 " 的 " 准备 " 阶段 , 该常量值就设置完毕 ; 出于最大限度性能优化的考虑 , 如果不使用该类的其它值 , 就不会执行 " 初始化 " 阶段 ; 因此这里不会调用 静态代码块 中的代码 ;


Constant pool:
  #10 = Integer            18


image.png





三、数组加载示例


对数组进行创建操作 , 如创建了一个对象数组 , 此时不会加载该对象对应的类 , 只会为其在内存分配空间 ;


创建数组时 , 触发的是 Student[] 数组类型的 类加载初始化 , 但是不会触发 Student 类的初始化操作 ;


如果调用数组中的元素时 , 就需要初始化 Student 类 ;



Student 类 :


public class Student {
    // 常量
    public static final int age = 18;
    static {
        // 加载类的 " 初始化 " 阶段才执行 静态代码块
        //  如果只是进行了 " 连接 " , 没有进行 初始化 , 则不会调用该代码块
        System.out.println("Student 静态代码块调用");
    }
}


main 函数 :


public class Main {
    public static void main(String[] args) {
        System.out.println("main 函数执行");
        Student[] students = new Student[2];
    }
}


执行结果 : 只是创建数组 , 只需要为其分配内存空间 , 不需要为每个 Student 数组元素赋值 , 这里不需要初始化 Student 类 ;


image.png

目录
相关文章
|
3月前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
5月前
|
存储 Dart Java
Dart 虚拟机运行原理
【10月更文挑战第20天】Dart 虚拟机通过一系列复杂的机制和操作,确保 Dart 代码能够准确、高效地执行。它为 Dart 语言的广泛应用提供了坚实的基础和可靠的运行环境
90 6
|
5月前
|
存储 算法 Java
Java虚拟机(JVM)的内存管理与性能优化
本文深入探讨了Java虚拟机(JVM)的内存管理机制,包括堆、栈、方法区等关键区域的功能与作用。通过分析垃圾回收算法和调优策略,旨在帮助开发者理解如何有效提升Java应用的性能。文章采用通俗易懂的语言,结合具体实例,使读者能够轻松掌握复杂的内存管理概念,并应用于实际开发中。
|
5月前
|
SQL 缓存 Java
JVM知识体系学习三:class文件初始化过程、硬件层数据一致性(硬件层)、缓存行、指令乱序执行问题、如何保证不乱序(volatile等)
这篇文章详细介绍了JVM中类文件的初始化过程、硬件层面的数据一致性问题、缓存行和伪共享、指令乱序执行问题,以及如何通过`volatile`关键字和`synchronized`关键字来保证数据的有序性和可见性。
72 3
|
6月前
|
存储 算法 Java
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
本文介绍了 JVM 的内存区域划分、类加载过程及垃圾回收机制。内存区域包括程序计数器、堆、栈和元数据区,每个区域存储不同类型的数据。类加载过程涉及加载、验证、准备、解析和初始化五个步骤。垃圾回收机制主要在堆内存进行,通过可达性分析识别垃圾对象,并采用标记-清除、复制和标记-整理等算法进行回收。此外,还介绍了 CMS 和 G1 等垃圾回收器的特点。
161 0
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
|
7月前
|
Java 数据安全/隐私保护 Windows
【Azure Developer】使用Java代码启动Azure VM(虚拟机)
【Azure Developer】使用Java代码启动Azure VM(虚拟机)
|
3天前
|
Unix 虚拟化 iOS开发
FreeBSD 13.5 x86_64 OVF (sysin) - VMware 虚拟机模板
FreeBSD 13.5 x86_64 OVF (sysin) - VMware 虚拟机模板
16 1
FreeBSD 13.5 x86_64 OVF (sysin) - VMware 虚拟机模板
|
4月前
|
Ubuntu 网络安全 虚拟化
VMware虚拟机ping不通原因排查及分析
下面以 VMware 虚拟机为例进行介绍。
2626 3
|
17天前
|
存储 虚拟化
【2025最新】 神奇!VMware Workstation Pro虚拟机还原与删除功能,让你轻松应对各种场景!
删除和还原VMware虚拟机的操作步骤如下: **删除虚拟机:** 1. 选择要删除的虚拟机,右键点击并选择“移除”。 2. 这仅从列表中移除虚拟机,并未彻底删除。需前往VMware默认存储路径(如 `D:\VMware\data`),找到对应虚拟机文件夹并删除。 **还原虚拟机:** 1. 若误删虚拟机列表项目,可通过右键点击空白处,选择“打开”,找到保存虚拟机的路径文件夹。 2. 选择被删除虚拟机对应的 `.vmx` 配置文件并打开,即可在列表中恢复该虚拟机。 总结:VMware虚拟机可用于模拟多种操作系统和开发环境,掌握删除与还原技巧可提高使用效率。
75 8
【2025最新】 神奇!VMware Workstation Pro虚拟机还原与删除功能,让你轻松应对各种场景!
|
17天前
|
虚拟化
【2025最新】VMware Workstation Pro 虚拟机基础配置教程,方便你的神操作!
VMware Workstation Pro 是一款强大的虚拟化工具,本文简要介绍其基本配置与操作。安装后,用户可以通过“编辑菜单 > 首选项”设置虚拟机保存路径、是否显示托盘图标等全局配置。新建虚拟机时,需选择操作系统类型、配置处理器、内存、网络和硬盘等参数。建议根据主机硬件性能合理分配资源,避免过度占用。创建完成后,用户可加载 ISO 镜像文件安装所需操作系统。通过这些步骤,您可以轻松搭建并管理多个虚拟环境。
79 8
【2025最新】VMware Workstation Pro 虚拟机基础配置教程,方便你的神操作!