JVM故障处理与类加载全解析

1、故障处理工具

基础故障处理工具
jps:
可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及这些进程的本地虚拟机唯一ID(LVMID,Local Virtual Machine Identifier)
jstat:
jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具
jinfo:
jinfo(Configuration Info for Java)的作用是实时查看和调整虚拟机各项参数,windos使用该命令会受到限制
jmap:
jmap(Memory Map for Java)命令用于生成堆转储快照,jinfo命令一样,jmap有部分功能在Windows平台下是受限的
jhat:
JDK提供jhat(JVM Heap Analysis Tool)命令与jmap搭配使用,来分析jmap生成的堆转储快照。可以通过HTTP界面可视化
.java文件不可以直接被jhat分析我们需要先调用以下代码,转换文件格式
jstack:
jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)。

2、类文件结构

class文件是一组以8个字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排列在文件之中,中间没有添加任何分隔符。
魔数和版本号
        Class文件的魔数是确定这个文件是否为一个能被虚拟机接收的Class文件——取值为0xCAFEBABE
        版本号分为主版本号和次版本号,高版本可以向下兼容低版本。虚拟机完全拒绝执行超过其版本号的Class文件
常量池
        常量池存储:字面量和符号引用。常量池的每一个常量都是一个表
访问标志
        这个标志用于识别一些类或接口层次的访问信息。
类索引、父类索引、接口索引集合
        class文件中有这三项数据来确定该类型的继承关系
字段表集合
        用于描述接口或类中声明的变量
方法表集合
属性表集合

3、类加载

