深入理解 JVM 类加载机制:从加载到初始化的全过程

【深入理解JVM】:类加载机制 概述虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。与那些在编译时需要进行链接工作的语言不同,在Java语言里,类型的加载、连接和初始化过程都是在程序运行期间完成的,例如import java.util.*下面包含很多类,但是,在程序运行的时候,虚拟机只会加载哪些我们程序需要的类。这种策略虽然会 阅读详情

在这里插入图片描述

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~
个人主页:.29.的博客
学习社区:进去逛一逛~

在这里插入图片描述


简介:

Java 虚拟机(JVM)的类加载机制是 Java 程序运行的基础,它确保了字节码文件在运行时被正确加载、验证和执行。JVM 类加载机制分为五个关键阶段——加载、验证、准备、解析和初始化。

类加载机制概述:

JVM 的类加载机制是一个分阶段的过程,每个阶段都有明确的任务和目标。通过这种逐步加载的方式,JVM 保证了类的安全性和一致性。以下是类加载机制的五个主要阶段:

  1. 加载 (Loading)
  2. 验证 (Verification)
  3. 准备 (Preparation)
  4. 解析 (Resolution)
  5. 初始化 (Initialization)



1. 加载 (Loading)

定义与任务

加载是类加载过程的第一个阶段。在这个阶段中,JVM 会完成以下几项任务:

  • 查找并加载字节码文件:JVM 会根据类的全限定名找到对应的 .class 文件,或者从其他来源(如网络、数据库等)获取字节码。
  • 生成 java.lang.Class 对象:在方法区(或元空间,取决于 JVM 实现)中创建一个代表该类的 java.lang.Class 对象,作为该类在 JVM 内部的数据入口。
  • 存储类信息:将类的二进制数据(包括类的版本、字段、方法、接口等信息)加载到内存中,并存放在方法区。



2. 验证 (Verification)

定义与任务

验证阶段的主要目的是确保字节码文件的完整性和安全性。具体来说,验证器会检查以下内容:

  • 文件格式验证:确认字节码文件符合 Java 类文件格式规范。
  • 元数据验证:检查类的元数据是否合法,例如是否有重复的字段或方法签名。
  • 字节码验证:确保字节码不会破坏 JVM 的安全模型,例如非法的操作码或不合理的跳转指令。
  • 符号引用验证:验证所有符号引用指向的类和成员是否存在且可访问。

目的

验证阶段的存在是为了防止恶意代码或损坏的字节码对 JVM 造成危害,从而保障 JVM 的安全性和稳定性。




3. 准备 (Preparation)

定义与任务

准备阶段的主要任务是在方法区中为类变量分配内存空间,并设置默认初始值。需要注意的是:

  • 基本类型:为 byte、short、int 分配 0,long 分配 0L,float 分配 0.0f,double 分配 0.0d,char 分配 \u0000。
  • 引用类型:为对象引用类型的类变量分配 null。
  • 常量赋值:如果类变量声明为 public static final,则直接赋给指定的常量值(例如 public static final int PORT = 8080 会被直接赋值为 8080)。

注意

准备阶段并不会为实例变量分配内存,这些将在对象实例化时进行。




4. 解析 (Resolution)

定义与任务

解析阶段的主要任务是将常量池中的符号引用转换为直接引用。符号引用通常包含以下几种类型:

  • CONSTANT_Class_info:表示类或接口的符号引用。
  • CONSTANT_Field_info:表示字段的符号引用。
  • CONSTANT_Method_info:表示方法的符号引用。

直接引用是指可以直接定位到目标实体的指针、相对偏移量或句柄。解析完成后,JVM 可以直接使用这些直接引用来访问类、字段和方法。




5. 初始化 (Initialization)

定义与任务

初始化阶段是类加载过程的最后一个阶段,也是真正开始执行类中代码的阶段。在这个阶段中,JVM 会执行以下操作:

  • 静态变量赋值:为类中的静态变量赋予显式赋值。
  • 静态代码块执行:执行静态代码块中的代码。
  • 父类初始化:先初始化父类,再初始化子类。

静态变量与静态代码块的执行顺序按照代码编写时的先后顺序执行。

初始化顺序

  • 类的初始化顺序:静态变量显示赋值 -> 静态代码块(按顺序执行)
  • 实例的初始化顺序:非静态变量显示赋值 -> 非静态代码块(按顺序执行) -> 构造器方法



