【JVM】深入理解类加载机制(二)

深入理解类加载机制

HSDB工具的使用

在这里插入图片描述

Hotspot Debugger(HSDB):JDK原生自带
以Windows系统为例,jdk8的环境,在jdk的lib目录下,启动之前,你需要确保你进入的lib目录和你当前的JAVA_HOME配置的JDK是相同的,否则可能会出现无法加载libarary的异常,进而无法使用HSDB,命令如下

java -cp .\sa-jdi.jar sun.jvm.hotspot.HSDB

调节字体大小的方法,添加环境变量JAVA_TOOL_OPTIONS

-Dswing.plaf.metal.controlFont=Dialog-22 -Dswing.plaf.metal.systemFont=Dialog-22 -Dswing.plaf.metal.userFont=SansSerif-22

在这里插入图片描述

这里需要用attach到一个java进程,
在这里插入图片描述
利用jps可以查看到相关指令
在这里插入图片描述
将进程号输入进去,我这里换了一个程序,进程号不同
在这里插入图片描述
会看到运行的Java Thread
在这里插入图片描述
在这里插入图片描述

查看main线程的调用栈

静态字段如何存储

instanceKlass
instanceMirrorKlass

在这里插入图片描述
Test_1_A
静态变量str的值存放在StringTable中,镜像类中存放的是字符串的指针
在这里插入图片描述
Test_1_B
str是类Test_1_A的静态属性,可以看到不会存储子类Test_1_B的镜像类中。
在这里插入图片描述
可以猜得到,通过子类Test_1_B访问父类Test_1_A的静态字段有两种实现方式:

  • 1.先去Test_1_B的镜像类中去取,如果有直接返回;如果没有,会沿着继承链将请求上跑。很明显,这种算法的性能随继承链的depth而上升,算法复杂度为O(n).
  • 2.借助另外的数据结构实现,使用K-V的格式存储,查询性能为O(1)
    Hotspot就是使用的第二种方式,借助另外的数据结构ConstantPoolCache,常量池类ConstantPool中有个属性_cache指向了这个结构。每一条数据对应一个类ConstantPoolCacheEntry.
    ConstantPoolCacheEntry在哪儿?在CosntantPoolCache对象后面,代码位置/openjdk/hotspot/src/share/vm/oops/cpCache.hpp,代码如图所示。这个公式的意思是ConstantPoolCache对象的地址加上ConstantPoolCache对象的内存大小
    在这里插入图片描述
    ConstantPoolCache
    常量池缓存是为常量池预留的运行时数据结构。保证所有字段访问和调用字节码的解释器运行时信息。缓存是在类被积极使用之前创建和初始化的。每个缓存项在解析时被填充。从图中的代码可以看出,是直接去获取ConstantPoolCacheEntry

类解析的过程ClassFileParser.cpp中的parseClassFile方法

在这里插入图片描述

1.魔数验证

在这里插入图片描述

2.版本号验证

在这里插入图片描述

3.解析常量池、访问权限等等

在这里插入图片描述

4.解析类的接口信息、方法信息、属性信息、父类信息

在这里插入图片描述

5.创建位于方法区的InstanceKlass对象

在这里插入图片描述

6.创建位于堆中的InstanceMirrorClass对象

在这里插入图片描述

疑惑

为什么HotSpot将BootstrapClassLoader使用C++语言编写而ExtClassLoader和AppClassLoader用java语言编写

HotSpot JVM将BootstrapClassLoader用C++语言比那些,而ExtClassLoader和AppClassLoader用Java语言编写,主要是处于以下几个原因:
1.引导类加载器(BootstrapClassLoader)
核心系统组件:BootstrapClassLoader是JVM的核心部分,负责加载Java核心库(如java.lang.*、java.util.*等)。这些核心库在JVM启动时必须
被加载,并且它们的加载过程必须在任何Java代码执行之前完成。
依赖关系:由于BootstrapClassLoader加载的是最基础的Java类库,它不能已离开于任何Java嘞,否则,会陷入加载循环(依赖的类还未加载,需要先加载依赖类)
性能和控制:使用C++编写可以更直接地控制内存和资源,提高性能和启动速度
2.扩展类加载器(ExtClassLoader)和应用类加载器(AppClassLoader)
实现简便:ExtClassLoader和AppClassLoader主要是加载扩展库和应用程序嘞,它们不需要像BootstrapClassLoader那样处理JVM启动的核心部分。因此可以用
Java语言编写,利用java自身的特性,使得代码更简洁和易维护
继承和扩展:用Java编写可以更方便地利用Java的面向对象特性,继承和扩展ClassLoader嘞,从而更容易地实现自定义类加载器。
运行时环境:在JVM启动之后,ExtClassLoader和AppClassLoader运行已经初始化的Java环境中,不需要担心加载器本身的类是否已经加载

