JVM 生产环境问题定位与解决实战(八):实战篇——正则表达式回溯引发的CPU 100%

在这里插入图片描述

本文已收录于《JVM生产环境问题定位与解决实战》专栏,完整系列见文末目录

1. 引言

在上一篇文章中,我们深入剖析了OSSClient泄漏引发的FullGC风暴全链路排查过程。本文聚焦另一个经典线上问题——正则表达式回溯导致的CPU 100%。在Java应用中,正则表达式使用普遍,但设计缺陷可能引发灾难性回溯,导致CPU使用率飙升至100%。本文将介绍如何使用Arthas快速定位和解决此类性能问题。

案例二:正则表达式回溯引发的CPU 100%

2. 问题现象

某日线上系统突现异常:

  • 系统响应缓慢:接口响应时间显著延长,部分请求处理超时
  • CPU资源耗尽:服务器CPU使用率持续维持在100%,Load值飙升
  • 线程阻塞:部分线程长时间处于RUNNABLE状态,但无死锁迹象
  • GC无异常:GC无明显增加,堆内存无泄漏

提示:线上问题由XSS过滤器的正则表达式引发,本文使用测试代码模拟相同场景

3. 排查过程

3.1 系统资源监控

通过top命令快速锁定异常进程:

top - 16:34:15 up 1 day,  8:46,  3 users,  load average: 0.40, 0.83, 0.78
PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                            
16114 root      20   0 3529992 398948  13900 S 176.2 10.3   1:38.78 java

关键发现:

  • Java进程(PID=16114)CPU占用率接近100%,问题指向应用程序内部。
3.2 Arthas 接入

通过Arthas快速连接目标JVM,选择 PID 为 16114 的进程,进入 Arthas 命令行。

