说说JVM的底层原理(JAVA是如何运行的)?
JVM 底层原理深度解析
Java 虚拟机(JVM)是 Java 程序运行的核心环境,其设计融合了内存管理、类加载、垃圾回收和高效执行等复杂机制。以下从底层视角详细解析其核心模块,并结合实际场景说明其工作原理。
一、类加载机制
1. 类加载的触发与过程
类加载是 JVM 动态性的基石,其触发条件包括首次使用类(如 new
、反射调用等)或继承父类时。整个过程分为三个阶段:
-
加载(Loading)
- 功能:将
.class
字节码文件加载到内存,生成Class
对象。 - 实现细节:
- 类加载器(
ClassLoader
)通过全限定名查找.class
文件。 - 支持从文件系统、JAR 包、网络等来源加载。
- 类加载器(
- 示例:
// 用户调用 new UserService() 时,触发 UserService.class 的加载 UserService user = new UserService();
- 功能:将
-
链接(Linking)
- 验证(Verification):确保字节码符合 JVM 规范,防止恶意代码注入。
- 文件格式验证:检查魔数(
0xCAFEBABE
)、版本号等。 - 元数据验证:检查继承关系(如是否实现抽象方法)、字段类型等。
- 文件格式验证:检查魔数(
- 准备(Preparation):为静态变量分配内存并赋零值。
- 示例:
public static int count;
在准备阶段初始化为0
。 - 常量特殊处理:
public static final int MAX = 100;
直接赋值为100
。
- 示例:
- 解析(Resolution):将符号引用(如类名、方法名)转换为直接引用(内存地址)。
- 示例:将
System.out.println
解析为实际的方法地址。
- 示例:将
- 验证(Verification):确保字节码符合 JVM 规范,防止恶意代码注入。
-
初始化(Initialization)
- 执行
<clinit>
方法,合并所有静态代码块和静态变量赋值,按代码顺序执行。 - 父类优先原则:若父类未初始化,先触发父类的初始化。
- 示例:
static {System.out.println("静态代码块执行"); }
- 执行
2. 双亲委派模型
- 核心思想:类加载请求优先委派父加载器处理,避免重复加载和核心类篡改。
- 加载器层级:
- Bootstrap ClassLoader:加载
jre/lib
下的核心类(如java.lang.*
)。 - Extension ClassLoader:加载
jre/lib/ext
下的扩展类。 - Application ClassLoader:加载用户类路径(
-classpath
)的类。 - 自定义 ClassLoader:用户扩展的加载器(如 Tomcat 的
WebappClassLoader
)。
- Bootstrap ClassLoader:加载
- 破坏场景:
- SPI 机制:JDBC 驱动加载需使用线程上下文类加载器(
ThreadContextClassLoader
)。 - 热部署:通过自定义类加载器实现类的动态替换。
- SPI 机制:JDBC 驱动加载需使用线程上下文类加载器(
二、内存管理
1. 内存区域划分
JVM 内存划分为多个区域,各司其职:
-
堆(Heap)
- 功能:存储对象实例和数组,所有线程共享。
- 分区:
- 新生代(Young Generation):新对象分配区,分 Eden、Survivor0、Survivor1。
- 老年代(Old Generation):长期存活对象区。
- 内存分配策略:
- 指针碰撞(堆内存规整时)或 空闲列表(内存碎片化时)。
- TLAB(Thread Local Allocation Buffer):为每个线程预分配内存,避免竞争。
- 示例:
Object obj = new Object(); // 对象分配在堆中
-
虚拟机栈(JVM Stack)
- 功能:存储方法调用的栈帧(局部变量表、操作数栈、动态链接、方法出口)。
- 栈帧结构:
- 局部变量表:存放方法参数和局部变量。
- 操作数栈:执行字节码指令的工作区。
- 动态链接:指向方法区的方法引用。
- 示例:
public void calculate() {int a = 1; // 存入局部变量表int b = 2;int c = a + b; // 操作数栈执行加法 }
-
方法区(Method Area)
- 功能:存储类信息、常量、静态变量。
- 实现演变:
- JDK 7 及之前:永久代(PermGen),固定大小易导致
OutOfMemoryError
。 - JDK 8+:元空间(Metaspace),使用本地内存,动态扩展。
- JDK 7 及之前:永久代(PermGen),固定大小易导致
- 示例:
public static final String NAME = "JVM"; // 常量池存储在方法区
-
程序计数器(Program Counter Register)
- 功能:记录当前线程执行的字节码指令地址(线程私有)。
- 意义:线程切换后能恢复到正确执行位置。
2. 对象生命周期
-
创建:
- 类加载检查 → 分配内存 → 初始化零值 → 设置对象头 → 执行构造方法。
- 对象头结构:
- Mark Word:存储哈希码、GC 分代年龄、锁状态等。
- 类型指针:指向类元数据(方法区中的
Class
对象)。
- 示例:
User user = new User(); // 触发对象创建流程
-
内存回收:
- 对象不再被引用时,由垃圾回收器回收内存。
三、垃圾回收(GC)
1. 对象存活判定
- 引用计数法:循环引用问题(Java 未采用)。
- 可达性分析(主流):从 GC Roots 出发,标记不可达对象为垃圾。
- GC Roots 包括:
- 虚拟机栈中引用的对象(局部变量)。
- 方法区中静态变量、常量引用的对象。
- JNI(Native 方法)引用的对象。
- GC Roots 包括:
2. 垃圾回收算法
-
标记-清除(Mark-Sweep)
- 流程:标记垃圾对象 → 清除。
- 缺点:内存碎片化。
- 应用场景:CMS 收集器的老年代回收。
-
复制(Copying)
- 流程:将存活对象从 Eden 复制到 Survivor 区。
- 优点:无碎片,适合存活率低的新生代。
- 内存划分:Eden(80%)、Survivor0(10%)、Survivor1(10%)。
-
标记-整理(Mark-Compact)
- 流程:标记存活对象 → 整理到内存一端 → 清除边界外内存。
- 优点:无碎片,适合老年代。
- 应用场景:Serial Old、G1 收集器。
-
分代收集(Generational)
- 策略:新生代用复制算法,老年代用标记-清除或标记-整理。
- 依据:对象存活周期不同(新生代对象生命周期短)。
3. 垃圾收集器
收集器 | 特点 | 适用场景 |
---|---|---|
Serial | 单线程,简单高效 | 客户端应用 |
Parallel Scavenge | 多线程,吞吐量优先 | 后台计算任务 |
CMS | 低延迟,标记-清除,有内存碎片 | Web 应用 |
G1 | 分 Region 管理,可预测停顿时间 | 大内存应用 |
ZGC | 超低延迟(<10ms),支持 TB 级堆 | 高并发实时系统 |
四、执行引擎
1. 解释器与 JIT 编译器
- 解释器:逐行解释字节码,启动快但执行慢。
- JIT 编译器(Just-In-Time):将热点代码编译为本地机器码,提升执行速度。
- 热点探测:基于方法调用计数器、循环回边计数器。
- 优化技术:
- 方法内联:将小方法调用替换为方法体代码。
- 逃逸分析:若对象未逃逸出方法,直接在栈上分配。
- 锁消除:移除线程安全的无竞争锁。
2. 分层编译(Tiered Compilation)
- 层级:
- Level 0:解释执行。
- Level 1:简单编译(C1 编译器,快速生成代码)。
- Level 4:完全优化(C2 编译器,深度优化,耗时长)。
- 目标:平衡启动速度和长期性能。
五、实战场景分析
1. Spring Boot 启动流程中的 JVM 行为
@SpringBootApplication
public class MyApp {public static void main(String[] args) {SpringApplication.run(MyApp.class, args); // 触发类加载、Bean 初始化}
}@Service
public class UserService {static { System.out.println("静态代码块执行"); }public UserService() { System.out.println("构造方法执行"); }
}
输出:
静态代码块执行 // 类初始化阶段
构造方法执行 // Bean 实例化阶段
- 类加载:Spring 扫描到
@Service
注解时触发UserService
类加载。 - Bean 实例化:Spring 容器启动时创建单例 Bean,调用构造方法。
2. 内存泄漏排查
场景:静态集合持有对象导致无法回收。
public class MemoryLeak {private static List<byte[]> list = new ArrayList<>();public void addData() {list.add(new byte[1024 * 1024]); // 持续添加大对象}
}
排查步骤:
- 使用
jps
查看 Java 进程 ID。 - 使用
jmap -dump:format=b,file=heap.hprof <pid>
生成堆转储文件。 - 使用 MAT(Memory Analyzer Tool) 分析
list
的引用链,定位泄漏点。
六、JVM 调优策略
1. 堆内存设置
- 参数:
-Xms
:初始堆大小(如-Xms512m
)。-Xmx
:最大堆大小(如-Xmx2g
)。
- 建议:
-Xms
和-Xmx
设为相同值,避免堆动态调整的开销。
2. 垃圾收集器选择
- 高吞吐量:
-XX:+UseParallelGC
(Parallel Scavenge + Parallel Old)。 - 低延迟:
-XX:+UseG1GC
(G1 收集器)或-XX:+UseZGC
(ZGC)。
3. 监控工具
- jstat:监控 GC 统计信息。
jstat -gcutil <pid> 1000 # 每秒输出一次 GC 统计
- VisualVM:图形化监控堆、线程、CPU。
- Arthas:在线诊断工具,支持方法调用追踪、热修复。
七、总结
JVM 的底层原理是 Java 生态高效运行的基石:
- 类加载:动态加载与安全隔离。
- 内存管理:堆与栈的分工,对象生命周期的精准控制。
- 垃圾回收:自动内存管理的核心,影响系统吞吐量与延迟。
- 执行引擎:解释与编译结合,实现高性能执行。
深入理解 JVM,不仅能优化应用性能(如减少 Full GC 停顿),还能有效排查内存泄漏、锁竞争等问题,是高级 Java 开发的必备技能。
相关文章:
说说JVM的底层原理(JAVA是如何运行的)?
JVM 底层原理深度解析 Java 虚拟机(JVM)是 Java 程序运行的核心环境,其设计融合了内存管理、类加载、垃圾回收和高效执行等复杂机制。以下从底层视角详细解析其核心模块,并结合实际场景说明其工作原理。 一、类加载机制 1. 类加…...
IO 和 NIO 有什么区别?
文章目录 阻塞模式与非阻塞模式数据处理方式通信模型应用场景 阻塞模式与非阻塞模式 IO:是阻塞式的 IO 操作。在传统的 IO 中,当一个线程执行读操作或者写操作时,该线程会被阻塞,直到操作完成。例如,在从文件读取数据…...
JVM 面试
JVM 运行时内存区域划分是怎样的? 程序计数器:记录当前线程执行的字节码指令的地址,是线程私有的。 Java 虚拟机栈:每个方法在执行时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息&#…...
七、Redis集群高可用
一、节点与插槽管理 添加主节点 准备节点 首先准备一个新的节点,添加配置文件。 vi /usr/local/redis/cluster/conf/redis-6377.conf # 放行访问IP限制 bind 0.0.0.0 # 端口 port 6377 # 后台启动 daemonize yes # 日志存储目录及日志文件名 logfile "/us…...
WPF12-MVVM
目录 1. 什么是MVVM2. 实现简单MVVM2.1. Part 12.2. Part 21. 什么是MVVM MVVM 是 Model-View-ViewModel 的缩写,是一种用于构建用户界面的设计模式,是一种简化用户界面的事件驱动编程方式。 MVVM 的目标是实现用户界面和业务逻辑之间的彻底分离,以便更好地管理和维护应用…...
多智能体博弈代码案例
多智能体博弈代码案例 直接可用,我不吝啬 from openai import OpenAI import random# 定义不同人物角色的提示 CHARACTER_PROMPTS = {"专家": "你是该领域的权威专家,知识渊博,回答严谨专业。"...
【AHK】资源管理器自动化办公实例/自动连点设置
此处为一个自动连续点击打开检查的自动化操作案例,没有quicker的鼠键录制,不常用了,做个备份 #MaxThreadsPerHotkey 2 ; 这个是核心!!!!确保可以同时运行多个热键或标签global isRunning : tru…...
Python安装环境变量
1、确保已经安装python到电脑上 2、到系统上环境变量位置 3、新建 系统变量,变量名为PYTHON_HOME,变量值为python安装目录 4、 点击系统变量的path,并新建环境变量 5、测试 ,windowsR,并输入cmd,尝试命令python --ver…...
Flink同步数据mysql到doris问题合集
Flink同步数据mysql到doris 官方同步流程Doris安装下载地址导入镜像启动配置 Flink-cdc安装(自制)下载地址导入镜像启动命令 启动问题修复Flink报错Could not acquire the minimum required resources.作业报错 Mysql8.0 Public Key Retrieval is not al…...
Pytest测试用例执行跳过的3种方式
文章目录 1.前言2.使用 pytest.mark.skip 标记无条件跳过3.使用 pytest.mark.skipif 标记根据条件跳过4. 执行pytest.skip()方法跳过测试用例 1.前言 在实际场景中,我们可能某条测试用例没写完,代码执行时会报错,或者是在一些条件下不让某些…...
spring boot 连接FTP实现文件上传
spring boot 连接FTP实现文件上传 maven: <!--ftp--><dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.8.0</version></dependency>接口示例: ApiO…...
深入解析/etc/hosts.allow与 /etc/hosts.deny:灵活控制 Linux 网络访问权限
文章目录 深入解析/etc/hosts.allow与 /etc/hosts.deny:灵活控制 Linux 网络访问权限引言什么是 TCP Wrappers?工作原理 什么是 /etc/hosts.allow 和 /etc/hosts.deny?匹配规则配置语法详解配置示例允许特定 IP 访问 SSH 服务拒绝整个子网访问…...
短跑怎么训练提高最快·棒球1号位
棒球运动员的短跑能力直接影响跑垒、防守和进攻效率,提升短跑速度需结合专项需求(如爆发力、加速度、变向能力)进行系统训练。以下为针对性训练方案: 一、专项爆发力训练(提升起跑速度) 抗阻冲刺 用弹力带…...
USRP7440-通用软件无线电平台
1、产品描述 USRP7440基于第三代XILINX Zynq UltraScale RFSoC架构,它将射频ADC、DAC、ARM、FPGA等集成一体,瞬时带宽可以达到2.5GHz,尤其适合于射频直采应用,比如通信与雷达。 第一代RFSOC高达4GHz • 8x 或 16x 6.554GSPS DAC…...
51c大模型~合集48
我自己的原文哦~ https://blog.51cto.com/whaosoft/11940475 #Mini-Omni 让大模型能听会说,国内机构开源全球首个端到端语音对话模型 本文出自启元世界多模态算法组,共同一作是来自清华大学的一年级硕士生谢之非与启元世界多模态负责人吴昌桥&…...
004-利用Docker安装Mysql
利用Docker安装Mysql 一、在镜像仓库找到 Mysql1.镜像仓库地址2.复制命令3.下载Mysql镜像4.查看镜像 二、创建实例并启动三、用本地工具连接数据库四、设置 Mysql 配置 一、在镜像仓库找到 Mysql 1.镜像仓库地址 https://hub.docker.com 2.复制命令 docker pull mysql:8.0…...
Web自动化之Selenium添加网站Cookies实现免登录
在使用Selenium进行Web自动化时,添加网站Cookies是实现免登录的一种高效方法。通过模拟浏览器行为,我们可以将已登录状态的Cookies存储起来,并在下次自动化测试或爬虫任务中直接加载这些Cookies,从而跳过登录步骤。 Cookies简介 …...
UEditor集成Markdown编辑功能方案
分步解决方案: 1. 推荐免费开源Markdown库 推荐使用 markdown-it(MIT协议) 官网:https://github.com/markdown-it/markdown-it 特点:轻量级(15KB)、扩展性强、支持CommonMark规范、中文文档丰…...
综合练习 —— 递归、搜索与回溯算法
目录 一、1863. 找出所有子集的异或总和再求和 - 力扣(LeetCode) 算法代码: 代码思路 问题分析 核心思想 实现细节 代码解析 初始化 DFS 函数 时间复杂度 空间复杂度 示例运行 输入 运行过程 总结 二、 47. 全排列 II - 力扣&a…...
Python之使用动态导包优化软件加载速度
在开发大型 Python 软件时,可能会遇到以下问题:由于静态导入了大量模块,导致软件启动时间过长,用户体验不佳。例如,一个复杂的桌面应用程序或 Web 服务可能依赖于多个大型库(如 numpy、pandas、torch 或 Yolo),这些库在启动时被静态导入,即使某些功能模块在启动时并不…...
第16天:C++多线程完全指南 - 从基础到现代并发编程
第16天:C多线程完全指南 - 从基础到现代并发编程 一、多线程基础概念 1. 线程创建与管理(C11) #include <iostream> #include <thread>void hello() {std::cout << "Hello from thread " << std::this_…...
建筑兔零基础人工智能自学记录33|基础知识1
插入学习一下一些基础概念: 1、基本概念 人工智能:让机器像人一样思考。机器学习ML:计算机获取知识的过程。深度学习:机器的一种思考方式(借助神经网络)。 三者关系 2、机器学习的方式 监督学习&#x…...
win11编译pytorchaudio cuda128版本流程
1. 前置条件 本篇续接自 win11编译pytorch cuda128版本流程,阅读前请先参考上一篇配置环境。 访问https://kkgithub.com/pytorch/audio/archive/refs/tags/v2.6.0.tar.gz下载源码,下载后解压; 2. 编译 在visual studio 2022安装目录下查找…...
Python—Excel全字段转json文件(极速版+GUI界面打包)
目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码(简易版)5、进阶版(GUI)总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——…...
NLP学习记录十一:位置编码
目录 一、位置编码的意义 二、位置编码方法 三、代码实现 一、位置编码的意义 在标准的注意力机制中,每个查询都会关注所有的键-值对并生成一个注意力输出,模型并没有考虑到输入序列每个token的顺序关系。 以["我&qu…...
算法之算法主题
程序员数学 《程序员数学 v2.0》 | 小傅哥 bugstack 虫洞栈 智力题 头脑风暴题目 | Java 全栈知识体系...
【三维分割】LangSplat: 3D Language Gaussian Splatting(CVPR 2024 highlight)
论文:https://arxiv.org/pdf/2312.16084 代码:https://github.com/minghanqin/LangSplat 文章目录 一、3D language field二、回顾 Language Fields的挑战三、使用SAM学习层次结构语义四、Language Fields 的 3DGS五、开放词汇查询(Open-voca…...
Wireshark:自定义类型帧解析
文章目录 1. 前言2. 背景3. 开发 Lua 插件 1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. 背景 Wireshark 不认识用 tcpdump 抓取的数据帧,仔细分析相关代码和数据帧后,…...
ES6 特性全面解析与应用实践
1、let let 关键字用来声明变量,使用let 声明的变量有几个特点: 1) 不允许重复声明 2) 块儿级作用域 3) 不存在变量提升 4) 不影响作用域链 5) 暂时性死区 6)不与顶级对象挂钩 在代码块内,使用let命令声明变量之前&#x…...
Qt跨线程信号槽调用:为什么信号不能像普通函数那样调用
1. 信号与槽机制的基本原理 在 Qt 中,信号与槽机制是一种事件驱动的通信方式,用于对象之间的解耦交互。其关键特点如下: 信号不能直接调用 信号只是一个声明,并没有实际的函数实现。它们通过 emit 关键字在对象内部被触发&…...
Zookeeper(79)如何进行Zookeeper的监控?
对 Zookeeper 进行监控是确保其高可用性和性能的关键步骤。监控 Zookeeper 通常包括以下几个方面: 健康检查:检查 Zookeeper 节点是否在线。性能指标:监控关键性能指标,如请求延迟、事务处理量等。日志监控:监控 Zook…...
【江科大STM32】TIM输出比较-PWM功能(学习笔记)
一、PWM驱动LED呼吸灯 接线图: PWM的初始化: 具体步骤: ①RCC开启时钟(把要用的TIM外设和GPIO外设时钟都打开) ② 配置时基单元,包括前面的时钟源选择 ③配置输出比较单元,里面包括CCR的值ÿ…...
playbin之autoplug_factories源码剖析
一、autoplug_factories_cb /* Called when we must provide a list of factories to plug to pad with caps.* We first check if we have a sink that can handle the format and if we do, we* return NULL, to expose the pad. If we have no sink (or the sink does not…...
Spring Cloud之注册中心之Nacos的使用
目录 Naacos 服务注册/服务发现 引⼊Spring Cloud Alibaba依赖 引入Nacos依赖 引入Load Balance依赖 配置Nacos地址 服务端调用 启动服务 Naacos Nacos是Spring Cloud Alibaba的组件, Spring Cloud Alibaba遵循Spring Cloud中定义的服务注册, 服务发现规范. 因此使⽤Na…...
React antd的datePicker自定义,封装成组件
一、antd的datePicker自定义 需求:用户需要为日期选择器的每个日期单元格添加一个Tooltip,当鼠标悬停时显示日期、可兑换流量余额和本公会可兑流量。这些数据需要从接口获取。我需要结合之前的代码,确保Tooltip正确显示,并且数据…...
【tplink】校园网接路由器如何单独登录自己的账号,wan-lan和lan-lan区别
老式路由器TPLINK,接入校园网后一人登录,所有人都能通过连接此路由器上网,无法解决遂上网搜索,无果,幸而偶然看到一个帖子说要把信号源网线接入路由器lan口,开启新世界。 一、wan-lan,lan-lan区…...
散户情绪周期模型(情绪影响操作)
目录 一、个股上涨阶段情绪演化二、个股下跌阶段情绪演化三、底部震荡阶段情绪演化四、情绪观察与操作工具箱1. 情绪自测量表(每日收盘后记录)2. 情绪-指标对照表 五、高阶情绪管理技巧1.认知重构训练2.生理指标监控(需配合智能手表ÿ…...
对比Grok3 普通账户与 30 美元 Super 账户:默认模式、Think 和 DeepSearch 次数限制以及如何升级
面对这个马斯克旗下的"最聪明"的人工智能,很多人都不知道他们的基本模式,本期将从几个方面开始说明: Grok3的背景与功能 账户类型及其详细背景 使用限制 使用限制对比表 如何充值使用 Super 账户 纯干货,带你了解…...
小程序Three Dof识别 实现景区AR体验
代码工程 GitCode - 全球开发者的开源社区,开源代码托管平台 dof...
主流Linux发行版优缺点整理及对比指南(文末附表格)
Linux发行版种类繁多,各有其设计理念和适用场景。本文整理常见发行版的优缺点,并附对比表格,帮助用户根据需求选择最适合的系统。 1. Ubuntu 定位:适合新手的通用型桌面/服务器系统优点: 安装简单,社区支持…...
用大白话解释搜索引擎Elasticsearch是什么,有什么用,怎么用
Elasticsearch是什么? Elasticsearch(简称ES)就像一个“超级智能的图书馆管理系统”,专门帮你从海量数据中快速找到想要的信息。它底层基于倒排索引技术(类似书籍的目录页),能秒级搜索和分析万…...
坐标变换及视图变换和透视变换(相机透视模型)
文章目录 2D transformationScaleReflectionShear(切变)Rotation around originTranslationReverse变换顺序复杂变换的分解 齐次坐标(Homogenous Coordinates)3D transformationScale&TranslationRotation Viewing / Camera t…...
C# 基于.NET Framework框架WPF应用程序-MQTTNet库实现MQTT消息订阅发布
C# 基于.NET Framework框架WPF应用程序-MQTTNet库实现MQTT消息订阅发布 MQTT简述MQTTNet简述创建项目(基于.NET Framework框架)安装MQTTNet库项目源码运行效果 MQTT简述 mqtt官网 MQTTNet简述 MQTTnet MQTTnet 是一个强大的开源 MQTT 客户端库&#…...
Python实现视频播放器
Python实现视频播放器 Python实现视频播放器,在如下博文中介绍过 Python实现本地视频/音频播放器https://blog.csdn.net/cnds123/article/details/137874107 Python简单GUI程序示例 中 “四、视频播放器” https://blog.csdn.net/cnds123/article/details/122903…...
介绍一款飞算JavaAI编程工具,集成到idea,图文并茂
飞算的插件下载地址,里边也有安装步骤: JavaAI 下载 从file-》setting-》plugin,然后走图中所示 选择从磁盘安装插件:找到下载好的压缩包然后进行idea重启 根据提示模块可以生成代码,就是需要等待,后期不…...
【大数据】Spark Executor内存分配原理与调优
【大数据】Spark Executor内存管理与调优 Executor内存总体布局 统一内存管理 堆内内存 (On-heap Memory) 堆外内存 (Off-heap Memory) Execution 内存和 Storage 内存动态占用机制 任务内存管理(Task Memory Manager) 只用了堆内内存的示例 用了…...
Python 课堂点名桌面小程序
一、场景分析 闲来无事,老婆说叫我开发一个课堂点名桌面小程序,给她在课堂随机点名学生问问题。 人生苦短,那就用 Python 给她写一个吧。 二、依赖安装 因为要用到 excel,所以安装两个依赖: pip install openpyxl…...
配置Spring Boot中的Jackson序列化
配置Spring Boot中的Jackson序列化 在开发基于Spring Boot的应用程序时,Jackson是默认的JSON序列化和反序列化工具。它提供了强大的功能,可以灵活地处理JSON数据。然而,Jackson的默认行为可能无法完全满足我们的需求。例如,日期格…...
Rust学习总结之-match
Rust 有一个叫做 match 的极为强大的控制流运算符,它允许我们将一个值与一系列的模式相比较,并根据相匹配的模式执行相应代码。模式可由字面量、变量、通配符和许多其他内容构成。 一:match定义 可以把 match 表达式想象成某种硬币分类器&a…...
实践教程:使用DeepSeek实现PDF转Word的高效方案
🎈Deepseek推荐工具 PDF文件因其跨平台、格式稳定的特性被广泛使用,但在内容编辑场景中,用户常需将PDF转换为可编辑的Word文档。传统的付费工具(如Adobe Acrobat)或在线转换平台存在成本高、隐私风险等问题。本文将使…...