总结:
BootStrapClassLoader使用C++编写,确保JVM在启动时能够加载最核心的类库,并且不依赖于任何Java类,避免循环依赖,同事提高性能和控制性
ExtClassLoader和AppClassLoader使用Java语言编写,方便实现和扩展,同时在JVM启动后利用现有的Java环境和面向对象特性,更易于维护和扩展。

这种设计确保了JVM的启动和运行时类加载机制既高效又灵活,能够满足不同阶段的需求

Tomcat为什么要打破双亲委派机制

在这里插入图片描述

我们知道,Java默认的类加载机制是通过双亲委派模型来实现的,而Tomcat实现的方式又和双亲委派模型有所区别。原因在于一个Tomcat容器允许同时运行多个Web程序,每个Web程序依赖的类又必须是相互隔离的。因此,如果Tomcat使用双亲委派模式来加载类的话,将导致Web程序依赖的类变为共享的。
举个例子,假如我们有两个Web程序,一个依赖A库的1.0版本,另一个依赖A库的2.0版本,它们都使用了类xxx,其实现的逻辑因类库版本的不同而结构完全不同。那么这两个Web程序的其中一个必然因为加载的Class不是所使用的Class而出现问题!而这对于开发来说是非常致命的

完整的的Tomcat类加载图。我们在这张图中看到很多类加载器,除了JDK自带的类加载器,我们尤其关心Tomcat自身持有的类加载器。仔细一点我们很容易发现:Catalina类加载器和Shared类加载器,它们并不是父子关系。为啥这样设计,我们得分析一下每个类加载的用途,才能知晓。
1.Common类加载器,负责加载Tomcat和Web应用都服用哦个的累
1.1 Catalina类加载器,负责加载Tomcat专用的类,而这些被加载的类在Web应用中将不可见
1.2 Shared类加载器,负责加载Tomcat下所有的Web应用程序都复用的类,而这些被加载的类在Tomcat中将不可见
1.2.1 WebApp类加载器,负责加载具体的某个Web应用程序所使用到的类,而这些被加载的类在Tomcat和其他的Web应用程序都将不可见(每一个Web应用程序对应一个WebApp类加载器)
1.2.2 Jsp类加载器,每个jsp页面一个类加载器,不同的jsp页面有不同的类加载器,方便实现jsp页面的热拔插

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2.1 文件内容差异对比方法

2.1 文件内容差异对比方法 文件内容差异对比方法2.1.1 两个字符串的差异对比2.1.2 生成美观的HTML格式文档2.1.3 对比nginx 配置文件差异代码封装 文件内容差异对比方法 介绍如何通过difflib模块实现文件内容差异对比。difflib作为Python的标准库模块无需安装,作用…

2024年运营技术与网络安全态势研究报告:遭遇多次网络威胁的比例暴增

随着 OT 组织不断在其业务环境中集成各种数字工具和技术,它们面临的安全挑战也日益变得愈加复杂和多样化。正如 NIST 指出, “虽然安全解决方案旨在解决典型 IT系统中的一些问题,但将这些相同的解决方案引入不同的 OT 环境时,必须…

ruoyi-vue-pro项目新建模块的接口都报404错误

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 新建模块之后,该模块后端的请求都是返回404,如图所示: 2. 原理分析 抛开这个项目,对于路径请求不成功,返回404 主要的步骤如下: 检查路由配置: 确保在路由配置文件中添加了新模块的路由 例如,在Spring Boot中,这…

vue3+ts 前端word文档下载文件时不预览直接下载方法(支持 doc / excel / ppt / pdf 等)

前端word文档下载文件时不预览直接下载方法支持 doc / excel / ppt / pdf 等 根据需要,要实现一个下载文档的需要 最简单的方法就是使用a标签 如果是相同域可以直接下载,但如果是不同域的,就会先打开一个预览页,在预览页再点下载…

StarRocks Lakehouse 快速入门——Apache Paimon

StarRocks Lakehouse 快速入门指南为您提供了湖仓技术概览,旨在帮助您迅速掌握其核心特性、独特优势和应用场景。本指南将指导您如何高效地利用 StarRocks 构建解决方案。文章末尾,我们集合了来自阿里云、饿了么、喜马拉雅和同程旅行等行业领导者在 Star…

Eureka原理与实践:构建高效的微服务架构