总结:

JVM 类加载机制通过五个阶段——加载、验证、准备、解析和初始化,确保了 Java 应用程序能够在不同平台上稳定、安全地运行。每个阶段都有其特定的任务和目标,共同构成了 Java 的“一次编写,到处运行”的强大特性。

在这里插入图片描述

深入理解JVM类加载机制:从原理到实践 类加载机制是JVM将类的字节码文件加载到内存中,并转换为JVM能够识别的数据结构的过程。加载(Loading):查找并加载类的字节码文件。链接(Linking):验证类的正确性,为静态变量分配内存并解析符号引用。初始化(Initialization):执行类的静态初始化代码。用户可以通过继承类实现自定义类加载器,用于加载特定来源的类。在某些场景下,我们可能需要自定义类加载器,例如从网络、数据库或其他非标准来源加载类。@Override// 自定义加载逻辑// 从自定义来源加载类的字节码。 阅读详情

相关推荐

jdk9 Jvm的类加载机制

前言 昨天说今天更新一些jvm的内容。jvm的类加载模型在jdk9发生过变化。现在我们从jdk7以前开始谈起,聊一聊jvm的类加载机制。 标题上的内容在最后,只想看变化的往后翻。 文中内容大量取自 周志明 深入理解jvm 第三版 类加载的时机 .class文件平常是躺在磁盘上的,而我们需要使用它的时候就需要把它加载到内存中去,当我们不再使用它就应该把它卸载。 一个类从加载到虚拟机开始直...

xiaoy990的博客 1070

深入解析Java类加载机制

本文详细解析了Java类加载机制,主要包括:1.类加载的生命周期(加载、验证、准备、解析、初始化、使用、卸载);2.三层类加载器(启动类、扩展类、应用类)及其双亲委派模型;3.自定义类加载器的实现方法和应用场景;4.类卸载的条件和类加载的高级特性(命名空间、线程上下文加载器等)。该机制是JVM的核心功能,理解其原理对框架开发、热部署实现和解决类冲突等问题具有重要意义。

LTJ_18的博客 332

LoFTR训练避坑指南:从零到一复现论文训练流程

本文是一份详细的LoFTR模型训练避坑指南,旨在帮助开发者从零开始复现论文训练流程。文章系统性地讲解了环境配置、数据准备、代码调试与显存优化等关键步骤,并针对常见的训练错误提供了解决方案,确保训练过程顺利进行。

weixin_29091837的博客 204

深入理解类加载机制

开始正文之前,我想先说一下写这些文章的目的和好处,主要是可以使自己对学习的东西做一个总结,有时候花费很长的时间学了一些东西,理顺了一些思路,可是过几天再回想这些东西的时候还会变得模糊,所有又要花费时间找相关资料,翻看资料。而现在自己做这样一个总结,不但可以对新学习的知识做一个巩固加

2万+

基于gem5模拟trace的cache模拟器的实现

在做计算机体系结构的时候,模拟器是一个重要且又有效的工具。其中gem5集成了gem和m5的优点,使用起来比较简单和方便。其中包括了se模式和fs模式,se模式是在gem5运行我们已经编译好的程序,可以获取cache,cpu状态等数据,fs模式下可以模拟操作系统,我们可以将我们自己修改的linux内核加载到哥们上运行。下面介绍了使用gem5的se模式,运行编译好的ARM可执行文件。获取访存的trac

gaoxiang的专栏 8891

【论文+代码】ZS-N2N实现小样本零网络图像去噪

本文涵盖论文原文讲解与代码复现。

weixin_46287760的博客 4000

JVM 类加载机制详解:从字节码到内存的全过程

本文深入解析JVM类加载机制,从加载到卸载的完整生命周期包含七个阶段:加载、验证、准备、解析、初始化、使用和卸载。重点剖析了类加载过程的五个关键阶段(加载、验证、准备、解析和初始化)的工作原理及实现细节,特别是初始化阶段执行类构造器方法的多线程安全特性。详细介绍了JVM三类核心类加载器(启动类、扩展类和应用程序类加载器)及其双亲委派模型的设计原理,该机制通过层级委派确保类加载的安全性和唯一性。最后,通过自定义类加载器示例,展示了如何实现从特定路径加载加密类文件等特殊需求。理解类加载机制对解决类冲突、反射调用

