JVM 的不同组成部分分别有什么作用?
JVM(Java Virtual Machine)主要由以下几个核心组成部分构成:
1. 类加载器子系统 (Class Loader Subsystem):
-
作用:
- 加载类: 负责查找并加载 Java 类文件(.class 文件)到 JVM 中。 类文件可以来自本地文件系统、网络、JAR 包等。
- 链接类: 将加载的类合并到 JVM 的运行时状态中,包括验证、准备和解析(可选)三个阶段。
- 验证 (Verification): 确保类文件的结构符合 JVM 规范,并且不会危害 JVM 的安全。
- 准备 (Preparation): 为类的静态变量分配内存,并设置默认初始值(例如,int 类型的默认值为 0,boolean 类型的默认值为 false)。
- 解析 (Resolution): 将类、接口、字段和方法的符号引用解析为直接引用(可选,可以延迟到运行时)。
- 初始化类: 执行类的初始化代码(静态变量赋值和静态代码块)。
-
类加载器类型:
- 启动类加载器 (Bootstrap Class Loader): 加载 Java 核心类库(
<JAVA_HOME>/jre/lib)。 - 扩展类加载器 (Extension Class Loader): 加载 Java 扩展类库(
<JAVA_HOME>/jre/lib/ext或java.ext.dirs指定的目录)。 - 应用程序类加载器 (Application Class Loader): 加载应用程序的类(classpath)。
- 自定义类加载器: 开发者可以自定义类加载器,实现特殊的类加载逻辑。
- 启动类加载器 (Bootstrap Class Loader): 加载 Java 核心类库(
-
双亲委派模型: 除了启动类加载器,每个类加载器都有一个父类加载器。当一个类加载器需要加载类时,它首先会委托给父类加载器去加载,只有当父类加载器无法加载时,才由自己加载。
2. 运行时数据区 (Runtime Data Areas):
- 作用: JVM 在运行 Java 程序时管理的内存区域,用于存储程序运行过程中需要的数据。
- 主要区域:
-
方法区 (Method Area):
- 存储内容: 类信息(类名、父类、接口、字段、方法等)、常量、静态变量、即时编译器编译后的代码。
- 共享性: 所有线程共享。
- HotSpot VM 中的实现:
- JDK 1.7 及之前:永久代 (Permanent Generation)。
- JDK 1.8 及之后:元空间 (Metaspace)(使用本地内存)。
- 运行时常量池 (Runtime Constant Pool): 方法区的一部分,存放编译期生成的各种字面量和符号引用。
-
堆 (Heap):
- 存储内容: 对象实例和数组。
- 共享性: 所有线程共享。
- 垃圾回收: 是垃圾回收的主要区域。
- 划分: 通常划分为新生代(Young Generation)和老年代(Old Generation)。
- 新生代又可以划分为 Eden 区、Survivor from 区和 Survivor to 区。
-
虚拟机栈 (VM Stack):
- 存储内容: 方法调用的局部变量、操作数栈、动态链接、方法出口等信息。
- 共享性: 每个线程都有自己的虚拟机栈(线程私有)。
- 栈帧 (Stack Frame): 每次方法调用都会创建一个栈帧,用于存储方法的局部变量等信息。方法执行完毕后,栈帧会被销毁。
- 异常:
StackOverflowError: 线程请求的栈深度大于虚拟机允许的深度。OutOfMemoryError: 虚拟机栈无法申请到足够的内存(如果可以动态扩展)。
-
本地方法栈 (Native Method Stack):
- 存储内容: 与虚拟机栈类似,但用于支持 native 方法(使用 C、C++ 等编写的方法)的执行。
- 共享性: 每个线程都有自己的本地方法栈(线程私有)。
-
程序计数器 (Program Counter Register):
- 存储内容: 当前线程正在执行的字节码指令的地址(行号)。
- 共享性: 每个线程都有自己的程序计数器(线程私有)。
- 特点: 是唯一一个在 Java 虚拟机规范中没有规定任何
OutOfMemoryError情况的区域。
-
3. 执行引擎 (Execution Engine):
- 作用: 负责执行 Java 字节码指令。
- 主要组件:
-
解释器 (Interpreter):
- 逐条解释执行字节码指令。
- 优点:启动速度快,不需要等待编译。
- 缺点:执行速度慢,特别是对于频繁执行的代码。
-
即时编译器 (JIT Compiler):
- 将热点代码(经常执行的代码,例如循环体、频繁调用的方法)编译为本地机器码,提高执行效率。
- 优点:执行速度快(接近本地代码)。
- 缺点:编译需要时间,会增加启动时间。
- HotSpot VM 中的 JIT 编译器:
- Client Compiler (C1): 优化速度快,但优化程度较低。适用于客户端应用或对启动速度要求较高的场景。
- Server Compiler (C2): 优化速度慢,但优化程度较高。适用于服务端应用或对性能要求较高的场景。
- 分层编译 (Tiered Compilation): 根据程序的运行情况,选择不同的编译器进行优化。
- 第 0 层: 解释执行。
- 第 1 层: 使用 C1 编译,不开启 profiling。
- 第 2 层: 使用 C1 编译,仅开启方法和循环回边的 profiling。
- 第 3 层: 使用 C1 编译,开启所有 profiling。
- 第 4 层: 使用 C2 编译。
-
垃圾回收器 (Garbage Collector):
- 负责自动回收不再使用的对象,释放内存。
- 不同的 JVM 实现有不同的垃圾回收器。
- 常见的垃圾回收器:
- Serial GC
- Parallel GC
- CMS GC (Concurrent Mark Sweep)
- G1 GC (Garbage-First)
- ZGC
- Shenandoah
-
本地方法接口 (JNI, Java Native Interface):
- 允许 Java 代码调用本地方法 (C/C++ 等编写的方法).
-
总结:
| JVM 组成部分 | 作用 |
|---|---|
| 类加载器子系统 | 加载类文件(.class 文件)到 JVM 中,包括加载、链接(验证、准备、解析)和初始化三个阶段。 |
| 运行时数据区 | JVM 在运行 Java 程序时管理的内存区域,包括方法区、堆、虚拟机栈、本地方法栈、程序计数器。 |
| 执行引擎 | 执行 Java 字节码指令,包括解释器、即时编译器、垃圾回收器。 |
| 本地方法接口(JNI) | 允许Java代码与本地代码(通常是C或C++)交互 |
相关文章:
JVM 的不同组成部分分别有什么作用?
JVM(Java Virtual Machine)主要由以下几个核心组成部分构成: 1. 类加载器子系统 (Class Loader Subsystem): 作用: 加载类: 负责查找并加载 Java 类文件(.class 文件)到 JVM 中。 类文件可以来…...
正则表达式 - 修饰符
正则表达式 - 修饰符 正则表达式是一种强大的文本处理工具,它广泛应用于数据验证、文本搜索、替换、匹配等场景。在正则表达式中,修饰符是用于调整正则表达式行为的特殊字符。本文将详细解析正则表达式中的常用修饰符,帮助读者更好地理解和运用正则表达式。 1. 字符串定位…...
K8s 1.27.1 实战系列(十二)Ingress
一、Ingress介绍 1、Ingress 的核心概念 Ingress 是 Kubernetes 中管理外部流量访问集群内服务的 API 对象,通过 7 层(HTTP/HTTPS)协议实现流量路由、负载均衡和 SSL 终止。它弥补了传统 Service(如 NodePort 和 LoadBalancer)的不足,例如端口占用过多、不支持路径路由…...
tomcat应用的作用以及安装,以及tomcat软件的开机自启动。
一.tomcat介绍 1.作用 tomcat是一款用来部署网站服务器的一款软件。 动态网站主流语言: PHP, lamp/lnmp平台 Java语言,运行在tomcat平台。【只要这个网站或者软件是Java语言写的,我们都可以在tomcat平台上去运行这个java程序。】 网站是…...
Unity中WolrdSpace下的UI展示在上层
一、问题描述 Unity 中 Canvas使用World Space布局的UI,想让它不被3d物体遮挡,始终显示在上层。 二、解决方案 使用shader解决 在 UI 的材质中禁用深度测试(ZTest),强制 UI 始终渲染在最上层。 Shader "Custo…...
postgresql 数据库使用
目录 索引 查看索引 创建 删除索引 修改数据库时区 索引 查看索引 select * from pg_indexes where tablenamet_table_data; 或者 select * from pg_statio_all_indexes where relnamet_table_data; 创建 CREATE INDEX ix_table_data_time ON t_table_data (id, crea…...
Redis的缓存雪崩、缓存击穿、缓存穿透与缓存预热、缓存降级
一、缓存雪崩: 1、什么是缓存雪崩: 如果缓在某一个时刻出现大规模的key失效,那么就会导致大量的请求打在了数据库上面,导致数据库压力巨大,如果在高并发的情况下,可能瞬间就会导致数据库宕机。这时候如果…...
【SpringMVC】常用注解:@RequestParam
1.作用 如果控制器标注的方法的参数名称与前端传递过来的参数名称不一致,使得SpringMVC无法自动启动,那么我们可以使用该注解实现前后端参数的绑定。 2.相关属性 value/name:这两个属性都是一个作用,都是描述参数的名称&#x…...
JVM垃圾收集器相关面试题(1)
垃圾收集与内存管理摘要 一.核心垃圾收集算法对比 算法原理优点缺点适用场景标记-清除两次遍历(标记存活对象→清除未标记对象)实现简单内存碎片化、双遍历效率低老年代(结合整理)标记-复制内存对半分,存活对象复制到…...
详解SQL数据查询功能
数据查询 一、 单表查询1. 选择表中的若干列2. 选择表中的若干元组3. ORDER BY 子句4. 聚合函数5. GROUP BY 子句6. LIMIT 子句综合示例: 二、 多表查询1. 等值连接查询 (Equi-Join)2. 非等值连接查询 (Non-Equi Join)3. 自然连接查询 (Natural Join)4. 复合条件连接…...
车载以太网测试-11【网络层-ICMP协议】
目录 1 摘要2 ICMP协议帧结构2.1 IP头部2.2 ICMP头部2.3 ICMP数据部分2.4 示例:ICMP回显请求(Ping请求) 3 ICMP协议在车载以太网的应用3.1 为什么需要ICMP?3.1.1 网络连通性测试3.1.2 错误报告3.1.3 网络性能监测3.1.4 路径MTU发现…...
leetcode:728. 自除数(python3解法)
难度:简单 自除数 是指可以被它包含的每一位数整除的数。 例如,128 是一个 自除数 ,因为 128 % 1 0,128 % 2 0,128 % 8 0。 自除数 不允许包含 0 。 给定两个整数 left 和 right ,返回一个列表ÿ…...
【QT】-一文读懂抽象类
抽象类(Abstract Class)是面向对象编程中的一个概念,指的是无法被实例化的类,它通常作为其他类的基类。抽象类的作用是定义一个接口(或约定),让派生类(继承自抽象类的类)来实现具体的功能。 抽象类的特点: 包含纯虚函数(Pure Virtual Function): 抽象类通常包含一…...
vue3-computed计算属性和reactive响应式系统结合使用
1.前言 vue3中使用reactive函数创建一个响应式对象,当对象数据发生变化的时候,依赖这些数据的计算属性和模板会自动的更新。 2.实例 2.1 简写 <template><div><p>用户名: {{ userName }}</p><p>用户名的大写形式: {{ u…...
Dubbo请求调用本地服务
文章目录 前言配置 Dubbo 本地调用方法一:application.yml 中配置方法二:DubboReference 注解中指定 注意个人简介 前言 在微服务架构中,Apache Dubbo 作为一款高性能、轻量级的 RPC 框架,被广泛应用于分布式系统。通常ÿ…...
Pycharm 社区版安装教程
找到安装包双击安装文件---点击下一步 一般路径是:C:\Rambo\Software\Development 选择完成后就是如下地址: C:\Rambo\Software\Development\PyCharm Community Edition 2024.3.3 点击上述3个位置就可以了----下一步 等待安装就可以了---完成后点击完成…...
Linux红帽:RHCSA认证知识讲解(六)创建、管理和删除本地用戶和组
Linux红帽:RHCSA认证知识讲解(六)创建、管理和删除本地用戶和组 前言一、用户和组概念用户类型对比表格主要组和补充组对比表格: 二、本地用户账户增删改查三、本地组账户 前言 上篇博客我们详细了解了从红帽和 DNF 软件仓库下载…...
在虚拟环境里面配置Linux系统
Linux系统有很多版本,常用的有Ubantu乌班图,和CentOS 不同的版本在使用的时候,有部分执行方式的不同 安装的流程都一样 首先,想要安装Ubantu,要去它的官网,找下载连接,然后下载iso后缀的安装…...
React开发指南:核心、实践与案例
文章目录 一、React核心架构与设计哲学1.1 虚拟DOM与Diff算法1.2 JSX编译原理1.3 组件化设计模式1.4 Fiber架构解析1.5 组件生命周期(类组件) 二、React核心特性详解2.1 数据流管理2.2 Hooks革命2.3 Context API进阶2.4 自定义Hooks设计模式 三、React 1…...
分享vue好用的pdf 工具实测
vue3-pdf-app: 带大纲,带分页,带缩放,带全屏,带打印,带下载,带旋转 下载依赖: yarn add vue3-pdf-appornpm install vue3-pdf-app 配置类: 创建文件 pdfConfig.ts /…...
Redis分布式锁深度剖析:从原理到Redisson实战,破解脑裂与高并发锁难题
一、📌 分布式锁的核心应用场景 场景类型典型案例风险说明🚀 高并发场景电商秒杀、票务抢购库存超卖风险⏰ 定时任务场景集群日志清理、数据统计任务重复执行🔄 幂等场景支付接口重试、订单创建资金重复扣款 二、🔧 Redis分布式锁…...
Markdown Poster – 免费Markdown转图片工具|优雅图文海报制作与社交媒体分享
Markdown Poster是什么 Markdown Poster 是一款高效的 Markdown 转图片工具,利用灵活编辑和实时预览功能帮助用户轻松制作优雅的图文海报。该工具内置丰富的海报模板和多种主题选项,支持导出为图片和 HTML 代码,适用于社交媒体分享、网站集成…...
掌握市场先机:9款销售渠道管理工具深度测评
本文主要介绍了以下9款销售渠道管理工具:1.纷享销客; 2.销帮帮; 3.小满CRM; 4.有赞; 5.Oracle NetSuite; 6.Salesforce Sales Cloud; 7.Cin7; 8.Pipedrive; 9.BigCommerc…...
OpenCV图像加权函数:addWeighted
1 addWeighted函数 在OpenCV 里,addWeighted 函数的作用是对两个图像进行加权求和,常用于图像融合、图像过渡等场景。函数如下: cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])2 参数解释 src1:第一个输入图…...
直方图(信息学奥赛一本通-1115)
【题目描述】 给定一个非负整数数组,统计里面每一个数的出现次数。我们只统计到数组里最大的数。假设 Fmax(Fmax<10000)是数组里最大的数,那么我们只统计{0,1,2.....Fmax}里每个数出现的次数。 【输入】 第一行n是数组的大小。…...
docker桌面版启动redis,解决无法连接
docker run -d --name redis -p 6379:6379 -v E:\2\redis\redis.conf:/usr/local/etc/redis/redis.conf redis redis-server /usr/local/etc/redis/redis.conf 在本地创建一个目录,里面有个redis.conf文件,内容如下,启动时绑定这个配置文件目…...
Scratch 3.0安装包,支持Win7/10/11、Mac电脑手机平板、少儿便编程的启蒙软件。
Scratch是一款由麻省理工学院(MIT) 设计开发的少儿编程工具。其特点是:使用者可以不认识英文单词,也可以不使用键盘,就可以进行编程。构成程序的命令和参数通过积木形状的模块来实现。用鼠标拖动指令模块到脚本区就可以…...
Java创造型模式之原型模式详解
设计模式是面向对象设计中的一种标准方法,用于解决常见的设计问题。原型设计模式(Prototype Pattern)是23种经典设计模式之一,属于创建型模式,它允许通过复制现有对象来创建新对象,而不是通过构造函数或工厂…...
JVM的各种细节
(1)JVM 核心结构(必须知道) 类加载器 负责将.class()文件加载到内存中,供 JVM 使用。 方法区 存储类元数据(类名、字段、方法)、常量池、静态变量等。 JDK 8:由元空间(Metaspace)…...
JavaScript基本知识
文章目录 一、JavaScript基础1.变量(重点)1-1 定义变量及赋值1-2 变量的命名规则和命名规范判断数据类型: 2.数据类型转换2-1 其他数据类型转成数值2-2 其他数据类型转成字符串2-3 其他数据类型转成布尔 3.函数3-1函数定义阶段3-2函数调用阶段…...
