Java类加载机制

Java 类加载机制(超详细版) JVM 通过类的全限定名(比如找到对应的 .class 字节码文件,将其读入内存,并生成一个代表该类的对象(存储在方法区,是类的 “元数据载体”)。默认类加载器只能加载 “特定路径” 的类,若需要加载 “加密字节码”“网络字节码”“数据库存储的字节码”,则需要自定义类加载器。继承类(或,简化 URL 路径加载);重写方法(核心:实现字节码的读取和转化);调用方法(将字节数组转为Class对象,由父类提供,不可重写)。不要重写方法(默认实现双亲委派逻辑),若重写可能破坏双亲委派模型; 阅读详情

类加载机制

将class文件中的二进制数据读取到内存中,并对其进行校验,解析和初始化,将类型数据存放在方法区,实例对象存放在堆,作为方法区该类的数据访问接口。这就是类加载。
类的生命周期

加载

  1. 通过全限定名获取二进制字节流
  2. 将字节流代表的静态存储结构转化为方法区的运行时数据结构
  3. 在堆中生成一个代表该类的Class对象,作为方法区该类的数据访问接口

加载

连接

验证、准备、解析统称为连接

验证

img

  1. 文件格式验证:第一阶段要验证字节流是否符合Class文件格式的规范,并且能被当前版本的虚拟机处理。
  2. 元数据验证:第二阶段是对字节码描述的信息进行语义分析,以保证其描述的信息符合《Java语言规范》的要求。
  3. 字节码验证:第三阶段是通过数据流分析和控制流分析,确定程序语义是合法的、符合逻辑的。
  4. 符号引用验证:符号引用验证可以看作是对类自身以外(常量池中的各种符号引用)的各类信息进行匹配性校验,通俗来说就是,该类是否缺少或者被禁止访问它依赖的某些外部类、方法、字段等资源。

准备

为类中定义的变量,(Static)分配内存并设置初始值

JDK7及以前,分配在方法区
JDK8及以后,随Class对象一起存放在Java堆中

解析

Java虚拟机将常量池内的符号引用替换为直接引用。

符号引用(Symbolic References):符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可。符号引用与虚拟机实现的内存布局无关,引用的目标并不一定是已经加载到虚拟机内存当中的内容。各种虚拟机实现的内存布局可以各不相同,但是它们能接受的符号引用必须都是一致的,因为符号引用的字面量形式明确定义在《Java虚拟机规范》的Class文件格式中。

直接引用(Direct References):直接引用是可以直接指向目标的指针、相对偏移量或者是一个能间接定位到目标的句柄。直接引用是和虚拟机实现的内存布局直接相关的,同一个符号引用在不同虚拟机实例上翻译出来的直接引用一般不会相同。如果有了直接引用,那引用的目标必定已经在虚拟机的内存中存在。

初始化

类加载过程的最后一个步骤,在该阶段,Java虚拟机才真正开始执行类中编写的Java程序代码,将主导权移交给应用程序。

类加载器

用来实现通过类的全限定名获取类字节流数据的动作。
类加载器时独立于Java虚拟机的,允许程序员按自身需要自行实现类加载器。使得同一个类可以实现访问隔离、OSGi、程序热部署等等。

三层累加载器

启动类加载器(Bootstrap Class Loader):负责加载<JAVA_HOME>\lib 目录,或者被 -Xbootclasspath 参数制定的路径,例如 jre/lib/rt.jar 里所有的class文件。由C++实现,不是ClassLoader子类。

拓展类加载器(Extension Class Loader):负责加载Java平台中扩展功能的一些jar包,包括<JAVA_HOME>\lib\ext 目录中 或 java.ext.dirs 指定目录下的jar包。由Java代码实现。

应用程序类加载器(Application Class Loader):我们自己开发的应用程序,就是由它进行加载的,负责加载ClassPath路径下所有jar包。

双亲委派模型

类加载器在接到类的加载请求时,先加载父类(父类加载器),只有父类无法加载时,才尝试自己加载。

不同的类加载器加载同一个类,会出现存放不同的类的信息。
使用双亲委派模型,可以保证一个类只有一个类加载器。

载器加载同一个类,会出现存放不同的类的信息。
使用双亲委派模型,可以保证一个类只有一个类加载器。

如有疏错,恳请指正。

MultiOTP Credential Provider避坑指南:从安装到RDP双因素认证的全流程解析 本文详细解析了MultiOTP Credential Provider从安装到实现RDP双因素认证(MFA)的全流程,重点分享了Docker部署、Active Directory集成及网络级认证(NLA)兼容性等环节的实战避坑经验,旨在帮助运维人员高效、稳定地部署离线双因素认证方案,提升Windows远程桌面安全性。 阅读详情

相关推荐

el-transfer和el-tree进行结合搞一个树形穿梭框

由于业务需求需要在穿梭框里使用树形结构,但是本身element里并不支持,于是参考了别的大佬发的文章作为思路及后续自己新增了一些处理功能。

bbkhhvv的博客 6307

Java类的加载机制

1、加载的生命周期类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Intialization)、使用(Using)、卸载(Unloding)7个阶段。其中验证、准备、解析 3个部分统称为链接(Linking)。加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始,而解析阶段则不一定:它在某些情况下可以在初始化阶段之