dom_jun的博客 1165

FPGA开发中Quartus与Modelsim联合仿真配置与调试全攻略

在数字电路设计与FPGA开发中,仿真验证是确保逻辑功能正确性和时序性能达标的核心环节。其基本原理是通过软件模拟硬件电路的行为,在设计转化为实际硬件前发现潜在缺陷。这项技术的核心价值在于大幅降低开发风险与成本,提升设计可靠性,广泛应用于通信、嵌入式系统、芯片验证等领域。对于使用Intel FPGA平台的开发者,Quartus Prime作为官方综合布局布线工具,其内置仿真器在应对复杂设计、深度调试和自动化测试时存在局限。此时,引入专业仿真工具Modelsim进行联合仿真成为提升验证效率的关键实践。通过搭建自动

weixin_33736048的博客 449

JVM面试 类加载机制

JVM的类加载机制 一、JVM的运行机制 JVM 是用于运行Java字节码的虚拟机,包括一套字节码指令集,一组程序寄存器,一个虚拟机栈,一个虚拟机堆,一个方法区和一个垃圾回收器。JVM运行在操作系统之上,不与硬件设备直接交互; Java程序具体运行过程: JAVA源文件被编译器编译成字节码文件 JVM将字节码文件编译成相应操作系统的机器码 机器码调用相应操作系统的本地方法库执行相应的方法 二、JVM的类加载机制 1.JVM的类加载阶段 加载 验证 准备 解析 初始化 在类初始化完成后就可以使用该

分享技术,享受生活 7389

Cadence仿真实战:从零构建高精度带隙基准电压源

本文是一份详细的Cadence仿真实战指南,指导读者从零开始构建高精度带隙基准电压源。文章首先解释了带隙基准电压源稳定输出电压的原理,然后逐步演示了在Cadence Virtuoso环境中如何搭建测试电路、测量关键温度系数、计算并搭建核心电路,并通过参数扫描和迭代调优来驯服温度漂移,最终实现低漂移的基准电压输出。

weixin_29207533的博客 242

ADS交叉耦合振荡器VCO相位噪声优化仿真实践

本文详细介绍了在ADS软件中搭建和优化交叉耦合VCO相位噪声的完整仿真实践。通过谐波平衡与瞬态仿真分析电路性能,并重点阐述了通过提升谐振腔Q值、优化晶体管工作点及改善尾电流源来有效降低相位噪声的具体方法,为射频电路设计提供了实用指南。

weixin_29235923的博客 630

JVM类加载机制深度解析

在深入探讨Java虚拟机(JVM)的运行机制之前,我们首先需要了解JVM的核心知识点之一——加载过程。想象一下,一个复杂的Java应用程序启动时,JVM如何将代码从磁盘上的文件转换成可以在内存中运行的字节码。这个过程看似简单,实则涉及了JVM的多个组件和复杂的逻辑。在当今的软件开发中,内存管理是确保应用程序稳定性和性能的关键。然而,许多开发者往往忽视了JVM的加载过程,这可能导致对JVM内部工作原理的理解不足。

我是Java程序员廖志伟,感谢朋友们的支持! 1126

从零开始跑通3DGS教程:(四)修改(缩放、空间变换)colmap生成的sfm结果

通过colmap进行的sfm的普通方式会丢失场景的物理尺度信息,并且并不在符合一般认知的坐标系下,本文将读取colmap生成的点云和相机pose,将其进行空间变换和缩放之后,重新保存,新保存的结果仍然可以被colmap读取以及进行后续的稠密重建以及3dgs等工作

诺有缸的高飞鸟的博客 1424

死磕JVM:类加载机制

java虚拟机类加载机制

三分之一程序员 1533

Android 10.0 SystemUI 屏蔽状态栏消息推送弹出的悬浮通知