[root@k8s-node1 ~]# java -jar arthas-boot.jar
[INFO] JAVA_HOME: /opt/jdk1.8.0_371/jre
[INFO] arthas-boot version: 4.0.5
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 16114 boot-demo.jar
1
[INFO] arthas home: /root/.arthas/lib/4.0.5/arthas
[INFO] Try to attach process 16114
[INFO] Attach process 16114 success.
[INFO] arthas-client connect 127.0.0.1 3658,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.                           /  O  \ |  .--. ''--.  .--'|  '--'  | /  O  \ '   .-'                          
|  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.                          
|  | |  ||  |\  \    |  |   |  |  |  ||  | |  |.-'    |                         
`--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'                          wiki        https://arthas.aliyun.com/doc                                       
tutorials   https://arthas.aliyun.com/doc/arthas-tutorials.html                 
version     4.0.5                                                               
main_class  boot-demo.jar                                                       
pid         16114                                                               
start_time  2025-04-27 15:59:37.340                                             
currnt_time 2025-04-27 16:01:46.218  
3.3 初步分析(dashboard)

运行 dashboard 命令,每 2 秒刷新线程和资源状态:

# 输入命令
dashboard -i 2000  # 每2秒刷新一次

在这里插入图片描述
输出显示:

  • ID25、26线程 CPU 占用极高,持续处于 RUNNABLE 状态10分钟之久。
  • 无阻塞或等待迹象,确认问题与高计算任务相关。
3.4 高 CPU 线程排查(thread -n 3)

列出 CPU 占用最高的 3 个线程:

[arthas@15488]$  thread -n 3
"http-nio-8888-exec-8" Id=25 cpuUsage=96.38% deltaTime=198ms time=41076ms RUNNABLEat java.util.regex.Pattern$CharProperty.match(Pattern.java:3790)at java.util.regex.Pattern$Curly.match(Pattern.java:4241)at java.util.regex.Pattern$GroupHead.match(Pattern.java:4672)at java.util.regex.Pattern$Loop.match(Pattern.java:4799)at java.util.regex.Pattern$GroupTail.match(Pattern.java:4731)at java.util.regex.Pattern$Curly.match0(Pattern.java:4286)at java.util.regex.Pattern$Curly.match(Pattern.java:4248)at java.util.regex.Pattern$GroupHead.match(Pattern.java:4672)at java.util.regex.Pattern$Loop.match(Pattern.java:4799)at java.util.regex.Pattern$GroupTail.match(Pattern.java:4731)at java.util.regex.Pattern$Curly.match0(Pattern.java:4286)##### 省略部分日志 #####at java.util.regex.Pattern$Curly.match(Pattern.java:4248)at java.util.regex.Pattern$GroupHead.match(Pattern.java:4672)at java.util.regex.Pattern$Slice.match(Pattern.java:3986)at java.util.regex.Pattern$Begin.match(Pattern.java:3539)at java.util.regex.Matcher.match(Matcher.java:1270)at java.util.regex.Matcher.matches(Matcher.java:604)at java.util.regex.Pattern.matches(Pattern.java:1135)at java.lang.String.matches(String.java:2121)at com.controller.TestController.isValid(TestController.java:522)at com.controller.TestController.testReg3(TestController.java:503)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)"http-nio-8888-exec-9" Id=26 cpuUsage=94.69% deltaTime=194ms time=34853ms RUNNABLEat java.util.regex.Pattern$CharProperty.match(Pattern.java:3790)at java.util.regex.Pattern$Curly.match(Pattern.java:4241)at java.util.regex.Pattern$GroupHead.match(Pattern.java:4672)at java.util.regex.Pattern$Loop.match(Pattern.java:4799)at java.util.regex.Pattern$GroupTail.match(Pattern.java:4731)at java.util.regex.Pattern$Curly.match0(Pattern.java:4286)at java.util.regex.Pattern$Curly.match(Pattern.java:4248)at java.util.regex.Pattern$GroupHead.match(Pattern.java:4672)at java.util.regex.Pattern$Loop.match(Pattern.java:4799)at java.util.regex.Pattern$GroupTail.match(Pattern.java:4731)at java.util.regex.Pattern$Curly.match0(Pattern.java:4286)at java.util.regex.Pattern$Curly.match(Pattern.java:4248)at java.util.regex.Pattern$GroupHead.match(Pattern.java:4672)##### 省略部分日志 #####at java.util.regex.Matcher.match(Matcher.java:1270)at java.util.regex.Matcher.matches(Matcher.java:604)at java.util.regex.Pattern.matches(Pattern.java:1135)at java.lang.String.matches(String.java:2121)at com.controller.TestController.isValid(TestController.java:522)at com.controller.TestController.testReg3(TestController.java:503)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)

关键信息:

  • ID25、26线程的堆栈指向 java.util.regex.Pattern 的匹配方法。
  • 调用源自 com.controller.TestController.isValid(TestController.java:522),疑似正则匹配问题。

在这里插入图片描述

3.5 输入参数分析(watch)

使用 watch 命令查看 isValid 方法的入参,确认触发 CPU 飙升的输入:

watch com.controller.TestController isValid '{params,returnObj,throwExp}' -n 5 -x 3

输出示例:

ts=2025-04-27 16:10:32.522; [cost=1.171926ms] result=@ArrayList[@Object[][@String[http://www.example.com/aaaaaaaaaab],],@Boolean[false],null,
]

发现:

  • 输入字符串如 http://www.example.com/aaaaaaaaaab 较长,且不完全匹配正则。
  • 长输入可能触发正则引擎的回溯。

使用 trace 进一步分析方法耗时:

[arthas@16114]$ trace com.controller.TestController isValid -n 5 --skipJDKMethod false
Press Q or Ctrl+C to abort.
Affect(class count: 1, method count: 1) cost in 186 ms, listenerId: 2
`---ts=2025-04-27 16:11:18.432;thread_name=http-nio-8888-exec-4;id=21;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@16d04d3d`---[0.76795ms] com.controller.TestController:isValid()`---[82.98% 0.637233ms] java.lang.String:matches() #522`---ts=2025-04-27 16:11:25.781;thread_name=http-nio-8888-exec-2;id=19;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@16d04d3d`---ts=2025-04-27 16:11:26.577;thread_name=http-nio-8888-exec-5;id=22;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@16d04d3d`---[2318.506752ms] com.controller.TestController:isValid()`---[100.00% 2318.4676ms] java.lang.String:matches() #522

