JVM合集
序言:
1.什么是JVM?
- JVM就是将javac编译后的.class字节码文件翻译为操作系统能执行的机器指令
- 翻译过程:
- 前端编译:生成.class文件就是前端编译
- 后端编译:通过jvm解释(或即时编译或AOT)执行
- .class文件时跨平台的,jvm并不是跨平台的
- 通过javap进行反编译
2.java文件是怎么变成.class文件的?
属于前端编译

3..class文件解读
- 采用16进制
- magic、版本号、常量池(包括字面量、符号引用、接口、字段、方法等)、字段表集合、方法表集合
- 符号引用就是类信息、修饰符、名称等
4.类加载机制(JVM的类加载子系统)
- 所谓的类加载机制就是将class文件加载进内存,并对数据进行校验,转换解析和初始化,使得JVM可以直接使用。
- 如何加载进内存?
- 常见的从本地系统加载
- 动态代理
- 从jar包加载
- 类加载过程
- 装载:
- 通过类全限定名获取类的二进制字节流!这个过程可以做拦截增强
- 将字节流代表的静态存储结构转换为方法区的运行时数据结构
- 在堆中生成java.lang.class对象,作为对方法区中这些数据的访问入口(defineClass方法生成)
- 链接
- 验证:格式验证、字节码验证:跳转验证、符号引用验证、元数据验证:语法。-Xverify:none 取消验证。穿插在整个过程中
- 准备:为静态变量赋值,初始化成默认值。
- 这里不包含final修饰的static,final修饰的static都在编译的时候就分配了
- 不会为实例变量分配初始化,类变量在方法区中,实例变量随着对象在堆中(即在实例构造器方法中进行的)
- 解析
- 将符号引用(名称、描述符、全限定名啥的)转换成直接引用,直接指向目标的指针(方法区里的指向)
- 对解析结果进行缓存
- 初始化
- 对比于准备阶段,这里是通过指定主观计划去初始化变量和其他资源。有点懒加载的味道,需要使用的时候才加载
- 对类变量设置初始值的两种方式:
- 直接声明
- static代码块
- 步骤
- 先装载和链接本类
- 然后初始化父类
- 初始化自己
- 什么时候加载(初始化):(主动引用)
- 创建实例;final在调用构造方法前就要弄好
- 使用静态变量或者静态方法的时候
- 调用子类父类也会初始化;
- 标明启动类的类,或者像object和class类启动时候就加载了
- 反射的时候
- (被动引用)
- 定义类数组不会初始化
- 使用父类的静态变量,不会初始化
- 使用static final不会初始化
- 卸载:
- 用完之后就卸载回收
- 所有实例被回收,classloader被gc回收,class对象没有被任何地方引用
- 装载:
5.类加载器
- 类加载器:
- 就是读取字节码,转换成java.lang.class类的一个实例的代码模块
- 一个类在同一个类加载器中具有唯一性,不同类加载器是允许同名类存在的,类加载器不同,就不会是同一个类。
- 分类:
- Bootstrap classloader:负责java_home的所有class,核心类库
- Platform classloader:负责一些扩展的包
- Application classloader:classpath中指定的包
- custom classloader:根据程序自定义类加载器
- 为什么要分层?
- 如果自己编写了一个String类,如果只有一个的话无法判定究竟要加载哪个。所以分层对信任级别进行划分
- 即使打破了双亲委派也不能重写String,defineClass限制了限定类名不能以java开头,除非自己将二进制流转换成class对象
- 三个特性:
- 全盘负责:
- 当一个类加载器加载某个class的时候,该class所依赖的和引用其他的class都由该类加载器负责载入。除非显式使用另一个类加载器
- 父类委托(双亲委派):
- 首先传入类的全限定名
- 为什么:实现带有优先级的层次关系
- 从app层依次往上找是否加载过,然后又从上往下看谁能加载,最后还没有就抛异常。
- 可以重写loadclass打破双亲委派
- 打破:
- SPI,JDK提供了一套接口,定义实现类,在META-INF/services中注册实现类的相关信息,比如JDBC的DriverManager
- OSGI:热部署、热替换
- 如果怕打破可以重写findclass方法
- 缓存机制:
- 加载过的class文件在内存中(方法区)缓存
- 每一个类加载器都有自己的缓存
- 打破父类委托:
import java.io.IOException; import java.io.InputStream;public class CustomClassLoader extends ClassLoader {public CustomClassLoader(ClassLoader parent) {super(par
- 全盘负责:
相关文章:
JVM合集
序言: 1.什么是JVM? JVM就是将javac编译后的.class字节码文件翻译为操作系统能执行的机器指令翻译过程: 前端编译:生成.class文件就是前端编译后端编译:通过jvm解释(或即时编译或AOT)执行.class文件时跨平台的,jvm并不是跨平台的通过javap进行反编译2.java文件是怎么变…...
tomcat端口被占用解决方法
在安装目录的conf下修改server.xml文件,修改后保存重启即可...
全新的训练算法:Reflection 70B进入大众的视野
在2024年9月6日,大模型的圈子迎来了一位新成员——Reflection 70B,它横扫了MMLU、MATH、IFEval、GSM8K等知名的模型基准测试,完美超越了GPT-4o,同时也超越了Claude3.5 Sonnet成为了新的大模型之王,Reflection 70B到底是…...
静态标注rtk文件参数解析
目录 在静态标注中,rtk(Real-Time Kinematic)文件的主要作用 rtk文件包含几种类型数据 具体作用 具体示例 %RAWIMUSA #INSPVAXA $GPRMC 背景: 最近工作中涉及到静态标注 slam相关,因为初入门,对于rtk文件中有很多参数&…...
TensorFlow和PyTorch小知识
TensorFlow和PyTorch是当前最流行的两个开源机器学习库,它们都广泛用于研究和工业界的深度学习项目。下面是对它们的介绍: 1,TensorFlow - **开发背景:** TensorFlow最初由Google Brain Team开发,并于2015年11月开源…...
Java证书信息收集
1.Java二级 【NCRE 二级Java语言程序设计02】考试流程及二级Java大纲_java语言程序设计计算机二级-CSDN博客...
flink写入hudi MOR表
第一步:创建flink内存表从kafka读取数据: DROP TABLE IF EXISTS HUDI_KAFKA_DEBEZIUM_ZHANG; CREATE TABLE IF NOT EXISTS HUDI_KAFKA_DEBEZIUM_ZHANG( ID STRING comment 编码 ,NAME STRING comment 名称 ,PRIMARY KEY(RCLNT,RLDNR,RRCTY,RVERS,RYEAR,…...
智能工厂程序设计 之-2 (Substrate) :三个世界--“存在的意义”-“‘我’的价值的实现” 之2
Q13、我刚看了一下前门前面的讨论。有一段文字您的重新 理解一下。那就是: 对题目 的另一角度( “智能工厂的程序设计”的三个层次词 分别关注的问题 及其 解决 思路的描述)的解释: 三个不同层次(深度)&…...
概要设计例题
答案:A 知识点: 概要设计 设计软件系统的总体结构:采用某种方法,将一个复杂的系统按照功能划分成模块;确定每个模块的功能;确定模块之间的调用关系;确定模块之间的接口,即模块之间…...
注册表模式:使用注册表和装饰器函数的模块化设计
在现代软件开发中,模块化设计是提高代码可维护性和可扩展性的关键技术之一。本文将探讨如何使用注册表(Registry)和装饰器函数(Decorator Function)来实现模块化设计,提升代码的灵活性和可扩展性。 什么是…...
怎样将vue项目 部署在ngixn的子目录下
如果同一服务器的80端口下,需要部署两个或以上数量的vue项目,那么就需要将其中一个vue项目部署在根目录下,其他的项目部署在子目录下. 像这样的配置 访问根目录 / 访问灭火器后台管理,访问 /mall/ 访问商城的后台管理 那么商场的vue项目,这样配置,才能在/mall/下正常访问? 1…...
FPGA开发:Verilog数字设计基础
EDA技术 EDA指Electronic Design Automation,翻译为:电子设计自动化,最早发源于美国的影像技术,主要应用于集成电路设计、FPGA应用、IC设计制造、PCB设计上面。 而EDA技术就是指以计算机为工具,设计者在EDA软件平台上…...
哈希表,算法
一.什么是哈希表 哈希表是一种用于快速数据存取的数据结构。它通过哈希函数将键(key)映射到表中的一个位置,从而实现高效的插入、删除和查找操作。 二.哈希冲突 哈希冲突发生在多个键通过哈希函数映射到哈希表的同一位置时。由于哈希表的大…...
Java数组的定义及遍历
数组的声明 长度不能超过定义的长度。超过则会报错通过下标来访问 数组的遍历 最常用最简单的方法是增强for循环。...
【电路笔记】-反相运算放大器
反相运算放大器 文章目录 反相运算放大器1、概述2、理想反相运算放大器3、实际反相运算放大器3.1 闭环增益3.2 输入阻抗3.3 输出阻抗4、反相运算放大器示例5、总结1、概述 上一篇关于同相运算放大器的文章中已介绍了该运算放大器配置的所有细节,该配置在同相引脚 (+) 上获取输…...
【电子通识】半导体工艺——刻蚀工艺
在文章【电子通识】半导体工艺——光刻工艺中我们讲到人们经常将 Photo Lithography(光刻)缩写成 Photo。光刻工艺是在晶圆上利用光线来照射带有电路图形的光罩,从而绘制电路。光刻工艺类似于洗印黑白照片,将在胶片上形成的图像印…...
vue-router 之如何在模版(template)中获取路由配置信息?
vue-router 之如何在模版(template)中获取路由配置信息? 获取当前路由信息 在vue3 中,route通常使用useRoute()钩子获取的,**代表当前激活的路由信息。**它包含了与当前路由相关的数据,比如路径、参数、查…...
HPL 源码结构分析
文件夹结构: $ cd /home/hipper/ex_hpl_hpcg/ $ pwd $ mkdir ./openmpi $mkdir ./openblas $mkdir ./hpl $ tree 1. 安装openmpi 1.1.1 使用Makefile下载配置编译安装 openmpi Makefile: all:wget https://download.open-mpi.org/release/open-m…...
Java代码审计篇 | ofcms系统审计思路讲解 - 篇3 | 文件上传漏洞审计
文章目录 0. 前言1. 文件上传代码审计【有1处】1.1 可疑点1【无漏洞】1.1.1 直接搜索upload关键字1.1.2 选择第一个,点进去分析一下1.1.3 分析this.getFile()方法1.1.4 分析new MultipartRequest(request, uploadPath)1.1.5 分析isSafeFile()方法1.1.6 分析request.…...
【Kubernetes】常见面试题汇总(五)
目录 13.简述 Kubernetes Replica Set 和 Replication Controller 之间有什么区别? 14.简述 kube-proxy 作用? 15.简述 kube-proxy iptables 原理? 16.简述 kube-proxy ipvs 原理? 13.简述 Kubernetes Replica Set 和 Replicat…...
告别手动复制粘贴!用Python-pptx库5分钟搞定PPT批量生成(附完整代码)
职场效率革命:Python-pptx全自动PPT生成实战指南 每次月度汇报前夜,市场部的张伟总要面对几十页PPT的复制粘贴地狱——从Excel拉数据、调整格式、核对图表,最后发现领导临时改了需求又得重来。这种场景在数据驱动型岗位中已成常态,…...
别再死记硬背截止、放大、饱和了!用Arduino+面包板,5分钟直观理解NPN/PNP三极管
用Arduino实验破解三极管的三大工作状态之谜 记得第一次翻开电子学教材看到三极管章节时,那些密密麻麻的曲线图和公式让我头皮发麻。"截止区"、"放大区"、"饱和区"——这些抽象概念就像天书一样难以理解。直到有一天,我拿…...
现代Web应用特性管理:从概念到工程实践
1. 项目概述:一个面向现代Web开发的特性管理工具 如果你和我一样,长期在Web应用开发的一线摸爬滚打,那你一定对“特性开关”这个概念不陌生。简单来说,它就像你家里电灯的总闸,可以随时控制某个功能是“亮”还是“灭”…...
阿里云百炼接入OpenClaw全攻略
前置准备 已安装并可正常打开 OpenClaw Windows 版本 OpenClaw 部署包获取:https://xiake.yun/api/download/package/14?promoCodeIVD643FDE29AOpenClaw 顶部 Gateway 状态显示为在线准备好可正常登录的阿里云账号可正常访问阿里云百炼控制台地址确认账号已开通百…...
zclean:开发者必备的自动化磁盘清理工具,释放宝贵存储空间
1. 项目概述与核心价值最近在整理自己的开发环境时,又遇到了那个老生常谈的问题:系统用久了,各种临时文件、缓存、残留的依赖包,把磁盘空间一点点蚕食殆尽。特别是对于开发者而言,项目依赖、构建产物、Docker镜像、各种…...
茉莉花插件:终极中文文献管理解决方案,三步搞定Zotero中文文献难题
茉莉花插件:终极中文文献管理解决方案,三步搞定Zotero中文文献难题 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件,用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasmi…...
从愚人节玩笑到工程实践:四个软硬件结合的创意项目技术拆解
1. 从愚人节玩笑到工程师的创意沙盘每年四月一日,总有些介于荒诞与现实之间的“产品”构想冒出来,在工程师社区里引发一阵会心一笑。但如果你仔细琢磨,会发现这些看似玩笑的点子,往往藏着一丝对技术边界、用户体验乃至市场需求的犀…...
ADB 配置 + 入门使用全攻略,零基础看完就精通
一、ADB简介 1、什么是adb ADB 全称为 Android Debug Bridge,起到调试桥的作用,是一个客户端-服务器端程序。其中客户端是用来操作的电脑,服务端是 Android 设备。 ADB 也是 Android SDK 中的一个工具,可以直接操作管理 Androi…...
NotebookLM与Google Drive整合性能瓶颈实测报告:单次索引超10万页PDF时,延迟突增217%的根源与绕行方案
更多请点击: https://intelliparadigm.com 第一章:NotebookLM与Google Drive整合性能瓶颈实测报告:单次索引超10万页PDF时,延迟突增217%的根源与绕行方案 延迟突增的核心成因 实测表明,当 NotebookLM 通过 Google Dr…...
【LangChain】 入门:从分步调用到链式编程
LangChain 入门:从分步调用到链式编程本文基于一段翻译助手的示例代码,讲解 LangChain 的核心概念、输出解析器的作用,以及普通写法与链式写法的对比。一、LangChain 是什么? 名字拆解缩写含义LangLanguage(语言&#…...
