JVM类加载机制

深入解析以太网接口中的BOB Smith电路设计 本文深入解析以太网接口中的BOB Smith电路设计,详细介绍了其在共模噪声抑制、浪涌防护和EMI优化中的关键作用。通过实际案例和设计要点,帮助工程师正确选择75Ω电阻和高压电容等元件,优化PCB布局,解决电压型与电流型PHY的设计差异,以及千兆与百兆以太网的特殊考量。 阅读详情

JVM的类加载分为三个部分:加载、连接(验证、准备、解析)、初始化。类的加载是线程安全的!

加载:

加载分为三个步骤:

1、根据类的全限定类名将该类以二进制流的方式读入。可以重写ClassLoader的loadClass()方法来改写获取二进制流的方式。

2、在方法区中生成该类的结构。

3、生成Class对象作为访问方法区中类结构的入口。注意在hotspot中Class对象存放在方法区中。

连接:

1)验证

(1)文件格式验证

(2)类元数据验证:

            1、方法有无父类。

            2、方法是否继承了不该被继承的类(final类)。

            3、方法若不是抽象类,继承的接口/抽象类的抽象方法是否全部实现。

(3)字节码验证:

            1、保证字节跳转不会跳转到方法体以外的方法上。

            2、确保类型转换可以正常进行。

            3、保证操作数栈的数据类型与指令序列可以配合工作。

(4)符号引用验证:

            通过字符串描述的全限定类名是够能找到响应的类。

            在指定类中是否存在符合方法的字段描述的方法以及简单名称所描述的字段。

            符号引用中的类、字段、方法的修饰符(private、public、protected、default)是否可被当前类访问。

2)准备   

准备的目的是将类变量(static修饰的变量)进行初始化为0。注意不是真正的赋值。真正的赋值需要等到初始化时进行。但是如果是常量(public static final)的话会直接赋予程序员定义的值,不会先进行初始化。

3)解析        

解析的目的是将符号引用转化为直接引用,即将名字字符串转化为运行时的地址。

(1)类/接口解析

        1、设当前类为A,若想在A中加载类/接口B,则JVM会将B的全限定类名传入A的类加载其中进行加载。

              如果B 触发了其他的类加载动作但这个过程中出现了失败,则解析结束。

        2、若B是一个对象数组类型,则按照一对元素类型进行加载,再接着由JVM生成数组对象。

        3、若以上的步骤没有错误,则虚拟机中已经有了一个有效的B类/接口。最后进行符号引用验证,确保A可

              以访问B,否则抛出IllegalAccessError异常。          

(2)字段解析

        1、JVM首先会解析该字段所属的类/接口(通过常量池),若类/接口解析失败则此次字段失败。

             若成功,设声明该字段的类为A。

        2、如果A中有与该字段的简单名称和字段描述符匹配的字段,则返回这个字段的直接引用。

        3、否则去A的父接口递归的逐层寻找与该字段的简单名称和字段描述符匹配的字段,若有则

              返回这个字段的直接引用。

        4、否则去A的父类递归的逐层寻找与该字段的简单名称和字段描述符匹配的字段,若有则

              返回这个字段的直接引用。

        5、若没有该字段抛出NoSuchFieldError异常。

        6、对成功返回的引用进行权限验证,如果不能对该字段进行访问抛出IllegalAccessError异常。

(3)类方法解析  

         1、如果在类方法表中发现class_index索引的类A是个接口,直接抛出java.lang.IncompatibleClassChangeError异常。

         2、若步骤1成功,在类A中查找是否有简单名称和描述符都与目标匹配的方法,有则返回该方法的直接引用。

         3、否则按步骤2的方法递归的查找父类。

         4、否则按步骤2的方法递归的查找C实现的接口列表及其父接口。若找到说明C为抽象类,抛出AbstractMethod异常。

         5、查找成功之后会进行权限验证,如果不具备对此方法的访问权限,抛出IllegalAccessError异常。