在状态栏中,有一些通知类似 消息推送 弹出的 悬浮通知,弹出30秒之后会消失掉 要想屏蔽掉这些通知,首选知道这些通知是怎么产生的 通知类型 NotificationContentInflater.java 详细的介绍各种通知的类型 frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java /** * The defau

安卓兼职framework和app工程师的博客 1541

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

JVM类加载机制解析

场景问题:在一个大型分布式系统中,每当启动一个新的服务实例时,系统管理员都会发现服务启动时间较长,且启动过程中资源消耗较大。经过分析,发现这是由于系统中的类加载机制不够高效,导致大量的类需要被重复加载,从而增加了启动时间和资源消耗。为了解决这个问题,我们需要深入了解JVM的类加载机制。知识点重要性:介绍JVM核心知识点之加载:概述的重要性在于,它是理解JVM运行时行为的基础。类加载是JVM执行Java程序的第一步,它决定了哪些类会被加载到JVM中,以及如何加载这些类。

MoneyHacksPro的博客 1111

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

类加载和初始化 —— JVM篇

类加载和初始化 一、Class Cycle(类的加载过程) 类的周期 一个类的完整生命周期如下: 类的加载过程 ​ Class文件在我们硬盘中,需要加载到虚拟机中之后才能运行和使用,那么虚拟机是如何加载这些 Class 文件呢? ​ 系统加载 Class 类型的文件主要三步:加载->连接->初始化。连接过程又可分为三步:验证->准备->解析。 详见:jvm规范5.4 。 1.Loading步骤(加载) 类加载过程的第一步,主要完成下面 3 件事情: 通过全类名获取定义此

YING—country的博客 2520

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JVM类加载:深入理解Java类加载机制

除了JVM内置的类加载器,我们还可以自定义类加载器来实现一些特殊的加载需求。自定义类加载器需要继承类,并重写findClass方法来实现类的加载逻辑。@Overridetry {在上面的示例中,我们定义了一个类,继承自。我们重写了findClass方法,根据类的名称加载字节码,并使用方法创建Class对象。使用自定义类加载器时,我们可以指定类的路径,然后使用自定义类加载器加载类。

果酱 の 博客 3417

【深入理解JVM】ClassLoader类加载机制

Java程序并不是一个原生的可执行文件,而是由许多独立的类文件组成,每一个文件对应一个Java类。此外,这些类文件并非立即全部装入内存的,而是根据程序需要装入内存。ClassLoader专门负责类文件装入到内存。在class文件中描述的各种信息,最终都需要被加载到虚拟机中之后,才能被运行和使用。虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换,解析和初始化,最终形成可以被虚拟机

lmb55的专栏 2705

【JVM的类加载机制】

本文介绍了JVM的类加载机制,主要包括类加载的时机、过程和初始化阶段。类加载的生命周期分为加载、验证、准备、解析、初始化和卸载7个阶段。主动引用会触发类初始化,而被动引用(如通过子类访问父类静态字段)不会。类加载过程包括获取二进制字节流、验证文件格式和字节码、准备内存空间并设置初始值、解析符号引用等步骤。初始化阶段执行类构造器<clinit>()方法,完成静态变量赋值和静态代码块的执行。文章还分析了常量传播优化等特殊情况对类加载的影响。

qq_75184576的博客 714

jvm深入理解类加载机制

概述 上一篇我们讲解了java文件到class文件的解析过程,但class文件中描述的信息都是死的,像一些类呀,在class文件里保存的只是一个全限定名,我们需要把这些数据加载到虚拟机里面去运行和使用,这一篇将讲解calss文件加载到虚拟机的过程,在内存中真正使用到各种信息。 java虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这个过程就被叫做虚拟机的类加载机制。 类加...

清风 1213

【JVM】Java类加载机制详解

【JVM】Java类加载机制详解

blblccc 1677

JVM类加载机制详解以及深入理解双亲委派模型

JVM类的加载机制类加载全过程类的加载器双亲委派机制双亲委派的优点全盘负责委托机制自定义加载器打破双亲委派机制 类加载全过程 经过验证,解析等一系列的操作变成类元信息放到内存中 加载:在磁盘上找到对应的类,通过io读取字节码文件,使用到类的时候才会加载到内存区域中,在加载阶段会在内存中生成类的class对象,作为方法区这个类的各种数据的访问接口 验证:验证字节码文件的正确性 准备:给类的静态变量做一些初始值的赋值,如int赋值0,对象赋值为null。 解析:讲符号引用替换为直接引用,改阶段会 初始化:

飞翔的蜗牛的博客 1332
上一篇: Java 的跨平台性:实现“一次编写,到处运行”的秘密
下一篇: Java 对象的生命周期:从创建到回收
.29.
.29. 2022 社区之星年度评选TOP 30 2022 社区之星年度评选TOP 30
博客等级 码龄5年 1万+粉丝 203原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.29.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值