Eureka原理与实践:构建高效的微服务架构 Eureka的核心原理Eureka Server:服务注册中心Eureka Client:服务提供者与服务消费者 Eureka的实践应用集成Eureka到Spring Cloud项目中创建Eureka Server创建Eureka Client(服务提供者&…

什么叫日志门面

日志门面,是门面模式的一个典型的应用。 门面模式(Facade Pattern),也称之为外观模式,其核心为:外部与一个子系统的通信必须通过一个统一的外观对象进行,使得子系统更易于使用。 就像Log4j、Lo…

stm32智能颜色送餐小车(ESP8266WIFI模块、APP制作、物联网模型建立、MQTTFX)

大家好啊,我是情谊,今天我们来介绍一下我最近设计的stm32产品,我们在今年七月份的时候参加了光电设计大赛,我们小队使用的就是stm32的智能送餐小车,虽然止步于省赛,但是还是一次成长的经验吧,那…

Linux系统-通用权限管理

目录 一、文件类型 二、通用权限 1.文件的常规权限 权限类型 壹.对于文件: 贰.对于目录: 查看和修改权限 说明: 举例: 字母表示法 数字表示法 2.文件的访问控制列表(FACL File access control list&#…

菱形继承和虚继承

菱形继承(Diamond Inheritance)是指在多重继承的情况下,某个类继承自两个类,而这两个类又都继承自同一个基类的情况。 在这个结构中,D 直接从 A 继承了 A 的所有特性,但通过 B 和 C 继承,这会导…

eNSP 华为三层交换机配置DHCP

华为三层交换机配置DHCP 华为DHCP原理:(思科四个都是广播包) 1、客户端广播发送DHCP Discover包。用于发现当前局域网中的DHCP服务器。 2、DHCP服务器单播发送DHCP Offer包给客户端。携带分配给客户端的IP地址。 3、客户端广播发送DHCP Resqe…

索引的数据结构

1.举例引出索引: 1.1.什么是索引: 1.2.数据查找分析: a.数据查找: 1.如上图所示,数据库没有索引的情况下,数据分布在硬盘不同的位置上面,读取数据时,摆臂需要前后摆动查找数据,这…

Java方法04:命令行传递参数

本节视频链接:https://www.bilibili.com/video/BV12J41137hu?p48&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p48&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 在Java中,‌命令行传递参数…

PyTorch--深度学习

onux部署功能 cpu运行时间 3. 自动求导 求导结果为:2 1 1

考试题型宏观分析之公共营养师三级

背景 第一遍知识学习之后,打印《2023.10.14公共营养师三级真题》进行第一次摸底,首要目标在于通过摸底,对于考试题型进行宏观分析和了解,其次,对于后续的学习进行有的放矢 直至2024-08-18,对于上述资料的一…

Apache-JMeter压测工具教程

下载安装 《JMeter官网下载》 下载完成后,找个文件夹进行解压 配置环境变量 JAVA_HOME(如果是JAVA8还需要配置CLASSPATH)、JMETER_HOME JMETER_HOME修改bin目录下的jmeter.properties文件编码为UTF-8 5.6.3这个版本encoding已经默认为UT…

肿瘤细胞表皮生长因子EGFR靶向肽;GE11;YHWYGYTPQNVI

【GE11简介】 GE11肽是从噬菌体展示肽库中筛选出来的一种有效的EGFR配体,它是一种十二肽,可以高亲和力和选择性地与EGFR特异性结合。GE11已广泛用于EGFR阳性肿瘤的放射治疗、基因治疗和化疗药物的诊断和靶向递送。 【中文名称】肿瘤细胞表皮生长因子肽…

理解Tomcat的IP绑定与访问控制

在使用Spring Boot开发应用时,内置的Tomcat容器提供了灵活的网络配置选项。特别是,当计算机上有多个网卡时,如何配置server.address属性显得尤为重要。本文将详细探讨不同IP配置对Tomcat服务访问的影响。 多网卡环境下的IP配置 假设你的计算…

微前端架构:使用不同框架构建可扩展的大型应用

概述 在现代Web开发中,随着业务复杂度的不断提高,单一的巨型应用逐渐难以满足高效开发和维护的需求。微前端架构作为一种解决方案,允许将一个大型应用拆分成多个独立的小型应用,这些小型应用可以单独开发、部署,并且能…

【Neo4j系列】简化Neo4j数据库操作:一个基础工具类的开发之旅

作者:后端小肥肠 在Neo4j系列我打算写一个Neo4j同步关系数据库、增删改查及展示的基础小系统,这篇文件先分享系统里面的基础工具类,感兴趣的可以点个关注,看了文章的jym有更好的方法可以分享在评论区。 创作不易,未经允…