(4)接口方法解析     

         1、如果在接口方法表中发现class_index索引的接口A是个类,直接抛出IncompatibleClassChangeError异常。

         2、若步骤1成功,在接口A中查找是否有简单名称和描述符都与目标匹配的方法,有则返回该方法的直接引用。

         3、否则按步骤2的方法递归的查找父接口,直到Object(包括Object)。

         4、否则宣告查找失败,抛出NoSuchMethodError异常。

初始化:

初始化阶段是类加载过程的最后一步,主要是<clinit>()方法执行。<clinit>()方法负责把类变量的赋值动作

和静态代码块中的语句收集在一起(由编译器自动收集),收集顺序按照源文件中的出现顺序所决定。所以静态代码块只可以访问

在其之前的变量,可以赋值但是不能访问在其之后的变量。

public class Test {
    static {
        i = 2;    //成功
        System.out.println(i);    //失败
    }
    static int i = 1;
}

<clinit>()方法有以下特点:

1、<clinit>()方法保证在其执行之前该类父类中的<clinit>()方法已经执行完毕

2、由于父类<clinit>()方法先执行,所以父类静态代码块比子类先执行

3、对于接口来说不需要先执行父接口的<clinit>()方法,接口的实现类也不必先执行父接口的<clinit>()方法。

     只有当父接口定义的类变量使用时才会执行<clinit>()方法。

4、<clinit>()方法不是必须的,若没有类变量或者静态代码块的话可以不生成。

5、若有多个线程初始化一个类,JVM保证只用其中一个线程去执行<clinit>()方法,其他线程阻塞。所以                         <clinit>()方法是线程安全的。但是如果 <clinit>()方法中有很耗时的做法的话会造成线程等待:

public class Test {
    static {
        while(true) {}
    }
}

类加载器:

三种加载器:

JVM中只存在两种不同 的类加载器:一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用C++实现 ,是虚拟机自身的一部分;另一种就是所有其他的类加载器,这些类加载器都由Java实现,独立于虚拟机外部且全都继承自抽象类 java.lang.ClassLoader。

启动类加载器(Bootstrap ClassLoader):将存放在<JAVA_HOME>\lib目录中的,或者被Xbootclasspath参数所指定的路径中的,并且是虚 拟机识别的(仅按照文件名识别,如rt.jar,名字 不符合的类库即使放在lib目录中也不会被加载)类库加载到虚拟机内存中。该加载器无法被 Java程序直接引用,用户在编写自定义类加载器时,如果需要把加载请求委派给引导类加载器, 那直接使用null代替即可。

扩展类加载器(Extension ClassLoader):它负责加载<JAVA_HOME>\lib\ext目录中 的,或者被java.ext.dirs系统变量所指定的路径中的所有类库,可以直接使用或者扩展该加载器。

应用程序类加载器(Application ClassLoader):一般也称它为系统类加载器。它负责加载用户类路径(ClassPath)上所指定的类库,开发者可以直接使用这个类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。
 

唯一性:

在JVM中,一个类和他所在的加载器在JVM中确定唯一性。也就是说,要想比较两个类是否相等,这两个类必须处于同一类加载器命名空间中:

                 类加载器A                                           类加载器B

            ————————                              ————————

            |     类名称空间1   |                            |   类名称空间1     |

            |                            |                            |                            |

            |    Class C           |                             |     Class C          | 

            |                            |                            |                            |

            ————————                             ————————

比如这两个Class都叫做C,但是由于分别处在不同的类加载器命名空间中,所以这两个C不相等。

双亲委派机制:

由于Java中可以实现自己的类加载器,那么根据唯一性原理的话,用多个类加载器去加载类C那么会导致JVM中有多个不通的

类C。那么如果要创建类C的实例,那么使用哪一个类C呢?这就会导致类加载的不确定性。为了解决这个问题,JVM中引入了

双亲委派机制:如果要加载一个类,那么从子类开始不断地递归的往父类加载器传递让父类完成加载。因此所有的类加载请求

最终都应该传到顶层的bootstrap classloader中进行加载。注意类加载器之间的关系不是使用继承来实现,而是使用组合来实现。

双亲委派机制的优点:

1、沙箱安全机制:自己写的String类并不会加载,bootstrap loader只会加载lib目录下JRE中的String类。

