JVM类加载的时机

news2024/10/6 11:21:19

Java虚拟机(JVM)的类加载机制是Java语言运行时的核心组成部分。它负责将Java类的描述信息从Class文件加载到内存中,并进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。类加载的时机是指触发类加载器去加载一个类到内存中的具体条件。本文将详细介绍JVM类加载的时机。

一、主动引用的触发条件

在JVM中,当程序首次主动使用一个类时,会触发该类的加载和初始化。主动引用的触发条件包括以下几种情况:

  1. 创建类的实例
    当使用new关键字创建类的新实例时,如果该类尚未被加载和初始化,则会触发类加载过程。

  2. 访问类的静态变量或对其进行赋值
    当访问类的静态变量(除了被final修饰并已在编译期赋值的常量外),或者对静态变量进行赋值时,会触发类的加载和初始化。

  3. 调用类的静态方法
    当调用类的静态方法时,同样会触发类的加载和初始化。

  4. 使用反射
    当使用java.lang.reflect包中的方法对类进行反射调用时,如Class.forName()Constructor.newInstance()等,如果类还没有被加载和初始化,则会先触发其加载和初始化。

  5. 初始化子类
    当初始化一个子类时,如果其父类还没有被初始化,则会先触发父类的加载和初始化。

  6. JVM启动时的主类
    JVM启动时,会初始化包含main()方法的那个主类。

  7. 动态代理和动态类型语言支持
    在使用动态代理或JDK 1.7及以后版本引入的动态类型语言支持时,可能会触发相关类的加载和初始化。例如,当一个java.lang.invoke.MethodHandle实例最后的解析结果为REF_getStatic、REF_putStatic、REF_invokeStatic等类型的方法句柄,并且这个方法句柄对应的类没有进行过初始化时,需要先触发其加载和初始化。

  8. 接口中的默认方法
    当一个接口中定义了JDK 8新加入的默认方法(被default关键字修饰的接口方法)时,如果有这个接口的实现类发生了初始化,那该接口要在其之前被初始化。

二、被动引用的非触发条件

除了上述主动引用的触发条件外,其他引用都不会触发类的加载和初始化,这些被称为被动引用。以下是一些被动引用的例子:

  1. 通过子类的引用访问父类的静态变量
    这种情况下,只会触发父类的加载和初始化,而不会触发子类的加载和初始化。

  2. 通过数组定义引用类
    仅仅通过定义数组来引用类,并不会触发该类的加载和初始化。例如,Parent[] array = new Parent[10]; 这行代码不会触发Parent类的加载和初始化。

  3. 访问类中final修饰的静态常量
    如果常量在编译期间已经存入常量池,那么访问这个常量本质上并没有直接引用到定义该常量的类,因此不会触发该类的加载和初始化。

三、类加载的完整过程

需要注意的是,类加载的完整过程包括加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)和初始化(Initialization)五个阶段。其中,加载、验证、准备三个阶段通常是在初始化之前完成的,并且是由类加载器按照双亲委派模型进行的。类加载机制遵循“懒加载”原则,即只有在真正需要的时候才会加载相应的类。

四、总结

JVM类加载的时机是Java语言运行时的重要特性之一。了解类加载的时机有助于深入理解Java程序的执行过程,并优化程序的性能。在实际开发中,可以根据业务需求和性能要求来选择合适的类加载策略,以实现更高效、更灵活的程序运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2191764.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【WebGis开发 - Cesium】三维可视化项目教程---视点管理

目录 引言一、基础功能探索1. 镜头视角获取2. 镜头视角移动 二、进一步封装代码1. 封装hooks函数2. 看下效果3. 如何使用该hooks函数 三、总结 引言 本教程主要是围绕Cesium这一开源三维框架开展的可视化项目教程。总结一下相关从业经验,如果有什么疑问或更好的见解…

SQL自用小结