类加载:JVM把类的数据从Class文件加载到内容,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型
类加载的时机
类的生命周期可以被定义为以下七个过程
加载——验证——准备——初始化——卸载顺序是确定的
有且仅有六种情况需要进行初始化(主动引用
  1. 遇到 new、getstatic、putstatic 或 invokestatic 这四条字节码指令时
  • 典型场景:使用 new 关键字实例化对象、读取或设置一个类的静态字段(被 final 修饰、已在编译期把结果放入常量池的静态字段除外)、调用一个类的静态方法
  1. 使用 java.lang.reflect 包的方法对类进行反射调用的时候
  2. 当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化
  3. 当虚拟机启动时,用户需要指定一个要执行的主类(包含 main () 方法的那个类),虚拟机会先初始化这个主类
  4. 当使用 JDK 7 新加入的动态语言支持时
  5. 当一个接口中定义了 JDK 8 新加入的默认方法(被 default 关键字修饰的接口方法)时,如果有这个接口的实现类发生了初始化,该接口要在其之前被初始化
除此之外,所有引用类型的方式都不会触发初始化,称为被动引用。
给个例子
package org.fenixsoft.classloading;
/*** 被动使用类字段演示一:* 通过子类引用父类的静态字段,不会导致子类初始化**/
public class SuperClass {static {System.out.println("SuperClass init!");}public static int value = 123;
}
public class SubClass extends SuperClass {static {System.out.println("SubClass init!");}}
/*** 非主动使用类字段演示**/
public class NotInitialization {public static void main(String[] args) {System.out.println(SubClass.value);}
}
        上述代码运行之后,只会输出“SuperClass init!”,而不会输出“SubClass init!”。对于静态字段,只有直接定义这个字段的类才会被初始化,因此通过其子类来引用父类中定义的静态字段,只会触发父类的初始化而不会触发子类的初始化。
类的加载过程
加载、验证、准备、解析、初始化
加载过程
        通过类的全限定名获得字节流
        将字节流(静态)转换为方法区的运行时数据结构
        在内存生成该对象作为方法区这个类的访问接口
验证
        目的是确保Class文件的字节流中包含的信息符合《Java虚拟机规范》的全部约束要求。保证这些能正确地存储到方法区。
文件格式验证:保证输入的字节流能正确地解析并存储于方法区之内
元数据验证
字节码验证
符号引用验证
准备
只准备空间,这里的 初始值默认赋该类型的零值,若类变量被 final 修饰且为基本类型或字符串,则会在准备阶段初始化为指定值,静态常量直接赋值
解析
把符号引用直接转为直接引用的过程
初始化
把准备阶段赋的0值,转换为实际数据
使用
卸载
类加载器
        任意一个类,都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性,换句话说只有同一个类加载器加载出来的两个相同的类才相等。
类加载器分类
  • 启动类加载器Bootstrap ClassLoader:加载固定路径下,固定JRE/lib下的核心类库(如rt.jar)
  • 扩展类加载器Extension ClassLoader:加载JRE/lib/ext下的扩展类,是对Java语言的扩展
  • 应用程序类加载器Application ClassLoader:加载用户类路径(ClassPath)上的类
  • 自定义ClassLoader:用户自定义的类加载器
双亲委派模型
双亲委派
双亲委派模型的工作流程
        如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去完成加载
  • 类加载请求先委托父加载器处理
  • 父加载器无法完成时子加载器才尝试加载
优点:
  • 避免重复加载
  • 防止核心API被篡改
破坏双亲委派
破坏双亲委派,指的是类加载器在某些场景下不遵循 “先委托父类加载器” 的规则。例如:
Tomcat 的类加载器设计
        Tomcat 需要支持多个 Web 应用隔离(同一类在不同应用中可加载不同版本),因此其类加载器结构也破坏了双亲委派。
Tomcat 的类加载顺序(以 WebAppClassLoader 为例):
  1. 先加载 Web 应用的/WEB-INF/classes目录下的类;
  2. 再加载/WEB-INF/lib目录下的 JAR 包;
  3. 最后才委托父类加载器(Common ClassLoader)加载。

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

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

相关文章

Python 第三方库的安装与卸载全指南

在 Python 开发中,第三方库是提升效率的重要工具。无论是数据分析、Web 开发还是人工智能领域,都离不开丰富的第三方资源。本文将详细介绍 Python 第三方库的安装与卸载方法,帮助开发者轻松管理依赖环境。 一、第三方库安装方法 1. pip 工具…

RabbitMQ 高级特性之消息分发

1. 为什么要消息分发当 broker 拥有多个消费者时,就会将消息分发给不同的消费者,消费者之间的消息不会重复,RabbitMQ 默认的消息分发机制是轮询,但会无论消费者是否发送了 ack,broker 都会继续发送消息至消费者&#x…

Linux操作系统从入门到实战:怎么查看,删除,更新本地的软件镜像源

Linux操作系统从入门到实战:怎么查看,删除,更新本地的软件镜像源前言一、 查看当前镜像源二、删除当前镜像源三、更新镜像源四、验证前言 我的Linux版本是CentOS 9 stream本篇博客我们来讲解怎么查看,删除,更新国内本…

两台电脑通过网线直连形成局域网,共享一台wifi网络实现上网

文章目录一、背景二、实现方式1、电脑A(主)2、电脑B3、防火墙4、验证三、踩坑1、有时候B上不了网一、背景 两台windows电脑A和B,想通过**微软无界鼠标(Mouse without Borders)**实现一套键盘鼠标控制两台电脑&#xf…

Java Reference类及其实现类深度解析:原理、源码与性能优化实践

1. 引言:Java引用机制的核心地位在JVM内存管理体系中,Java的四种引用类型(强、软、弱、虚)构成了一个精巧的内存控制工具箱。它们不仅决定了对象的生命周期,还为缓存设计、资源释放和内存泄漏排查提供了基础设施支持。…

华为云对碳管理系统的全生命周期数据处理流程

碳管理系统的全生命周期数据处理流程包含完整的数据采集、处理、治理、分析和应用的流程架构,可以理解为是一个核心是围绕数据的“采集-传输-处理-存储-治理-分析-应用”链路展开。以下是对每个阶段的解释,以及它们与数据模型、算法等的关系: 1. 设备接入(IoTDA) 功能: …

大模型安全风险与防护产品综述 —— 以 Otter LLM Guard 为例

大模型安全风险与防护产品综述 —— 以 Otter LLM Guard 为例 一、背景与安全风险 近年来,随着大规模预训练语言模型(LLM)的广泛应用,人工智能已成为推动文档处理、代码辅助、内容审核等多领域创新的重要技术。然而,…

1.2.2 计算机网络分层结构(下)

继续来看计算机网络的分层结构,在之前的学习中,我们介绍了计算机网络的分层结构,以及各层之间的关系。我们把工作在某一层的软件和硬件模块称为这一层的实体,为了完成这一层的某些功能,同一层的实体和实体之间需要遵循…

实训八——路由器与交换机与网线

补充——基本功能路由器:用于不同逻辑网段通信的交换机:用于相同逻辑网段通信的1.网段逻辑网段(IP地址网段):IP地址的前三组数字代表不同的逻辑网段(有限条件下);IP地址的后一组数字…

C++——构造函数的补充:初始化列表

C中,构造函数为成员变量赋值的方法有两种:构造函数体赋值和初始化列表。构造函数体赋值是在构造函数里面为成员变量赋值,如:class Data { public://构造函数体赋值Data(int year,int month,int day){_year year;_month month;_d…

代码随想录|图论|12岛屿周长

leetcode:106. 岛屿的周长 题目 题目描述 给定一个由 1(陆地)和 0(水)组成的矩阵,岛屿是被水包围,并且通过水平方向或垂直方向上相邻的陆地连接而成的。 你可以假设矩阵外均被水包围。在矩阵中恰好拥有…

开发制作模仿参考抄别人的小程序系统

很多老板看见别人公司的小程序系统界面好看,功能强大,使用人数多。就想要抄袭模仿参考别人家的小程序系统。想要了解一下有没有侵权风险,以及怎么开发制作开发制作模仿参考抄别人的小程序系统。首先回答第一个问题,只要你的小程序…

c语言中的数组IV

数组的集成初始化 集成初始化的定位 数组的大小 数组的赋值 不能直接将一个数组a赋值给数组b&#xff0c;只能通过遍历来实现 遍历数组 示例——检索元素在数组中的位置#include <stdio.h> int search(int key,int a[],int length); int main(void){int a[] {2,4,6,7,1,…

LDO选型

目录 一、最大输出电流 二、最大输入电压 三、最大功率&#xff1a;Pmax 四、负载动态调整率 五、输入电源纹波抑制比&#xff1a;PSRR 一、最大输出电流 参考TI LM1117IMPX-3.3/NOPB数据手册 由于LDO转换效率很低&#xff0c;LDO的标称最大电流 ≥ 实际最大负载电流 1…

飞算JavaAI:重构Java开发的“人机协同”新范式

目录一、从需求到架构&#xff1a;AI深度参与开发“顶层设计”1.1 需求结构化&#xff1a;自然语言到技术要素的准确转换1.2 架构方案生成&#xff1a;基于最佳实践的动态匹配二、编码全流程&#xff1a;从“手写代码”到“人机协同创作”2.1 复杂业务逻辑生成&#xff1a;以“…

解决SQL Server SQL语句性能问题(9)——SQL语句改写(7)

9.4.15. 消除join场景一 与Oracle等其他关系库类似,SQL Server中,join作为基本语法用于SQL语句中相关表之间的连接,有些场景中,join既可以增强SQL语句的可读性,同时,又可以提升SQL语句的性能,但有些场景中,join会导致CBO为SQL语句产生次优的查询计划,进而出现SQL语句…

深度学习-数据准备

一、数据准备 1.1定义 数据准备&#xff08;Data Preparation&#xff09; 是数据分析与机器学习流程中的核心环节&#xff0c;指将原始数据转换为适合分析或建模的结构化格式的过程。 1.2组成 数据准备主要由两个部分组成&#xff0c;一个是划分数据集&#xff0c;一个是构建…

IPA软件源预览系统源码(源码下载)

这是一款IPA软件源预览系统源码&#xff0c;搭建这个源码一定记住没有软件源的别搭建&#xff0c;因为你玩不明白&#xff0c;不是做IPA软件源的不要下载这套源码&#xff0c;简单的测试了&#xff0c;UI很舒服&#xff0c;喜欢的自行部署&#xff01; 源码下载&#xff1a;htt…

python 数据分析 单细胞测序数据分析 相关的图表,常见于肿瘤免疫微环境、细胞亚群功能研究 ,各图表类型及逻辑关系如下

这是一组 单细胞测序数据分析 相关的图表&#xff0c;常见于肿瘤免疫微环境、细胞亚群功能研究 &#xff0c;各图表类型及逻辑关系如下&#xff1a;使用kimi doubao 和deepseek &#xff0c;分析图标和pdf 豆包最好&#xff0c;用豆包分析| 图表类型 A、E&#xff08;堆叠柱状…

表达式索引海外云持久化实践:关键技术解析与性能优化

随着全球数字化转型加速&#xff0c;表达式索引技术正成为海外云服务商提升数据库性能的核心方案。本文将深度解析如何通过云原生架构实现索引持久化&#xff0c;对比主流云平台的技术实现差异&#xff0c;并给出跨国业务场景下的优化建议。 表达式索引海外云持久化实践&#x…