2、避免类的重复加载。                 

全盘委托机制:

当一个ClassLoader加载一个类时,除非指定使用另一个ClassLoader,否则该类使用和依赖的类也由这个ClassLoader加载。

056:vue+openlayers 风场快速移动效果(图文代码) 本示例的目的是介绍演示如何在vue+openlayers中使用wind插件来实现风场快速移动的效果。 阅读详情

相关推荐

KMS服务器一键部署与激活实战指南

本文详细介绍了KMS服务器的一键部署与激活实战指南,包括快速入门、安装步骤、服务管理技巧及常见问题排查。特别针对Windows和Mac用户提供了Office激活的具体操作步骤,并分享了高级配置与优化方案,帮助IT管理员高效管理批量授权激活。

weixin_29305313的博客 461

【JVM】查看JVM加载的类及类加载器的方法

查看JVM加载了哪些类# java -verbose[:class|gc|jni]在输出设备上显示虚拟机运行信息。 java -verbose:class# 在程序运行的时候有多少类被加载!你可以用verbose:class来监视,在命令行输入java -verbose:class XXX(XXX为程序名),也可以直接在JVM启动时添加启动参数-verbose:class,你会在控制台(或者指定的启动日志文件,如catalina.out中)看到加载的类的情况。verbose和verbose:cl...

sxbcsdn的专栏 2710

Matlab中eig内置函数转为C语言

本文记录一下如何将MATLAB中的eig函数转为C语言,即通过C语言求解矩阵的特征值与特征向量。[V,D]=eig(Rx)中V为矩阵Rx的特征向量,D为矩阵的特征值。其中Rx维度为12*12的复矩阵。 首先在MATLAB端创建入口函数保存为eigvalue.m: 打开MATLAB Coder,添加入口函数: 3.在定义输入类型窗口中,需要添加输入数据来训练...

u011441044的博客 3516

JVM 类加载机制详解

通过前面的分析,我们可以看出,除了和本地实现密切相关的启动类加载器之外,包括标准扩展类加载器和系统类加载器在内的所有其他类加载器我们都可以当做自定义类加载器来对待,唯一区别是是否被虚拟机默认使用。首先检查请求的类型是否已经被这个类装载器装载到命名空间中了,如果已经装载,直接返回;否则转入步骤2;委派类加载请求给父类加载器(更准确的说应该是双亲类加载器,真实虚拟机中各种类加载器最终会呈现树状结构),如果父类加载器能够完成,则返回父类加载器加载的Class实例;否则转入步骤3;

十年以上架构设计经验,专注于软件架构和人工智能领域,对机器视觉、NLP、音视频等领域都有涉猎 4781

Visual Studio Code 打开java项目

在 Visual Studio Code 中打开并运行一个 Java 项目之前,你需要确保你已经完成了一些初始设置。

2674

OpenClaw一人公司落地案例:本地商家营销智能体月赚3万的秘密

角色:本地商家营销专家## 核心目标为商家生成高转化率的抖音营销策略,最大化 ROI。## 输入数据- 商家名称: "XX奶茶店"- 过去 30 天视频播放量: 12,000- 客单价: 28 元- 竞品平均播放量: 15,000- 市场趋势: rising## 策略生成规则1. **内容类型**:根据客单价推荐- < 30 元:美食探店 + 优惠券- > 30 元:场景化故事 + 会员权益2. **发布时间**:根据历史数据- 18:00-20:00 高峰期。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 542

在Java中判断类是否已加载

方法优点缺点适用场景简单易用可能触发类加载简单检查反射findLoadedClass准确可靠需要反射权限精确检查Java Agent功能强大需要配置Agent监控系统JMX标准API可能不准确监控统计综合工具类全面覆盖代码稍复杂生产环境。

2203_75376529的博客 491

CelebA-HQ数据集下载【详细明了版】分辨率包括【64,128,256,512,1024】