推荐一下这个知识点总结 《数据库系统概论》第五版 学习笔记总目录 1. SQL概述 SQL(Structured Query Language,结构化查询语言)是一种用于定义、查询、更新和控制关系数据库的标准化语言。 它包含了数据定义语言(DDL&#xff0…

(19)MATLAB使用Nakagami 分布对象生成Nakagami-m分布

文章目录 前言一、生成Nakagami分布随机变量的MATLAB代码1.仿真代码2.运行结果 二、传输信号经过衰落信道 前言 MATLAB在R2013a版本中开始引入Nakagami分布对象,可以用来生成Nakagami随机变量。下面给出一个使用实例,用于生成服从Nakagami 分布的随机变…

实战五:模拟10086查询功能

问题描述: 输入1,显示当前余额;输入2,显示当前的剩余流量,单位为G;输入3,显示当前的剩余通话,单位为分钟;输入0,退出自助查询系统。 编程: 1.方法一: # (1)初始化变量 answer y…

Java.数据结构.HashMap

目录 1基本概念 2数据结构 3常用操作 3.1 put(K key, V value):插入键值对。 3.2 get(Object key):根据键获取值。 3.3 remove(Object key):移除键值对。 3.4 containsKey(Object key):判断Map中是否包含指定的键。 3.5 c…

【Orange Pi 5 嵌入式应用编程】-用户空间SPI通信

用户空间SPI通信 文章目录 用户空间SPI通信1、理解SPI通信协议1.1 什么是SPI通信协议1.2 SPI如何工作?1.3 SPI数据传输步骤1.4 SPI的优缺点2、嵌入式Linux系统中的SPI通信3、Orange Pi 5 配置与编程3.1 Orange Pi 5开发板配置SPI3.2 SPI编程实现3.2.1 SPI用户空间函数定义3.2.…

Kafka 快速入门

目录 介绍 KafKa 相关术语 ​编辑 Kafka的工作流程 生产者向kafka发送数据的流程 Kafka选择分区的模式 Kafka选择分区的模式 数据消费 kafka的文件存储机制 topic、partition和segment 存储和查找message的过程 数据写入过程 数据查找过程 注意事项 kafka管理UI …

基于Springboot+Vue的高校学术交流平台 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统中…

论文阅读笔记-LogME: Practical Assessment of Pre-trained Models for Transfer Learning

前言 在NLP领域,预训练模型(准确的说应该是预训练语言模型)似乎已经成为各大任务必备的模块了,经常有看到文章称后BERT时代或后XXX时代,分析对比了许多主流模型的优缺点,这些相对而言有些停留在理论层面,可是有时候对于手上正在解决的任务,要用到预训练语言模型时,面…

Spring Boot项目的创建与使用

1.通过IDE创建Spring Boot项目 2.目录结构 3.新建TestController控制器 Controller public class TestController {RequestMapping("/test")public ModelAndView test(RequestParam(name "name", defaultValue "刘德华") String name){ModelA…

Pikachu-unsafe upfileupload-getimagesize

什么是getimagesize()? getimagesize()是PHP中用于获取图像的大小和格式的函数。它可以返回一个包含图像的宽度、高度、类型和MIME类型的数组。 由于返回的这个类型可以被伪造,如果用这个函数来获取图片类型,从而判断是否时图片的话&#xff…

matplotlib字体警告

import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] "Arial" plt.rcParams["figure.figsize"] (3, 3) plt.rcParams[font.size] 12sc.pl.umap(adata_concat, color[batch_name, Ground Truth, mclust], ncols3, wspace0.5, showTrue)结果如…

谷歌 DeepMind 发布 AlphaChip:AI 加速芯片设计,效率提升惊人!

近日,谷歌 DeepMind 公布了其最新的 AI 系统 ——AlphaChip。这一系统致力于加速和优化计算机芯片的开发,AlphaChip 所设计的芯片布局已经在谷歌的 AI 加速器中得到应用。 AlphaChip 的工作原理类似于我们之前所听说的 AlphaGo 和 AlphaZero&#xff0c…

NASA:北极植被地块 ATLAS 项目 北坡和苏厄德半岛,明尼苏达州,1998-2000 年

目录 简介 摘要 代码 引用 网址推荐 0代码在线构建地图应用 机器学习 Arctic Vegetation Plots ATLAS Project North Slope and Seward Peninsula, AK, 1998-2000 简介 文档修订日期:2018-12-31 数据集版本:1 本数据集提供了在北极陆地-大气系统…

模拟算法(5)_数青蛙

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 模拟算法(5)_数青蛙 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1. 题目链接…

Java项目实战II基于Java+Spring Boot+MySQL的房产销售系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者 一、前言 随着房地产市场的蓬勃发展,房产销售业务日益复杂,传统的手工管理方式已难以满…

旅游平台|智慧旅游平台|基于java的智慧旅游平台设计与实现(源码+数据库+文档)

智慧旅游平台 目录 基于java的智慧旅游平台设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师,阿里云开发…

[C++]使用纯opencv部署yolov11-pose姿态估计onnx模型

【算法介绍】 使用纯OpenCV部署YOLOv11-Pose姿态估计ONNX模型是一项具有挑战性的任务,因为YOLOv11通常是用PyTorch等深度学习框架实现的,而OpenCV本身并不直接支持加载和运行PyTorch模型。然而,可以通过一些间接的方法来实现这一目标&#x…

打造银行智能营销助手:大模型助力精准营销

在金融科技快速发展的时代,银行的业务模式和客户需求都发生了巨大变化。为了应对日益激烈的市场竞争,银行必须依托先进技术,提升客户服务水平和营销效率。银行智能营销助手应运而生,它通过结合知识图谱和大模型(LLM&am…

Ubuntu22.04 Docker 国内安装最靠谱教程

目前docker在国内安装常存在众所周知的网络问题,如果安装过程如果从官网地址安装以及安装之后从官网要拉取镜像都存在问题。这篇文章主要针对这两个问题总结最靠谱的docker安装教程。 1. docker安装 1.1 系统环境概述 Ubuntu 22.04linux内核版本 6.8(…