结论:长输入(如 http://www.example.com/aaaaaaaaaab)导致正则匹配耗时显著增加,触发回溯。

4.正则表达式回溯详解

正则表达式引擎主要分为 DFA(确定型有穷自动机)和 NFA(非确定型有穷自动机)。Java 使用 NFA 引擎,匹配时通过回溯(Backtracking)尝试不同路径。回溯在匹配失败时会导致引擎反复尝试,时间复杂度可能从 O(n) 恶化到 O(2^n),引发 CPU 100% 的问题,称为“灾难性回溯”。

以下是DFA(确定型有穷自动机)和NFA(非确定型有穷自动机)的对比表格:

特性DFA (Deterministic Finite Automaton)NFA (Nondeterministic Finite Automaton)
状态转移每个输入符号对应唯一确定的状态转移同一输入符号可能对应多个状态转移(包括ε空转移)
回溯机制无回溯(线性时间匹配)可能触发回溯(最坏情况下指数级时间复杂度)
实现复杂度实现简单,但状态数可能较多实现复杂,但状态数通常较少
匹配速度稳定高效(O(n))通常较慢(最坏情况O(2^n))
内存消耗较高(需预计算所有可能转移)较低(动态计算转移路径)
正则引擎代表grep、awk等传统Unix工具Java(java.util.regex)、Perl、Python等现代语言正则引擎
构造难度直接构造较困难更容易从正则表达式构造
ε-转移(空转移)不允许允许
匹配方式文本主导(每一步只关注当前字符)正则主导(尝试所有可能的路径)
典型应用场景需要高性能匹配的场景(如网络协议解析)需要复杂模式匹配的场景(如文本处理)
例子匹配**a*b**的DFA只有2个状态匹配**a*b**的NFA可能有多个转移路径
4.1 回溯机制

Java 的正则引擎基于 NFA(不确定型有穷自动机),支持回溯以尝试不同匹配路径。含嵌套量词的模式在匹配失败时,可能导致指数级的路径尝试。例如:
当你写一个正则,比如:

(a+)+

去匹配一个字符串 "aaaaac" 时,正则引擎会:

  1. 首先尝试把整个 "aaaaac" 都匹配到内层的 a+
  2. 然后整个内层 a+ 被匹配为一组,外层再试图重复一次;
  3. 但由于最后有个 "c",无法匹配;
  4. 引擎就开始“回溯”——尝试将内层 a+ 分得更短一点(比如只匹配一半),再看外层能否继续匹配下去;
  5. 如果一直失败,它就会继续尝试所有可能的组合。
  6. 匹配 aaaaac 时,引擎会尝试所有可能的 a 分配组合(如 a/aaa、aa/aa、aaaa/ 等),导致时间复杂度从 O(n) 恶化到 O(2^n)。

这就导致大量的组合尝试,尤其在输入比较长、而正则又含有嵌套的可重复匹配(比如 (a+)+)时,回溯的路径会呈指数级增长。

4.2 CPU 飙升原因

因为回溯次数非常多,正则引擎会尝试各种可能的组合路径,直到找到匹配,或者穷尽所有路径确认不匹配。

  • 对某些输入,回溯路径可能达到 数百万甚至数十亿次
  • 每次尝试都是一次函数调用、状态切换,占用 CPU;
  • 某些构造甚至可以导致拒绝服务攻击(ReDoS):通过一个恶意的长字符串,拖垮服务器。
4.3 典型危险模式

易引发回溯的正则示例:

  • (a+)+:嵌套贪婪量词。
  • (.+)*:模糊匹配,路径分配多样。
  • ((a|aa)+):多分支嵌套。

5. 问题分析与优化

5.1 原始正则问题分析

原始正则:

^http://www\.([a-z0-9\-]+)\.com/(.+)*(.+)*.html$

问题点:

  1. 嵌套量词 (.+)*:模糊匹配,引发大量回溯。
  2. 双重 (.+)*:组合数随输入长度指数增长。
  3. 冗余设计:两个捕获组功能重叠。
5.2 回溯触发场景:
  • 不匹配输入:如 http://www.example.com/aaa…aaa(缺少 .html),引擎会:
    1. 让 (.+)* 捕获所有 aaa…aaa。
    2. 发现末尾不匹配 .html,回溯,尝试不同子序列分配。
    3. 对于长输入(例如 1000 个 a),回溯次数可能高达 2^n 级别。
  • 部分匹配输入:如 http://www.example.com/aaa%25,% 不匹配 .html 的 .,但引擎仍会回溯,尝试调整 (.+)* 的分配。
  • 长输入:如 http://www.example.com/ + 10000 个 a,回溯路径极多,可能导致程序卡死。
5.2 正则优化方案

优化后:

^http://www\.([a-z0-9\-]+)\.com/([a-zA-Z0-9_/]+)\.html$

改进措施:

  1. 替换模糊匹配:用 [a-zA-Z0-9_/]+ 限制字符集。
  2. 简化结构:移除多余捕获组。
  3. 强制非空:用 + 替代 *。
5.3 优化效果对比
  • 性能:优化后匹配时间 <1ms,原始正则耗时数秒。
  • 功能:仍支持如 http://www.example.com/path.html。
  • 安全性:避免长输入引发的性能问题。

6. 进一步优化建议

  1. 避免嵌套的可重复匹配,比如不要用 (a+)+

  2. 使用懒惰匹配+?*?),限制贪婪;

  3. 更严格的路径字符集

    • 如果路径只允许小写字母和数字:([a-z0-9/]+)。
    • 如果支持更多字符(如连字符或点号):([a-zA-Z0-9_/.-]+)。
  4. 路径长度限制

    • 添加量词限制,如 ([a-zA-Z0-9_/]{1,100}),限定路径长度 1-100 字符。
    • 防止超长路径影响性能。
  5. 支持其他协议或域名

    • 扩展前缀为 ^(http|https)😕/([a-z0-9-]+).com/,支持 https 或其他域名。
    • 示例:^(http|https)😕/([a-z0-9-]+).com/([a-zA-Z0-9_/]+).html$
  6. 防御性编程

    • 输入预处理机制

      public boolean isValidUrl(String url) {
      // 长度校验前置if(url.length() > 1024) return false;// 关键后缀快速判断if(!url.endsWith(".html")) return false;// 执行正则匹配return url.matches(optimizedRegex);
      }
      
    • 正则编译缓存

      private static final Pattern URL_PATTERN = Pattern.compile("^http://www\\.([a-z0-9-]+)\\.com/([a-zA-Z0-9_/-]+)\\.html$");public boolean isValidUrl(String url) {return URL_PATTERN.matcher(url).matches();
      }
      
  7. 测试和分析:对关键正则表达式进行性能测试,确保不会触发灾难性回溯。

  8. 监控告警配置

    • 方法耗时监控:对isValidUrl方法设置500ms超时阈值
    • 线程堆栈监控:发现大量线程卡在java.util.regex时触发告警
      使用工具(如regex101.com)分析正则表达式的回溯行为。