CelebA-HQ 是在ICLR2018上,nVidia发表了一篇名为Progressive Growing of GANs for Improved Quality, Stability, and Variation的论文,文中通过训练高分辨率GAN生成了一个新的人脸数据集CelebA-HQ.CelebA是港科大汤晓鸥组收集的人脸数据集(总共200k图片),包括了人脸特征点(landmark),人脸属性(attribute)等信息,详细介绍参考链接[1]和[2]

zik的博客 1万+

JVM类加载机制-类是如何被加载的?

JVM把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被JVM直接使用的Java类型,这就是JVM的类加载机制类的生命周期JVM规范中初始化的条件被动引用不会触发初始化类加载的过程加载:非数组类:数组类:验证文件格式验证元数据验证字节码验证符号引用验证准备解析初始化 类的生命周期 加载、验证、准备、初始化和卸载5个阶段的顺序是确认的,类加载过程必须按照这种顺序按部就班的开始,在动态绑定中解析可以在初始化后完成 JVM规范中初始化的条件 使用new关键字实例化对象

qq_24760259的博客 869

C#串口通信从入门到精通(1)——硬件接线

RS-232接口一般都是9针的,有公母头(针头和孔头),为了便有理解以下都称为针头和孔头,针头就是露出来的针,孔头就是9个孔,总共使用3条线进行通信,一条用于发送,一条用于接收,另外一根是GND地线,由于线路的功能是永久性的,设置连接时,必须确保一个节点的发送线与另一个节点的接收线相连,反之亦然,RxD(PC的接收线)连接到TxD(传感器电子设备的发送线),TxD(PC的发送线)连接到RxD(传感器电子设备的发送线)。两条线路的电平都是相对于GND的。因此,GND也必须连接,但不能将GND与屏蔽连接。

qq_34059233的博客 1万+

基于CNN的三相故障识别算法及实现(Matlab)

通过预处理数据、构建CNN模型、训练与评估模型等步骤,我们可以准确快速地识别三相故障。现代电力系统中,三相故障是一种常见的故障情况,可以导致电网中断、设备损坏甚至火灾等严重后果。本文将介绍基于卷积神经网络(CNN)的三相故障识别算法,并提供Matlab源代码实现。首先,将原始信号分为训练集和测试集。然后,对输入信号进行归一化处理,确保数据在合适的范围内。CNN适用于处理二维数据,所以我们可以将输入信号看作是时间序列数据和特征(如电压、电流等)的二维矩阵。在开始之前,我们需要一个包含正常和故障样本的数据集。

学习使你进步。 384

类加载器

类加载器 1 什么是类加载器 类加载器就是用来加载类的东西!类加载器也是一个类:ClassLoader 类加载器可以被加载到内存,是通过类加载器完成的!Java提供了三种类加载器,分别是:  bootstrap classloader:引导类加载器,加载rt.jar(JDK基本类库)中的类;  sun.misc.Launcher$ExtClassLoader:扩展类加载器,加

胡根得 天行健,君子以自强不息。 1121

Steam崩溃:ntdll.dll报错0xc0000374...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 1156

深入JVM类加载机制

类加载的流程以及双亲委派模型

Floating Cat 2万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【JVM】——JVM运行机制、类加载机制、内存划分

JVM运行机制,堆栈,程序计数器,元数据区,JVM加载机制,双亲委派模型

阿华的博客 1301

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

JVM-类加载机制

对于Java开发者来说,我们每天都在编写.java文件,然后通过编译器将其编译成.class文件。那么,这些.class文件是如何被加载到Java虚拟机(JVM)中,并最终变成我们可以在程序中使用的对象和方法的呢?这个过程就是类加载(Class Loading)。理解类加载机制,不仅仅是满足技术好奇心,更是解决实际问题的关键。你是否遇到过或异常?是否好奇为什么 Tomcat 等Web容器可以隔离不同应用的类库?是否想了解热部署、模块化等高级特性是如何实现的?这些问题的答案,都深藏在类加载机制之中。类加载。

左灯右行的爱情 1695

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

JVM类加载机制解析

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

MoneyHacksPro的博客 1112

JVM类加载机制深度解析