u010257931的博客 3999

Autodesk全家桶安装总报错1603?一个服务设置搞定3dsMax和CAD安装回滚问题

本文详细解析了Autodesk全家桶安装过程中常见的1603错误,特别是3ds Max和CAD安装回滚问题。通过调整AdskLicensingService服务的账户权限,提供四步修复法和安装流程优化策略,帮助用户彻底解决安装难题,提升Autodesk软件的安装成功率。

weixin_30955617的博客 1122

一文搞懂Java类加载机制

初始化阶段是执行类构造器()方法的过程。

BarackYoung的博客 5431

基于DSP28335的Matlab/Simulink代码生成实验七:A/D采样

实验七:讲解如何使用DSP的ADC模块,通过代码生成技术控制DSP进行电流采样,是后续实现电机闭环控制的重要环节。通过简单的实验来熟悉代码生成的过程。最终实现复杂算法代码自动生成,进行高性能电机控制!

m0_73869369的博客 4725

Benchmark系列——UnixBench测试项深度解析与性能优化指南

本文深度解析UnixBench基准测试套件的各项测试原理,包括Dhrystone、Whetstone、系统调用、进程管理、IPC及文件I/O等核心测试项。通过详细的测试项分析,指导用户解读测试报告,并提供针对性的内核参数调整、编译优化及系统配置实战指南,帮助用户精准定位并优化系统性能瓶颈。

weixin_29230901的博客 276

Java 类加载机制

​ 本文深入地介绍了 Java 类加载机制,包含了 类生命周期、类加载器、双亲委派模型、自定义类加载器等相关知识点。

大大怪将军的博客 3517

具身智能机器人算法控制研究进展综述

具身智能(Embodied Intelligence)作为人工智能与机器人学的交叉前沿领域,强调智能体通过物理身体与环境的持续交互涌现智能行为。近年来,随着基础模型(Foundation Models)、扩散策略(Diffusion Policy)、视觉-语言-动作(Vision-Language-Action, VLA)模型以及大规模机器人数据集(如Open X-Embodiment)的快速发展,具身智能机器人的算法控制范式正经历深刻变革。

VectorShift的博客 230

java类加载机制

什么是类加载机制呢? java虚拟机将编译后的class文件加载到内存中,进行校验、转换、解析和初始化,到最终的使用。这就是java类加载机制; 下面就开始今天的内容: 1、类加载的生命周期:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸载(Unloading)等阶段,其中验证、准备、解析3阶段也可以称为连接(Lingking),如下图: 类的生命周期 2、类

m0_61607827的博客 9781

2026年大数据开发工程师常见面试选择题

大数据面试高频考点解析 摘要:本文汇总了30道大数据开发面试高频题目,涵盖Hadoop生态、Spark、Flink、Kafka等核心组件。重点包括:1)HDFS架构与特性(5V特征、副本机制);2)MapReduce/Spark原理(Shuffle过程、RDD抽象);3)实时计算(Kafka消费组、Flink Watermark);4)数据仓库设计(分层模型、性能优化)。特别强调数据倾斜、小文件问题等实战场景的解决方案,以及从日志、资源等多维度排查任务异常的方法。掌握这些基础原理和典型问题应对策略,是应对大