附录:系列目录

  1. JVM生产环境问题定位与解决实战(一):掌握jps、jmap、jstat、jstack、jcmd等基础工具
  2. JVM生产环境问题定位与解决实战(二):JConsole、VisualVM到MAT的高级应用
  3. JVM生产环境问题定位与解决实战(三):揭秘Java飞行记录器(JFR)的强大功能
  4. JVM生产环境问题定位与解决实战(四):使用JMC进行JFR性能分析指南
  5. JVM生产环境问题定位与解决实战(五):Arthas——不可错过的故障诊断利器
  6. JVM生产环境问题定位与解决实战(六):总结篇——问题定位思路与工具选择策略
  7. JVM 生产环境问题定位与解决实战(七):实战篇——OSSClient泄漏引发的FullGC风暴
  8. ➡️ 当前:JVM 生产环境问题定位与解决实战(八):实战篇——正则表达式回溯导致的 CPU 100%

🔥 下篇预告:《JVM 生产环境问题定位与解决实战(九):实战篇——JVM 内存区域分配不合理导致的频繁 Full GC》
🚀 关注作者,获取实时更新通知!有问题欢迎在评论区交流讨论~

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

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

相关文章

100天精通Python挑战总览 | 零基础到应用实战!

目录 ✨ 为什么发起100天挑战&#xff1f;✨整体学习路线规划第一阶段&#xff5c;基础篇&#xff08;第1天 - 第50天&#xff09;第二阶段&#xff5c;应用篇&#xff08;第51天 - 第100天&#xff09;Web开发篇爬虫篇数据分析篇AI入门篇 &#x1f3c6;为什么这么划分&#xf…

