JVM高阶架构:并发模型×黑科技×未来趋势解析
🚀前言
“你是否还在为synchronized
锁竞争头疼?是否好奇ZGC如何实现亚毫秒停顿?Java的未来将走向何方?
本文将带你深入JVM最硬核的三大领域:
- 并发模型:揭秘
happens-before
如何保证多线程安全(附CPU缓存一致性协议图解) - 黑科技:用
-XX:+DoEscapeAnalysis
让对象栈上分配,提升3倍性能! - 未来趋势:虚拟线程(Loom)如何用
1:1000
的线程开销颠覆传统?
无论你是:
- 被
volatile
和synchronized
绕晕的开发者 - 追求极致性能的架构师
- 关注Java技术演进的决策者
这里都有深度技术解析+可落地的优化方案!
👀文章摘要
📌 核心内容:
✅ JVM并发模型:
- Java内存模型(JMM)与硬件内存架构的映射关系
happens-before
规则的8大场景(锁/volatile/线程启动等)synchronized
的锁升级过程(偏向锁→轻量级锁→重量级锁)
✅ JVM黑科技:
- 逃逸分析:如何通过
-XX:+PrintEscapeAnalysis
验证对象栈分配? - 方法内联:C2编译器如何自动优化热点方法(
-XX:+PrintInlining
) - AOT编译:Spring Boot应用用GraalVM打包后启动速度提升10倍
✅ 未来展望:
- 虚拟线程(Loom):百万级并发连接的实际测试数据
- 值类型(Valhalla):
Point
类内存占用从32字节降到16字节 - 云原生JVM:Quarkus如何实现50ms冷启动?
🔍 适合人群:
- 需要深入理解并发的Java高级开发者
- 关注JVM性能优化的架构师
- 技术选型决策者(如选择ZGC vs Shenandoah)
第一章 JVM并发模型:从理论到机器指令
1.1 Java内存模型(JMM)
核心问题:解决多线程下的可见性、有序性、原子性
硬件关系:
JMM关键概念:
组件 | 作用 | 硬件映射 |
---|---|---|
主内存 | 存储共享变量 | 内存条 |
工作内存 | 线程私有变量副本 | CPU核心的L1/L2缓存 |
内存屏障 | 控制读写顺序(LoadLoad/StoreStore等) | CPU的mfence指令 |
1.2 happens-before 规则
八大场景(无需同步也能保证可见性):
- 程序顺序规则:同一线程内的操作按代码顺序生效
- 锁规则:解锁操作先于后续加锁操作
- volatile规则:写操作先于后续读操作
- 线程启动规则:
thread.start()
前的操作对线程可见 - 线程终止规则:线程中的所有操作先于
thread.join()
- 中断规则:
interrupt()
调用先于检测到中断 - 终结器规则:对象构造先于
finalize()
方法 - 传递性:A→B且B→C ⇒ A→C
案例:指令重排序问题
// 可能输出(0,0)!因为JMM允许重排序
int a = 0, b = 0;
void thread1() {a = 1; // 写操作b = 1; // 可能被重排序到前面
}
void thread2() {System.out.println(a + "," + b);
}
✅ 修复:对a
或b
添加volatile
1.3 volatile与synchronized实现
volatile底层
字节码标记:
// 编译后会在访问指令前添加:
0x01: access_flags = ACC_VOLATILE
机器指令级实现(x86为例):
- 写操作:插入
lock addl $0x0,(%rsp)
(隐含内存屏障) - 读操作:禁止该指令与前面读指令重排序
synchronized底层
锁升级流程:
对象头结构(64位JVM):
|------------------------------------------------------------------|
| Mark Word (64 bits) | Klass Word (64 bits) |
|--------------------------------------|----------------------------|
| unused:25 | identity_hashcode:31 | 指向类元数据的指针 |
| | cms_free:1 | age:4 | biased_lock:1 | lock:2 (01) |
|------------------------------------------------------------------|
字节码示例:
// synchronized方法
public synchronized void syncMethod();descriptor: ()Vflags: ACC_PUBLIC, ACC_SYNCHRONIZED // 方法标志位// synchronized块
monitorenter // 获取锁
...代码...
monitorexit // 释放锁
🚨 常见误区与真相
❌ 误区:“volatile变量具有原子性”
✅ 真相:仅保证单次读/写的原子性(如volatile long
在32位系统非原子)
❌ 误区:“synchronized一定比CAS慢”
✅ 真相:JDK6后优化了锁消除/锁粗化/偏向锁,竞争不激烈时开销极低
📌 性能优化 checklist
- 读多写少 → 用
StampedLock
乐观读 - 短暂竞争 → 用
CAS
(如AtomicInteger
) - 明确可见性 →
volatile
+happens-before
- 复杂同步 →
synchronized
+ 锁细化
💡 黄金法则:
- 先保证正确性,再优化性能
- 通过
-XX:+PrintAssembly
查看汇编指令验证优化
🛠️ 附:诊断工具
# 查看对象头信息(需JOL库)
java -jar jol-cli.jar internals java.lang.Object# 打印锁竞争情况
jstack <pid> | grep -A 10 "BLOCKED"
第二章 JVM黑科技:性能优化的秘密武器
2.1 逃逸分析与栈上分配
什么是逃逸分析?
JVM在编译时分析对象作用域,判断对象是否:
- 方法逃逸:被其他方法引用
- 线程逃逸:被其他线程访问
优化策略:
实战案例:
// 未逃逸对象(优化后直接在栈上分配)
public void process() {Point p = new Point(1, 2); // 不会逃逸出方法System.out.println(p.x);
}// 标量替换(拆解对象为基本类型)
// 优化前:分配Point对象
// 优化后:直接使用int x=1, int y=2
验证方法:
java -XX:+PrintEscapeAnalysis -XX:+PrintAssembly MyApp
2.2 方法内联与JIT优化
内联条件:
- 方法体较小(
-XX:MaxInlineSize=35
字节,默认) - 调用频率高(热点方法)
- 非虚方法(
private/static/final/构造方法
)
多级编译:
层级 | 编译器 | 触发条件 | 优化强度 |
---|---|---|---|
0 | 解释执行 | 初始阶段 | 无 |
1 | C1 | 方法调用次数>阈值 | 基础优化 |
2 | C2 | 持续热点(>10000次) | 激进优化 |
手动优化建议:
// 适合内联的小方法
@Inline
public static int add(int a, int b) {return a + b;
}
监控JIT:
# 打印编译日志
-XX:+PrintCompilation -XX:+PrintInlining
2.3 GraalVM与AOT编译
GraalVM三大优势:
- 原生镜像:
native-image
工具将Java编译为本地可执行文件- 启动时间从秒级降到毫秒级
- 内存占用减少50%+
- 多语言互操作:支持JS/Python/Ruby等语言混合编程
- 增强的JIT:替代C2编译器,提升峰值性能
AOT编译实战:
# 1. 安装GraalVM
sdk install java 22.3.r19-grl# 2. 构建原生镜像
native-image -jar myapp.jar# 3. 运行(无需JRE!)
./myapp
与传统JVM对比:
指标 | HotSpot JVM | GraalVM Native Image |
---|---|---|
启动时间 | 1.2s | 0.05s |
内存占用 | 120MB | 45MB |
峰值性能 | 100% | 85%~95% |
🚨 黑科技避坑指南
❌ 逃逸分析失效场景:
- 对象赋值给静态字段
- 方法返回对象引用
❌ AOT编译限制:
- 反射/动态代理需提前配置
reflect-config.json
- 不支持
invokedynamic
(部分Lambda受影响)
📌 性能优化黄金法则
- 小即是美:方法体<35字节更易内联
- 局部性优先:避免对象逃逸最大化栈分配
- 权衡取舍:AOT牺牲灵活性换取启动速度
💡 专家技巧:
- 用
-XX:+DoEscapeAnalysis
强制开启逃逸分析(默认已启用)- Spring Native项目已集成GraalVM支持
第三章 JVM未来展望:下一代Java技术革命
3.1 Project Loom(虚拟线程)
传统线程 vs 虚拟线程:
维度 | 平台线程(Thread) | 虚拟线程(Virtual Thread) |
---|---|---|
资源开销 | 1:1映射内核线程(MB级) | M:N调度(KB级) |
创建数量 | 千级(受限于OS) | 百万级(JVM管理) |
切换成本 | 高(系统调用) | 低(用户态调度) |
代码对比:
// 传统线程(每个请求一个线程)
ExecutorService executor = Executors.newCachedThreadPool(); // Loom虚拟线程(纤程)
ExecutorService virtualExecutor = Executors.newVirtualThreadPerTaskExecutor();
性能测试(echo服务):
1万并发连接:
- 传统线程:内存占用1.2GB,创建失败率83%
- 虚拟线程:内存占用45MB,100%成功
3.2 Valhalla(值类型)
现状问题:
- 对象头开销大(16字节)
- 数组存储不连续(缓存命中率低)
值类型特性:
// 声明值类型(预览语法)
value record Point(int x, int y) {// 无对象头,直接存储int字段
}// 内存对比
Point p = new Point(1, 2);
// 传统对象:16(头) + 4(x) + 4(y) + 4(对齐) = 28字节
// 值类型:4(x) + 4(y) = 8字节
适用场景:
✔ 数学计算(复数/矩阵)
✔ 高频创建的DTO
✔ 替代AtomicInteger
等包装类
3.3 云原生时代的JVM优化
三大变革方向:
-
瞬时启动:
- GraalVM Native Image(Spring Boot启动<50ms)
- AppCDS(Class Data Sharing)减少加载时间
-
内存精简:
- 压缩对象头(
-XX:+UseCompactObjectHeaders
) - 弹性元空间(按需分配)
- 压缩对象头(
-
容器适配:
-XX:+UseContainerSupport
自动检测内存限制- CRaC(Checkpoint/Restore)快速扩容
K8s最佳实践:
# 容器资源限制
resources:limits:memory: "512Mi"cpu: "2"requests:memory: "256Mi"cpu: "1"
🚀 技术演进时间线
📌 开发者应对策略
-
技能升级:
- 学习
虚拟线程
的结构化并发
编程模型 - 掌握GraalVM Native Image打包
- 学习
-
架构改造:
- 将IO密集型服务迁移到虚拟线程
- 用值类型重构高频创建的对象
-
云原生适配:
- 在K8s中设置
-XX:MaxRAMPercentage=70%
- 启用
-XX:+UseSerialGC
优化Serverless冷启动
- 在K8s中设置
💡 专家建议:
- 虚拟线程不是万能的,计算密集型任务仍需线程池
- 值类型与现有代码兼容,无需重写
🎉结尾
Java的未来不是“更好的Java”,而是“更现代化的运行时平台”! 🚀
学完本系列后,你将能够:
- 🛠️ 用
happens-before
规则写出无锁高性能代码 - ⚡ 通过JIT调优让热点方法执行速度提升5倍
- 🌍 在云原生环境中部署秒级启动的Java应用
记住:技术演进的速度远超想象,但底层原理永恒不变。
PS:如果你在学习过程中遇到问题,别慌!欢迎在评论区留言,我会尽力帮你解决!😄
相关文章:
JVM高阶架构:并发模型×黑科技×未来趋势解析
🚀前言 “你是否还在为synchronized锁竞争头疼?是否好奇ZGC如何实现亚毫秒停顿?Java的未来将走向何方? 本文将带你深入JVM最硬核的三大领域: 并发模型:揭秘happens-before如何保证多线程安全(…...
Java的JDK、JRE、JVM关系与作用
Java的JDK、JRE、JVM关系与作用 java中的JDK、JRE和JVM是三个核心组件,各自承担不同角色,且存在层级依赖关系 1. JVM(Java Virtual Machine,Java虚拟机) 是什么: JVM是虚拟的计算机,能够执行…...
XMLHttpRequest vs Fetch API:一场跨越时代的“浏览器宫斗剧“
## 序幕:两个API的"身世之谜" 在Web开发的江湖里,XMLHttpRequest(简称XHR)就像一位身经百战的老将,而Fetch API则是手持光剑的绝地武士。让我们先来段"DNA检测": - **XHR(…...
Windows Anaconda使用Sentence-BERT获取句子向量
1、安装Anaconda: Anaconda是一个流行的Python数据科学平台,它包含了许多科学计算和数据分析的库,包括transformers和sentence_transformers。虽然不是必需的,但使用Anaconda可以简化环境管理和依赖安装的过程。 可以从Anaconda官…...
【Java设计模式】第5章 工厂方法模式讲解
5. 工厂方法模式 5.1 工厂方法讲解 定义:定义一个创建对象的接口,由子类决定实例化的类,将对象创建延迟到子类。适用场景: 创建对象需要大量重复代码。客户端不依赖具体产品的创建细节。优点: 符合开闭原则,新增产品只需扩展子类。客户端仅依赖抽象接口,不依赖具体实现…...
结合 Less + CSS 变量实现切换主题
一开始的思路是通过 Less 变量作用范围 来切换 light 和 dark 主题,但 Less 本身不会动态监听类名变化,所以直接这样写是 不可行的,因为 Less 是 预处理语言,它在编译阶段就确定了 color 的值,而不是在运行时动态切换。…...
数据分析之python处理常用复杂转置数据
前段时间根据需求配合ai写了个转置excel代码,挺好用的,而且可以选择excel,不局限于excel存在哪个地方,都可以转置,但是转置后的excel记得要先创建放在转置文件的目录下。 原本的数据长这样 转置后则可以变为这样&…...
未来杭州:科技与诗意的时空交响曲
故事背景 故事发生在中国浙江杭州的未来科技时代,通过六个充满未来感的场景展现传统文明与尖端科技的完美融合。全篇无人物角色,专注于构建兼具东方美学与赛博朋克风格的沉浸式景观。 故事内容 从晨雾中浮现全息诗句的西湖,到吞吐智能包裹的运…...
彩虹表是什么
彩虹表是一种用于破解加密散列函数的预计算表,主要用于破解密码的哈希值。以下是关于加密文件与彩虹表的相关信息: 彩虹表的原理 • 时空折中:彩虹表基于时空折中理论,通过预先计算并存储大量可能的密码及其哈希值,减少…...
[BreachCTF 2025]
周末的这个居然一个密码都不会,作了4个pwn,给原码看着真方便 FSWn3d #define _GNU_SOURCE #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/mman.h> #include <unistd.h>char buffer[152…...
行业案例 | 印度航空借助 Azure AI,提升智能航空体验
自2022年塔塔集团(Tata Group)接管以来,印度航空启动了全面现代化升级,不仅豪掷470架新飞机订单以重塑“以人为本”的品牌形象,更将数字化作为核心战略——将所有工作负载(包括全新官网)从本地数…...
【Java设计模式】第7章 建造者模式讲解
7-1 建造者模式讲解 1. 定义与类型 定义: 将复杂对象的构建与表示分离,使相同构建过程可创建不同表示。类型: 创建型模式。通俗解释: 分步构建含多组件的对象,流程固定但顺序灵活(如做菜时放盐顺序可变)。2. 适用场景 对象内部结构复杂(多属性或多步骤)。需将对象创建与…...
鸿蒙ArkTS实战:从零打造智能表达式计算器(附状态管理+路由传参核心实现)
还在为组件状态混乱、页面跳转丢参数而头疼? 这篇博客将揭秘如何用鸿蒙ArkTS打造一个漂亮美观的智能计算器: ✅ 输入完整表达式,秒出结果——字符串切割简单计算 ✅ 状态管理黑科技——Provide/Consume 实现跨组件实时响应 ✅ 路由传参实战—…...
虚拟机上安装openEuler和openGauss数据库
1.虚拟机版本选择VM 16 PRO 2.openEuler版本选择openEuler-22.03-LTS-SP4-x86_64 下载地址:https://mirrors.aliyun.com/openeuler/openEuler-22.03-LTS-SP4/ISO/x86_64/openEuler-22.03-LTS-SP4-x86_64-dvd.iso 3.虚拟机安装openEuler过程: 4.安装ope…...
深入解析 Jenkins Agent 的 .jnlp 启动文件
🧩 深入解析 Jenkins Agent 的 .jnlp 启动文件 在 Jenkins 中,通过 JNLP(Java Network Launch Protocol)方式连接 Agent 是一种常见且灵活的方式。你可能曾见过类似这样的命令: java -jar agent.jar -jnlpUrl file:/…...
在 macOS 上连接 PostgreSQL 数据库(pgAdmin、DBeaver)
在 macOS 上连接 PostgreSQL 数据库 pgAdmin 官方提供的图形化管理工具,支持 macOS。 下载地址:https://www.pgadmin.org/ pgAdmin 4 是对 pgAdmin 的完全重写,使用 Python、ReactJs 和 Javascript 构建。一个用 Electron 编写的桌面运行时…...
HarmonyOS Next~鸿蒙系统原生流畅性创新解析:预加载技术与全栈优化的革命性突破
鸿蒙系统原生流畅性创新解析:预加载技术与全栈优化的革命性突破 一级类目:鸿蒙创新特性 | 二级类目:原生流畅 鸿蒙系统(HarmonyOS)自诞生以来,始终以“天生流畅”为核心目标,其原生流畅性不仅…...
【图像处理】:opencv实现模糊图像处理和对比度增强
opencv实现模糊图像处理和对比度增强 模糊图像处理**方法 1:Wiener 反卷积(已知模糊核)****方法 2:非锐化掩码(Unsharp Masking)****方法 3:拉普拉斯锐化(Laplacian Sharpening&…...
@SentinelResource注解,sentinel限流,熔断自定义返回 ,配合nacos完成持久化
sentinel熔断和限流自定义返回 如果发生熔断或者限流,会返回500错误页面,希望返回自定义兜底数据,这时候可使用SentinelResource实现 操作 1、添加统一返回结果类 ( 在做自定义处理的时候, 要求方法的声明必须一致) import lombok.Data;…...
AJAX简介
一、AJAX 是什么? AJAX(Asynchronous JavaScript and XML)是一种异步网络请求技术,它的核心是允许网页在不刷新整个页面的情况下,向服务器发送或接收数据,并动态更新页面内容。简单来说,AJAX 让…...
平台算法暗战:ebay欧洲站搜索词长度同比缩短2.3字符的应对策略
随着电商平台算法的快速更迭,卖家迎来了新的挑战。根据最近数据显示,eBay欧洲站搜索关键词的平均长度同比缩短了2.3个字符。这看似细微的变化,实则在搜索曝光、排名权重、流量分发等多方面带来实质性影响。 那么,这次「搜索词缩水…...
记录一次家里宽带 被修改带宽维权的事情
去年8月份发现家里电信宽带被限制带宽 原本上行300m被限制成40m 并且没有任何通知和短信 打10000号要求上门测速 拍下测速结果留作证据 然后等他们处理的同时 开始给我反馈是pcdn 然后说是工信部统一下调带宽 投诉12345 12300 不过这些投诉其实并不会给他们造成什么压…...
刀客doc:亚马逊把Netflix的广告价格打下来了
01 要说在美国广告市场里,未被巨头垄断且最为活跃的板块,应该就是流媒体了。 根据群邑智库的数据,2025年CTV广告将以20%的增速,冲刺460亿美元的市场规模。到2029年,全球流媒体电视的广告收入将占电视总收入的37.5%。…...
【文献阅读】NVILA: Efficient Frontier Visual Language Models
发表于2025年3月6日 英伟达团队 摘要 近年来,视觉语言模型(VLMs)在准确性方面取得了显著进展。然而,其效率却较少受到关注。本文介绍了NVILA,这是一系列旨在优化效率和准确性的开源视觉语言模型。在VILA的基础上&am…...
驱动-创建设备节点
字符设备相关的知识面:已经了解了 申请设备号、注册字符设备。 已经将字符设备添加进入内核了,那么如何使用这个字符设备呢? Linux 里面一切皆文件,对内核中的字符设备进行文件操作如打开、关闭、读、写等,但是并不支持…...
Vue知识点(5)-- 动画
CSS 动画是 Vue3 中实现组件动画效果的高效方式,主要通过 CSS transitions 和 keyframes 动画 CSS Keyframes(关键帧动画) 用来创建复杂的动画序列,可以精确控制动画的各个阶段。 核心语法: keyframes animationNa…...
基于AT89C52单片机的植物浇水与智能空气土壤环境监测报警系统
点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/90579535?spm1001.2014.3001.5503 功能介绍: 1、功能:液晶器显示检测到的土壤湿度与空气温度与光照强度;温度和光照大于设置的…...
指针进阶( 上 )
内容大纲 一.字符指针 二.指针数组 三.数组指针 四. 数组传参和指针传参 引言 指针是什么呢?指针是用来干什么的呢?指针的大小是多少呢?指针的大小具有什么属性呢? 解答:指针是个变量,用来存放变量地…...
java设计模式-外观模式
外观模式(facade) 基本介绍 1、外观模式也叫过程模式,外观模式为子系统中的一组接口提供一个一致的界面,次模式定义一个高层接口,这个接口是的这一子系统更加容易使用。 2、外观模式通过定义一个一直的接口,用以屏蔽内部子系统的细节&#x…...
selenium元素获取
from selenium import webdriver from selenium.webdriver.common.by import Bydriver webdriver.Chrome()driver.maximize_window()#最大化窗口 #隐式等待 driver.implicitly_wait(10)#打开网页 driver.get("https://www.zhipin.com/beijing/?kacity-sites-101010100&q…...
23种设计模式-行为型模式-访问者
文章目录 简介场景解决完整代码核心实现 总结 简介 访问者是一种行为设计模式,它能把算法跟他所作用的对象隔离开来。 场景 假如你的团队开发了一款能够使用图像里地理信息的应用程序。图像中的每个节点既能代表复杂实体(例如一座城市)&am…...
springMVC-拦截器详解
拦截器 概述 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。 过滤器与拦截器的区别:拦截器是AOP思想的具体应用。 过滤器 servlet规范中的一部分,任何ja…...
centos练习docker<基础>
这半喇月发生了很多事,很无谓很闹心,今天重拾起自己,做做功课写写字 文章目录 一、准备二、实践2.1 安装docker2.2docker镜像操作2.2.1 下载镜像等基本操作2.2.2 启动容器等基本操作2.2.3 修改页面2.2.4 保存镜像2.2.5 分享社区 总结 一、准…...
GPT-5、o3和o4-mini即将到来
原计划有所变更: 关于我们应有何期待的一些零散想法。 深度研究(Deep Research)确实强大但成本高昂且速度较慢(当前使用o3模型)。即将推出的o4-mini在性能上可能与o3相近,但将突破这些限制,让全球用户——甚至免费用户(尽管会有速率限制)——都能用上世界顶级AI研究助…...
EchoMimic 音频驱动照片生成视频部署测试
环境:Windows 11 NVIDIA RTX 3070 Laptop 16GB 我配置了阿里云的镜像,要实现一样的效果,你也可以在每一行的命令后加 -i https://mirrors.aliyun.com/pypi/simple/ 如: pip install package_name -i https://mirrors.aliyun.…...
React 和 JSX 中,这些符号 (=>, <, ? :)的用法
在 React 和 JSX 中,这些符号 (>, <, ? :) 都是 JavaScript 的语法特性,但它们在 JSX 中有特殊的用法和规则。下面我会详细解释每个符号的用途、语法规则以及在 React/JSX 中的具体应用。 1. 箭头函数 > (Arrow Function) 基本语法࿱…...
mindie1.0新特性及调试问题总结
说明 最近在ascend 310P3上使用mindie 1.0部署模型,跟我以前使用的mindie 1.0_rc2比,有很多新的特性和变化,导致部署出现了不少问题。这里罗列下我的发现,希望对其他人有用。 特性1:需要显式配置share_memory 报错信…...
【Axure原型案例】悦购APP产品原型设计
一、项目背景 在时尚潮流蓬勃发展的当下,潮流服装市场潜力巨大。悦购APP作为一款专注于潮流服装的商城APP,旨在为用户提供丰富多样的潮流服装选择,打造便捷、时尚的购物体验。本次使用Axure进行产品原型设计,旨在将产品理念和功能…...
React 列表渲染
你可能经常需要通过 JavaScript 的数组方法 来操作数组中的数据,从而将一个数据集渲染成多个相似的组件。在这篇文章中,你将学会如何在 React 中使用 filter() 筛选需要渲染的组件和使用 map() 把数组转换成组件数组。 1.如何通过 JavaScript 的 map() 方…...
《深度解析LightGBM与MySQL数据集成:高效机器学习的新范式》
在机器学习工程实践中,数据与模型的高效交互一直是制约算法性能发挥的关键瓶颈。LightGBM作为梯度提升决策树框架的杰出代表,其与关系型数据库MySQL的深度集成能力,为数据科学家提供了从原始数据到预测结果的完整解决方案。这种集成不是简单的…...
使用 node.js 和 MongoDB 编写一个简单的增删改接口 demo
文章目录 前言一、环境准备二、项目结构三、环境变量四、连接数据库3.1. connect.js 文件 五、定义数据模型5.1. BannerModel.js 文件 六、实现 server 接口6.1. server.js 文件 七、服务文件7.1. app.js 文件 八、感谢 前言 Mongoose 是一个在 Node.js 环境中操作 MongoDB 数据…...
React-06React中refs属性(字符串refs,回调形式,React.createRef() )
1.React中refs属性 绑定到render输出的任何组件上,通过this.ref.绑定名直接操作DOM元素或获取子组件的实例。 2.绑定refs实例 2.1 字符串refs(已经过时参考官网API) 字符串(string)的ref存在一定的效率问题 <input refinput1 type"text" placehole…...
如何在 Windows 系统上安装 n8n:两种方法详解
如何在 Windows 系统上安装 n8n:两种方法详解 摘要 本文详细介绍了在 Windows 系统上安装 n8n 的两种方法:直接安装和 Docker 部署。直接安装适合初学者,通过 Node.js 和 npm 快速完成;Docker 部署适合需要更高灵活性和可移植性…...
LETTERS(信息学奥赛一本通-1212)
【题目描述】 给出一个rowcol的大写字母矩阵,一开始的位置为左上角,你可以向上下左右四个方向移动,并且不能移向曾经经过的字母。问最多可以经过几个字母。 【输入】 第一行,输入字母矩阵行数R和列数S,1≤R,S≤20。 接…...
【kind管理脚本-3】脚本函数说明文档 —— 便捷使用 kind 创建、删除、管理集群脚本
下面是一份详细的说明文档,介绍该脚本的功能、用法及各部分的含义,供您参考和使用: Kind 集群管理脚本说明文档 此脚本主要用于管理 Kind(Kubernetes IN Docker)集群,提供创建、删除、导出 kubeconfig、加…...
【kind管理脚本-1】便捷使用 kind 创建、删除、管理集群脚本
目录结构 . ├── cluster-demo-setting │ ├── 3node-demo.yaml │ └── ingress-cluster-demo.yaml └── kind-tool.sh简单使用 # 进入防止 kind-tool.sh 的目录 $ cd kt-dir/ # 用 alias 给个别名,更便于使用 $ alias kt"./kind-tool.sh"…...
Python-Django+vue仓库管理系统功能说明
❥(^_-) 上千个精美定制模板,各类成品Java、Python、PHP、Android毕设项目,欢迎咨询。 ❥(^_-) 程序开发、技术解答、代码讲解、文档,💖文末获取源码+数据库+文档💖 💖软件下载 | 实战案例 💖文章底部二维码,可以联系获取软件下载链接,及项目演示视频。 本项目…...
蓝桥备赛指南(14):树的直径与重心
树的直径 什么是树的直径?树的直径是树上最长的一条链,当然这条链并不唯一,所以一棵树可能有多条直径。直径由两个顶点u、v来决定,若由一条直径(u,v),则满足一下性质: 1)u、v的度数…...
Java RPC 框架是什么
Java RPC 框架是什么 Java RPC 框架 是用于在分布式系统中实现远程过程调用(Remote Procedure Call,RPC)的工具集。RPC 是一种通信协议,它允许程序调用位于远程服务器上的函数或方法,就像调用本地函数一样透明。RPC 框…...
MySQL 查询重写怎样把复杂查询变简单,让查询提高一个“速”!
目录 一MySQL 查询重写基础概念 什么是查询重写 为什么需要查询重写 二MySQL 查询重写的工作原理 查询解析阶段 重写规则应用阶段 生成执行计划阶段 查询重写流程图 三MySQL 查询重写的实现方式 使用 MySQL 内置的查询优化器 自定义查询重写插件 查询重写介绍图 四…...