不务正业的猿 451

通过WorkVisual连接KUKA机器人的具体方法

通过WorkVisual连接KUKA机器人的具体方法

Robot_PLC_HMI_Automation 6844

JAVA类加载机制

​ 虽然经理在OA系统里看不到SalaryCaler类的源码了,但是通过OA系统的源码最终还是可以找到这个jar包。那么就可以对jar包进行反编译,查看到jar包对应的源码了。所以,老王还需要考虑如何对class文件进行代码混淆,让经理无法反编译出源码。简单一点的,将class文件的后缀改一下,从.class转为.myclass。就像大家把游戏软件改成.txt结尾一样。只是修改后缀,那么经理还可以把后缀改回来再反编译。所以稳妥一点的方法,是要改一改class文件当中的二进制内容。

博客 1247

华为OD机试双机位C卷:打印机队列 (C++/Py/C/Java/Js/Go)

华为OD机试双机位C卷 打印机队列,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 打印机队列。

qq_45776114的博客 1793

【Java】类加载机制

本文探讨 Java 类加载机制的各个方面,包括类加载的过程、类加载器的作用以及类加载的触发条件等

qq_45797138的博客 914

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【JAVA】类加载机制

​ 虽然经理在OA系统里看不到SalaryCaler类的源码了,但是通过OA系统的源码最终还是可以找到这个jar包。那么就可以对jar包进行反编译,查看到jar包对应的源码了。所以,老王还需要考虑如何对class文件进行代码混淆,让经理无法反编译出源码。简单一点的,将class文件的后缀改一下,从.class转为.myclass。就像大家把游戏软件改成.txt结尾一样。只是修改后缀,那么经理还可以把后缀改回来再反编译。所以稳妥一点的方法,是要改一改class文件当中的二进制内容。

2301_79456272的博客 1384

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

图解Java类加载机制

前言 类加载的概述 双亲委派加载机制 类加载的隔离机制 contextClassLoader SPI用处 找文件用处 类加载的顺序 顺序概述 类加载的一般方式 类加载的触发点 类的实例化 附录前言网上有很多的Java类加载机制的介绍, 但是对于初学者而言看起来都太过于深疏, 因此在本文用图解和例子的方式为本文的读者介绍Java的类加载机制。类加载的概述双亲委派加载机制委派模型介绍: 双亲委派模型

平菇虾饺 9085

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

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

Java 类加载机制详解

Java类加载机制是Java运行时的核心,包含加载、验证、准备、解析、初始化等阶段,遵循双亲委派模型确保安全性和唯一性。类加载器分为启动类、扩展类、应用类和自定义类加载器,自定义类加载器可实现热部署和隔离。常见问题包括类冲突和加载异常,可通过调整类路径或隔离解决。该机制在热部署、插件化等场景有重要应用,深入理解有助于排查问题和优化性能。

weixin_43114485的博客 2007

Java 类加载委托机制

Java 中的类加载机制是 JVM 的核心之一,它通过将字节码加载到内存中,使得程序能够正常运行。而在这个过程中,Java 引入了一种独特的“类加载委托机制”(也称双亲委派机制),以确保类加载的稳定性与安全性。本篇文章将详细阐述这一机制的原理、实际应用及其潜在的优缺点,帮助读者深入理解这一关键概念。

猿小蔡的博客 1061

Java中的类加载机制

Java的类加载机制主要是为了在运行时动态加载类。这种机制不仅使Java程序更灵活,而且显著提高了内存利用效率。类加载器(ClassLoader)在Java虚拟机(JVM)中扮演着至关重要的角色,负责从不同的资源(如文件系统、网络等)加载类文件,并将它们转换为JVM可以执行的字节码。有时候,开发者需要定制自己的类加载器以满足特定需求。自定义类加载器需要继承类,并重写findClass方法。这个方法负责从自定义的资源(如网络、数据库)中加载类的字节码,并将其转换为Class对象。

weixin_46372265的博客 836
上一篇: JVM内存模型
twfplayer
博客等级 码龄6年 747粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

twfplayer

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

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

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

打赏作者

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

抵扣说明:

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

余额充值