C++编译之(5)-cmake/CMakeLists.txt的编译使用教程

C++编译之(5)-cmake/CMakeLists.txt的编译使用教程 上一节,点这里 1、如何查看cmake的配置参数 那么如何查看当前配置的参数呢,我们可以使用-L参数 cmake .. -L # cmake .. -LAH完全使用命令行,则可以通过多次重复使用cmake … -DOPTION1=ON -D OPTION2=ON配置制定选项;并…

2025五一杯数学建模竞赛思路助攻预定

2025五一杯数学建模竞赛思路助攻预定&#xff08;思路内容见文末名片&#xff09; 一、概况 数学建模竞赛是一项模拟面对实际问题寻求解决方案的活动&#xff0c;是一次近似 于“真刀真枪”的创新探索性实践训练。在丰富并活跃学生课外生活活动的同 时&#xff0c;数学建模竞…

2025年绿色材料与制造技术国际学术会议(GMMT 2025)

重要信息 时间&#xff1a;2025年6月23-25日&#xff08;英国时间&#xff09; 地点&#xff1a;英国剑桥线下会场中国线上分会场 官网&#xff1a;www.icgmmt.com 部分 征稿主题 可生物降解材料垃圾和废物的资源化绿色涂料与涂层 生物基聚合物的合成与应用 自然纤维增强复…

鸿蒙NEXT开发正则工具类RegexUtil(ArkTs)