在深入探讨Java虚拟机(JVM)的运行机制时,我们不可避免地会接触到类加载机制。想象一下,一个复杂的Java应用程序,它由数十个甚至数百个类组成,这些类是如何在运行时被JVM识别、加载并执行的?这就是类加载机制所要解决的问题。在Java应用程序中,类加载是JVM执行的第一步,也是至关重要的一个环节。它确保了在运行时,只有被JVM认可的类才能被加载到内存中,从而执行相应的代码。然而,在实际应用中,由于类加载的不当使用,可能会引发诸如类冲突、内存泄漏等问题。

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

Tomcat类加载机制与JVM类加载机制对比

类加载   在JVM中并不是一次性把所有的文件都加载到,而是一步一步的,按照需要来加载。   比如JVM启动时,会通过不同的类加载器加载不同的类。当用户在自己的代码中,需要某些额外的类时,再通过加载机制加载到JVM中,并且存放一段时间,便于频繁使用。   因此使用哪种类加载器、在什么位置加载类都是JVM中重要的知识。 JVM类加载   JVM类加载采用 父类委托机制,如下图所示:   JVM中包括集中类加载器:   1 BootStrapClassLoader 引导类加载器   2 ..

1 Byte 的博客 2万+

JVM类加载机制、调优

类加载机制、双亲委派模型、处理内存泄漏、OOM等问题方法

TIANLEeeee的博客 1372

JVM 的类加载机制原理

文件加载到内存中,并将其转换为 JVM 可以使用的 Java 类型。类加载过程包括加载、链接(验证、准备、解析)和初始化几个阶段。类加载器遵循双亲委派模型,保证了类加载的顺序和安全性。文件(包含 Java 字节码)加载到内存,并对其进行校验、解析、初始化,最终转换为 JVM 可以直接使用的 Java 类型的过程。JVM 的类加载机制是指 JVM 将。JVM 的类加载机制负责将。

专注于技术分享 1275

Tomcat的类加载机制和JVM的类加载机制

介绍了JVM的各个类加载器和JVM的双亲委派机制,同时说明SPI机制为何不遵守双亲委派机制。同时对比Tomcat的类加载机制

不会骑摩托的程序员不是好的摄影师 1387

【JVM】详解类加载机制

对于一个类来说,它的生命周期是这样的: 当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化三个步骤对该类进行初始化。所以将这三个步骤称为类加载。 其中连接又分为三步:验证、准备、解析。下面我们来仔细了解一下类加载的过程:当类被加载之后,系统会为之生成一个对应的Class对象,接着将会进入连接阶段,连接阶段负责把类的二进制数据合并到JRE中(意思就是将java类的二进制代码合并到JVM的运行状态中)。类连接又可分为以下三个阶段:初始化是为类的静态变量赋予正确的初始值,准备阶段

weixin_48271092的博客 3154

jvm类加载机制探讨

一、类加载流程 jvm中类加载流程分为5个部分:加载loading,验证Verification,准备preparation,解析resolution,初始化initialization。 1、加载阶段,这个阶段会在内存中生成一个代表这个类的 java.lang.Class 对 象, 作为方法区这个类的各种数据的入口。可从class文件、Zip报(jar\war等)、运行时计算生成(动态代理)、JSP转换成的对应class文件等。主要完成三件事: 1)通过一个类的全限定名来获取定义此类的二进制字节流; 2)

xiangbole的博客 2244

JVM深入了解之JVM的类加载机制!

这里的类加载器之间的父子关系一般不是以继承关系实现的,而是用组合实现的。如果一个类接受到类加载请求,他自己不会去加载这个请求,而是将这个类加载请求委派给父类加载器,这样一层一层传送,直到到达启动类加载器(Bootstrap ClassLoader)。那么变量value在准备阶段过后的初始值为0,而不是3,因为这时候尚未开始执行任何Java方法,而把value赋值为3的putstatic指令是在程序编译后,存放于类构造器()方法之中的,所以把value赋值为3的动作将在初始化阶段才会执行。

mxt51220的博客 982
上一篇: JVM常用垃圾收集器总结
下一篇: 《OSTEP》读书笔记 虚拟化(3)调度算法
donCoder
博客等级 码龄9年 65粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值