import { FormatUtil } from ./FormatUtil;/*** 正则工具类* author CSDN-鸿蒙布道师* since 2025/04/27*/ export class RegexUtil {/*** 英文字母、数字和下划线*/static readonly REG_GENERAL "^\\w$";/*** 数字*/static readonly REG_NUMBERS "^\\d$"…

Spring系列六:JdbcTemplate

JdbcTemplate &#x1f992;看一个实际需求&#x1f992;官方文档&#x1f992;基本介绍&#x1f992;使用实例&#x1f4d5;需求说明&#x1f4d5;代码演示 &#x1f992;看一个实际需求 实际需求: 如果程序员就希望使用spring框架来做项目, spring框架如何处理对数据库的操作…

来聊聊JVM中安全点的概念

文章目录 写在文章开头详解safepoint基本概念什么是安全点?为什么需要安全点JVM如何让线程跑到最近的安全点线程什么时候需要进入安全点JVM如何保证线程高效进入安全点如何设置安全点用一次GC解释基于安全点的STW实践-基于主线程休眠了解安全点的工作过程代码示例基于日志印证…

搭建 Spark YARN 模式集群指南

在大数据处理领域&#xff0c;Apache Spark 凭借其卓越的性能和易用性广受青睐。而 YARN&#xff08;Yet Another Resource Negotiator&#xff09;作为 Hadoop 的资源管理框架&#xff0c;能高效管理集群资源。将 Spark 与 YARN 结合&#xff0c;以 YARN 模式搭建集群&#xf…

WPF之Label控件详解

文章目录 1. 引言2. Label控件基础2.1 类继承结构2.2 Label类定义 3. Label控件的核心属性3.1 Content属性3.2 Target属性3.3 其他常用属性 4. 标签样式与模板自定义4.1 简单样式设置4.2 使用Style对象4.3 触发器使用4.4 使用ControlTemplate完全自定义 5. Label与表单控件交互…

一种改进的YOLOv11网络,用于无人机视角下的小目标检测

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 随着无人机&#xff08;UAV&#xff09;和计算机视觉技术的快速发展&#xff0c;从无人机视角进行目标检测已成为一个重要的研究领域。然而&#xff0c;无人机图像中目标像素占比极小、物体尺度变…

Adobe Lightroom Classic v14.3.0.8 一款专业的数字摄影后期处理软件

软件介绍 Adobe Lightroom Classic 2025中文激活版&#xff08;Adobe桌面照片编辑软件&#xff09;LRC2025&#xff08;LR2025本地离线版&#xff09;是一款桌面照片编辑器和相册管理软件的raw格式编辑软件&#xff0c;支持各种RAW图像相机配置&#xff0c;HDR全景照片&#x…

【Statsmodels和SciPy介绍与常用方法】

Statsmodels库介绍与常用方法 Statsmodels 是一个强大的 Python 库&#xff0c;专注于统计建模和数据分析&#xff0c;广泛应用于经济学、金融、生物统计等领域。它提供了丰富的统计模型、假设检验和数据探索工具&#xff0c;适合进行回归分析、时间序列分析等任务。本文将介绍…

【Rust通用集合类型】Rust向量Vector、String、HashMap原理解析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

SoapUi测试1——REST(WebAPi、Json协议/HTTP、Post通讯方式)接口测试

文章目录 1背景1.1接口测试工具SoapUi产生背景1.2常见接口类型1.3接口包含内容1.4请求格式 2软件使用3http、webservice、webapi如何测试3.1REST&#xff08;WebAPi、JSON/HTTP、POST&#xff09;3.2SOAP&#xff08;Webserver、XML/HTTP、POST&#xff09; 1背景 1.1接口测试…

Linux按键驱动测试

文章目录 一、设备节点添加 二、创建驱动文件代码 2.1 核心数据结构 2.2 按键值定义 2.3 关键函数实现 三、创建测试文件 四、测试 一、设备节点添加 首先在设备树文件中添加pinctrl以及在根目录下添加设备节点。如下&#xff1a; //创建按键输入的pinctrlpinctrl_key: keygrp…

5000元可以运行32B大模型的笔记本

5000元可以运行32B 大模型的笔记本 荣耀笔记本 X14 Plus 锐龙版 R7-8845HS -32G -1T 模型名称 模型大小 tokens/s qwq-32b-q4 19GB 2.4 Qwen2.5-Coder-14B- Q8 16GB 4 DeepSeek-R1-Distill-Qwen-7B-Q8 8GB 8.1 DeepSeek-R1-Distill-Llama-8B-Q4 5GB 11.7

arm设备树基础知识

文章目录 前言dts片段通用属性介绍地址大小中断phandlecompatible mmc节点介绍 前言 arm开发&#xff0c;早晚要了解设备树 dts片段 interrupt-parent <0x8005>; model "linux,dummy-virt"; #size-cells <0x02>; #address-cells <0x02>; co…

【C++ 核心知识点面试攻略:从基础到实战(上位机开发视角)】

一、命名空间&#xff08;Namespace&#xff09;相关问题 问题1&#xff1a;C引入命名空间的核心目的是什么&#xff1f;如何通过命名空间解决命名冲突&#xff1f; 答案&#xff1a; C引入命名空间的核心目的是 避免全局作用域中的命名冲突&#xff0c;通过将变量、函数、类…

线性代数与数据学习

The Functions of Deep Learning (essay from SIAM News, December 2018) Deep Learning and Neural Nets

phpstorm用php连接数据库报错

项目场景&#xff1a; phpstorm用php连接数据库 问题描述 用php使用mysql_connect 的时候报错了&#xff0c;没有这个函数 原因分析&#xff1a; php解释器问题&#xff0c;后来查资料得知mysql_connct只适用于php5.5以下解释器。一开始用的7&#xff0c;改成5.3以后还是报…