java怎么找bug?Arthas原理与实战指南
Arthas原理与实战指南
1. Arthas简介
Arthas是阿里巴巴开源的Java诊断工具,其名字取自《魔兽世界》的人物阿尔萨斯。它面向线上问题定位,被广泛应用于性能分析、定位问题、安全审计等场景。Arthas的核心价值在于它能够在不修改应用代码、不重启Java进程的情况下,实时动态地监控和分析运行中的Java程序。
Arthas支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的Tab自动补全功能。
2. 核心原理深度解析
2.1 Java Agent技术
Arthas基于Java Agent技术,Java Agent是JDK 1.5引入的一种能够在不修改Java源代码的情况下,动态修改Java字节码的技术。
Java Agent通过以下两种方式工作:
- 静态加载:通过JVM启动参数
-javaagent指定 - 动态加载:通过Attach API动态附加到运行中的JVM
Arthas采用了动态加载的方式,使其能够在Java应用运行过程中被加载。
2.2 Instrumentation API
Java的java.lang.instrument包提供了一套API,允许Java Agent程序修改已加载的类的字节码。Arthas利用这一API来实现类和方法的监控和分析。
关键接口和类:
Instrumentation:提供注册类文件转换器、获取所有已加载类等功能ClassFileTransformer:类文件转换器,用于修改类的字节码Agent:Agent程序的入口点,通过premain或agentmain方法启动
2.3 JVM Attach机制
Attach机制允许一个JVM进程连接到另一个JVM进程,实现进程间通信。Arthas使用该机制动态加载Agent到目标JVM中。
核心实现在com.sun.tools.attach包中,关键类有:
VirtualMachine:代表一个JVM进程VirtualMachineDescriptor:JVM进程的描述信息
2.4 ASM字节码操作
Arthas使用ASM库操作Java字节码,通过修改字节码来实现方法拦截、监控等功能。ASM是一个轻量级的字节码操作框架,能够动态生成和修改Java字节码。
字节码转换过程:
- 读取原始类字节码
- 使用ASM分析字节码结构
- 修改字节码(如添加方法入口/出口的监控代码)
- 返回修改后的字节码
2.5 命令处理引擎
Arthas采用命令行交互方式,内部实现了一套完整的命令处理引擎:
- 命令解析:将用户输入解析为命令对象
- 命令执行:根据命令执行相应操作
- 结果渲染:将执行结果格式化输出
3. 安装与启动详解
3.1 安装方式
方式一:使用arthas-boot(推荐)
# 下载启动脚本
curl -O https://arthas.aliyun.com/arthas-boot.jar# 启动
java -jar arthas-boot.jar
方式二:使用全量包
# 下载全量包
curl -O https://arthas.aliyun.com/arthas-packaging.jar# 解压
java -jar arthas-packaging.jar# 启动
cd arthas
./arthas.sh
方式三:使用as.sh
# 下载并安装
curl -L https://arthas.aliyun.com/install.sh | sh# 启动
./as.sh
3.2 启动选项详解
启动Arthas时,可以指定多种参数:
# 指定目标Java进程
java -jar arthas-boot.jar [PID]# 指定目标进程名称的关键字
java -jar arthas-boot.jar --select JAVA_HOME# 启动时禁用某些命令
java -jar arthas-boot.jar --exclude-commands=jvm,thread# 指定端口号
java -jar arthas-boot.jar --telnet-port 9998 --http-port 9999# 以批处理模式执行命令
java -jar arthas-boot.jar --command "thread" -c "thread" > output.txt
3.3 连接方式
Arthas提供多种连接方式:
-
本地命令行模式:
直接在启动终端操作 -
Telnet连接:
telnet 127.0.0.1 3658 -
WebSocket连接:
通过浏览器访问http://127.0.0.1:8563/ -
HTTP API:
curl http://127.0.0.1:8563/api
4. 核心功能与命令详解
4.1 JVM相关命令
dashboard - 系统实时数据面板
提供系统整体情况的实时数据,包括线程、内存、GC、运行环境等信息。
# 每5秒刷新一次
dashboard -i 5000# 只显示前10个线程
dashboard -n 10
输出示例:
ID NAME GROUP PRIORITY STATE %CPU DELTA_TIME TIME INTERRUPTED DAEMON
17 pool-2-thread-1 main 5 RUNNABLE 27 0.136 0:0.203 false false
21 pool-2-thread-5 main 5 RUNNABLE 26 0.132 0:0.096 false false
22 pool-2-thread-6 main 5 RUNNABLE 26 0.132 0:0.097 false false
......Memory used total max usage GC
heap 32M 155M 1820M 1.76% gc.ps_scavenge.count 118
ps_eden_space 14M 65M 672M 2.21% gc.ps_scavenge.time(ms) 1890
ps_survivor_space 4M 5M 5M 81.92% gc.ps_marksweep.count 5
ps_old_gen 12M 85M 1365M 0.91% gc.ps_marksweep.time(ms) 1140
jvm - JVM信息
# 显示JVM信息
jvm# 同时显示ClassLoader信息
jvm -c
输出包含:
- Java运行时版本与厂商
- JVM参数
- 类加载统计
- JVM内存区域使用情况
- 垃圾收集器信息
- 操作系统和硬件信息
thread - 线程分析
# 显示所有线程
thread# 查看指定线程的栈信息
thread 1# 查看最忙的前3个线程栈
thread -n 3# 查看阻塞其他线程的线程
thread -b# 查找指定状态的线程
thread --state BLOCKED# 线程池信息
thread -i
线程池参数解析:
- corePoolSize: 核心线程数
- maximumPoolSize: 最大线程数
- keepAliveTime: 线程存活时间
- queueCapacity: 队列容量
- taskCount: 已执行和未执行的任务总数
- completedTaskCount: 已完成的任务数
- largestPoolSize: 历史最大线程数
- poolSize: 当前线程数
- activeCount: 当前活动线程数
sysprop - 系统属性
# 查看所有系统属性
sysprop# 查看指定属性
sysprop java.version# 设置系统属性
sysprop user.country US
heapdump - 堆转储
# 生成堆转储文件到指定路径
heapdump /tmp/dump.hprof# 只转储活着的对象
heapdump --live /tmp/dump.hprof
4.2 类相关命令
sc - 查找类
# 模糊查找类
sc *List*# 查找指定类的详细信息
sc -d java.util.ArrayList# 查找类的方法信息
sc -d -f java.util.ArrayList# 显示类加载器信息
sc -c -d java.util.ArrayList# 指定类加载器查找
sc -c classLoaderHash *MathGame*
sm - 查找方法
# 查找类的所有方法
sm java.util.ArrayList# 查找方法的详细信息
sm -d java.util.ArrayList add# 正则匹配方法
sm java.util.ArrayList "add|remove"
jad - 反编译
# 反编译指定类
jad com.example.demo.arthas.user.UserController# 指定反编译结果输出路径
jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java# 只反编译指定的方法
jad com.example.demo.arthas.user.UserController getUserById
mc - 内存编译
# 编译指定Java文件
mc /tmp/UserController.java# 指定输出目录
mc -d /tmp/output /tmp/UserController.java# 指定ClassLoader编译
mc -c 5a54a66 /tmp/UserController.java
redefine - 热加载
# 重新加载类
redefine /tmp/output/com/example/demo/arthas/user/UserController.class# 指定ClassLoader
redefine -c 5a54a66 /tmp/output/com/example/demo/arthas/user/UserController.class# 批量重新加载
redefine -p /tmp/output/
4.3 方法相关命令
monitor - 方法监控
# 监控方法执行情况
monitor -c 5 com.example.demo.arthas.user.UserController * # 匹配正则表达式方法
monitor -c 5 com.example.demo.arthas.user.UserController get*# 监控异常统计
monitor -e -c 5 com.example.demo.arthas.user.UserController *# 监控匹配的构造函数
monitor -c 5 com.example.demo.arthas.user.UserController <init>
监控指标说明:
- timestamp: 时间戳
- class: 类名
- method: 方法名
- total: 调用次数
- success: 成功次数
- fail: 失败次数
- rt: 平均响应时间(ms)
- fail-rate: 失败率
watch - 方法观察
# 观察方法的入参和返回值
watch com.example.demo.arthas.user.UserController getUserById '{params, returnObj}' -x 3# 观察异常信息
watch com.example.demo.arthas.user.UserController getUserById '{params, throwExp}' -e -x 2# 观察入参和返回值,并按照条件过滤
watch com.example.demo.arthas.user.UserController getUserById '{params, returnObj}' 'params[0] > 100' -x 3# 观察入参和返回值,限制次数
watch com.example.demo.arthas.user.UserController getUserById '{params, returnObj}' '#cost > 10' -n 3# 按表达式过滤,只有耗时大于10ms的才会输出
watch com.example.demo.arthas.user.UserController getUserById '{params, returnObj, #cost}' '#cost > 10' -n 3 -x 3
watch支持的表达式工具类:
- params:参数列表
- returnObj:返回值
- throwExp:抛出的异常
- target:当前对象实例
- clazz:当前类
- method:当前方法
- #cost:执行耗时
trace - 方法调用链分析
# 跟踪方法执行的调用链
trace com.example.demo.arthas.user.UserController getUserById# 指定最大展开层级
trace -j 2 com.example.demo.arthas.user.UserController getUserById# 按调用耗时过滤
trace com.example.demo.arthas.user.UserController getUserById '#cost > 10'# 只跟踪本地方法
trace --skipJDKMethod false com.example.demo.arthas.user.UserController getUserById
输出示例:
`---ts=2018-12-04 18:11:45;thread_name=http-nio-8080-exec-5;id=31;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@6bc168e5`---[10.127743ms] com.example.demo.arthas.user.UserController:getUserById()+---[0.060919ms] com.example.demo.arthas.user.UserController:getUserById:before()`---[9.732368ms] com.example.demo.arthas.user.UserRepository:findById()`---[9.499895ms] org.hibernate.jpa.internal.EntityManagerImpl:find()`---[9.187044ms] org.hibernate.jpa.internal.EntityManagerImpl:find()
stack - 调用栈跟踪
# 查看调用来源
stack com.example.demo.arthas.user.UserController getUserById# 条件表达式过滤
stack com.example.demo.arthas.user.UserRepository findById 'params[0]==1'# 指定采样次数
stack -n 5 com.example.demo.arthas.user.UserController getUserById
tt - 方法执行时空隧道
tt命令记录方法执行的详细信息,支持回放。
# 记录方法执行过程
tt -t com.example.demo.arthas.user.UserController getUserById# 查看记录的调用信息
tt -l# 查看记录的详细信息
tt -i 1000# 重新执行一次调用
tt -i 1000 -p# 指定方法入参重新执行
tt -i 1000 -p '{params[0] = 2}'# 条件过滤
tt -t com.example.demo.arthas.user.UserController getUserById 'params[0]==1'
4.4 增强功能
profiler - 性能剖析
# 查看profiler支持的事件
profiler list# 开始采样,按CPU采样
profiler start# 指定采样事件
profiler start --event alloc# 指定文件输出格式(支持svg、html、jfr等)
profiler start --format html# 采样一段时间后停止
profiler stop# 将结果保存到指定文件
profiler stop --file /tmp/result.html# 支持火焰图
profiler start --event cpu --format svg
profiler stop --file /tmp/cpu.svg
vmtool - JVM工具
# 获取对象
vmtool --action getInstances --className java.lang.String --limit 10# 查看对象信息
vmtool --action getInstances --className com.example.demo.arthas.user.User --express 'instances[0].username'# 强制GC
vmtool --action forceGc
ognl - 执行OGNL表达式
# 获取静态字段
ognl '@com.example.demo.arthas.user.UserService@INSTANCE'# 调用静态方法
ognl '@java.lang.System@currentTimeMillis()'# 获取变量值
ognl '#user=@com.example.demo.arthas.user.UserController@userService.findById(1), #user.username'# 调用对象方法
ognl '#user=@com.example.demo.arthas.user.UserController@userService.findById(1), #user.setUsername("arthas"), #user'
5. 实战案例详解
5.1 CPU使用率过高问题分析
当应用CPU使用率异常升高时,使用Arthas可以快速定位问题:
实战步骤:
-
首先执行
dashboard查看系统整体情况:dashboard -n 10 -
发现有线程CPU使用率很高,执行
thread命令查看线程状态:# 查看占用CPU最高的3个线程 thread -n 3 -
定位到问题线程,查看其栈信息:
thread 16234 -
发现可疑方法,使用
trace跟踪执行链路:trace com.example.service.OrderService calculatePrice '#cost > 200' -
使用
profiler进行火焰图分析:profiler start --event cpu # 等待30秒 profiler stop --format svg --file /tmp/cpu.svg
5.2 内存泄漏分析
实战步骤:
-
首先执行
dashboard和memory观察内存使用情况:# 观察内存趋势 dashboard -i 5000# 查看详细内存信息 memory -
发现Old区内存持续增长,使用
heapdump导出堆内存:heapdump --live /tmp/heap.hprof -
使用MAT分析堆转储文件(离线分析)
-
根据MAT分析结果,定位到可疑类,使用
vmtool查看实例:vmtool --action getInstances --className com.example.cache.UserCache --limit 10 -
使用
ognl查看对象详情:ognl '#cache=@com.example.cache.UserCache@INSTANCE, #cache.cacheMap.size()' -
使用
watch监控可疑方法:watch com.example.cache.UserCache put '{params, target.cacheMap.size()}' -x 3
5.3 线上修复Bug
实战步骤:
-
首先定位到问题代码,使用
jad反编译:jad --source-only com.example.service.OrderService > /tmp/OrderService.java -
修改源代码,修复Bug:
vim /tmp/OrderService.java -
使用
mc编译修改后的代码:mc -d /tmp/classes /tmp/OrderService.java -
使用
redefine热加载修改后的类:redefine /tmp/classes/com/example/service/OrderService.class -
使用
watch验证修复效果:watch com.example.service.OrderService calculatePrice '{params, returnObj}' -x 3
5.4 定位接口超时问题
实战步骤:
-
首先用
trace跟踪超时接口:trace com.example.controller.ApiController handleRequest '#cost > 1000' -
发现有方法特别耗时,使用
stack查看其调用来源:stack com.example.service.RemoteService requestData -
使用
watch观察方法的入参和返回值:watch com.example.service.RemoteService requestData '{params, returnObj, #cost}' -x 3 -
使用
tt记录多次调用,分析变化趋势:tt -t com.example.service.RemoteService requestData -
回放某次执行,调试分析:
tt -i 1000 -p
6. 高级应用场景
6.1 Spring Boot应用诊断
诊断Spring应用的常用命令组合:
# 查找所有Controller
sc -d *Controller# 查看一个Bean的详细信息
ognl '#context=@org.springframework.web.context.support.WebApplicationContextUtils@getWebApplicationContext(#request.getServletContext()), #context.getBean("userService")'# 查找所有RequestMapping
ognl '#springContext=@org.springframework.web.context.ContextLoader@getCurrentWebApplicationContext(), #springContext.getBean("requestMappingHandlerMapping").getHandlerMethods().entrySet()' -x 2
6.2 动态日志调整
运行时调整日志级别是Arthas的强大功能:
# 查看logger信息
logger# 查看指定logger信息
logger -n org.springframework.web# 修改日志级别
logger --name org.springframework.web --level debug# 在方法调用时临时调高日志级别
watch com.example.service.UserService update '{params, returnObj}' -x 3 '#cost>100' 'logger:org.springframework.web:TRACE'
6.3 性能优化
对应用进行性能优化的常用方法:
# 查找热点类和方法
profiler start --event cpu
profiler stop --format html --file /tmp/cpu-profiler.html# 用watch命令观察方法执行次数与耗时
monitor -c 5 com.example.service.* *# 对比优化前后性能变化
tt -t com.example.service.OrderService calculatePrice
# 优化后
tt -t com.example.service.OrderService calculatePrice
tt -l
6.4 多应用实例问题
当有多个同类型应用实例时,如何诊断问题:
# 启动时选择特定实例
java -jar arthas-boot.jar --select "demo-app"# 设置唯一tunnel id
java -jar arthas-boot.jar --tunnel-server "ws://tunnel-server:7777/ws" --agent-id "app1_instance1"# 使用Web Console连接特定实例
http://tunnel-server:8080/arthas-web-console/index.html?agentId=app1_instance1
7. 最佳实践与注意事项
7.1 性能影响控制
Arthas虽然强大,但使用不当会影响线上系统性能:
-
避免长时间使用trace/watch等命令:
# 限制采样次数 trace -n 10 com.example.service.OrderService calculatePrice# 限制命令执行时间 trace --duration 30 com.example.service.OrderService calculatePrice -
使用条件表达式过滤:
# 只监控耗时超过100ms的调用 trace com.example.service.OrderService calculatePrice '#cost > 100' -
合理设置采样间隔:
# 增加采样间隔,降低对系统的影响 monitor -c 10 -i 5000 com.example.service.OrderService calculatePrice
7.2 安全措施
生产环境使用Arthas需注意以下安全事项:
-
设置访问认证:
java -jar arthas-boot.jar --username admin --password admin -
使用tunnel server模式保证网络安全:
java -jar arthas-boot.jar --tunnel-server 'ws://tunnel-server:7777/ws' -
限制命令使用:
java -jar arthas-boot.jar --exclude-commands=jad,mc,redefine -
及时退出Arthas会话:
# 使用完后退出 quit# 完全退出,卸载Agent stop
7.3 版本兼容性
Arthas的不同版本可能有命令差异,建议:
- 总是使用与JDK版本兼容的Arthas版本
- 定期更新Arthas到最新版本以获取bug修复和新功能
- 在测试环境验证Arthas命令后再在生产环境使用
7.4 与其他工具配合使用
Arthas可以与其他工具结合使用,形成完整的问题诊断体系:
- 与MAT配合分析内存问题
- 与JMC/JFR结合进行性能分析
- 与ELK结合进行日志分析
- 与APM工具结合进行全链路追踪
8. 总结
Arthas作为一款强大的Java诊断工具,通过Java Agent技术实现了对JVM运行时的深度观测和操控能力。它的优势在于:
- 无侵入性:不需要修改应用代码或重启应用
- 实时分析:能够动态获取运行时数据
- 功能丰富:从线程分析到字节码操作,覆盖了诊断需求
- 易于使用:命令行界面简单直观
掌握Arthas使你在面对复杂的Java生产环境问题时,能够像手术刀一样精准定位并解决问题,真正做到知其所以然。
在实际应用中,建议通过大量实践熟悉各个命令的使用场景和优缺点,形成自己的问题诊断方法论。通过不断实践,你会发现Arthas不仅是一个工具,更是一种解决问题的思路和方法。
相关文章:
java怎么找bug?Arthas原理与实战指南
Arthas原理与实战指南 1. Arthas简介 Arthas是阿里巴巴开源的Java诊断工具,其名字取自《魔兽世界》的人物阿尔萨斯。它面向线上问题定位,被广泛应用于性能分析、定位问题、安全审计等场景。Arthas的核心价值在于它能够在不修改应用代码、不重启Java进程…...
Windows使用SonarQube时启动脚本自动关闭
一、解决的问题 Windows使用SonarQube时启动脚本自动关闭,并发生报错: ERROR: Elasticsearch did not exit normally - check the logs at E:\Inori_Code\Year3\SE\sonarqube-25.2.0.102705\sonarqube-25.2.0.102705\logs\sonarqube.log ERROR: Elastic…...
Day53 二叉树的层序遍历
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* T…...
物联网智慧教室项目(完整版)
物联网智慧教室项目(一):智慧教室项目解决方案 一、智慧教室项目设计 (一)环境信息采集控制功能 1、硬件设计 使用STM32开发板模拟灯光控制,报警控制,光照信息采集: 灯光控制通过GPIO控制板载LED报警控…...
替代升级VMware | 云轴科技ZStack构建山西证券一云多芯云平台
通过云轴科技ZStack Cloud云平台,山西证券打造了敏捷部署、简单运维的云平台,不仅兼容x86、海光、鲲鹏三种异构服务器实现一云多芯,还通过云平台虚拟化纳管模块纳管原有VMware虚拟化资源,并对接第三方集中式存储,在保护…...
计算机网络期中复习笔记(自用)
复习大纲 –第一章 概述 计算机网络的组成 网络边缘:主机和网络应用程序(又称为“端系统”) 端系统中运行的程序之间的通信方式可划分为两大类: 客户/服务器方式(C/S方式) 对等方式(P2P方式…...
14.Chromium指纹浏览器开发教程之WebGL指纹定制
WebGL指纹概述 当在浏览器打开的网页上浏览内容时,看到的大多是平面的、静态的图像和文字。但是有时想要在网页上看到更加生动、立体的图像,如3D游戏、虚拟现实应用等。这时,就需要用到WebGL。 简单来说,WebGL(Web G…...
GitHub SSH连接终极解决方案
GitHub SSH连接终极解决方案:443端口修改多场景故障排查指南 一、问题现象速查 当开发者执行以下命令时出现连接异常: ssh -T gitgithub.com常见报错类型: 经典端口阻塞ssh: connect to host github.com port 22: Connection refused密钥验…...
Git 中修改某个特定的commit提交内容
在 Git 中修改某个特定的提交(commit)通常需要使用 交互式变基(Interactive Rebase) 或 修改提交(Commit Amend)。以下是不同场景下的具体操作步骤: 一、修改最近的提交(最新提交&am…...
每日算法【双指针算法】(Day 1-移动零)
双指针算法 1.算法题目(移动零)2.讲解算法原理3.编写代码 1.算法题目(移动零) 2.讲解算法原理 数组划分,数组分块(快排里面最核心的一步)只需把0改为tmp 双指针算法:利用数组下标来…...
B端管理系统:企业运营的智慧大脑,精准指挥
B端管理系统的定义与核心功能 B端管理系统(Business Management System)是专门设计用于支持企业内部运作和外部业务交互的一套软件工具。它集成了多种功能模块,包括但不限于客户关系管理(CRM)、供应链管理(SCM)、人力资源管理(HRM)以及财务管…...
使用Java基于Geotools的SLD文件编程式创建与磁盘生成实战
前言 在地理信息系统(GIS)领域,地图的可视化呈现至关重要,而样式定义语言(SLD)文件为地图元素的样式配置提供了强大的支持。SLD 能够精确地定义地图图层中各类要素(如点、线、面、文本等&#x…...
Git 命令速查手册
听说用美图可以钓读者? 一、基础操作核心命令 1. 仓库初始化与克隆 命令作用示例git init创建新仓库git init my-projectgit clone克隆远程仓库git clone [https://github.com/user/repo.git](https://github.com/user/repo.git)git remote add关联远程仓库git re…...
PKI 公钥基础设施
PKI 的全称是公钥基础设施(Public Key Infrastructure),是一个基于公钥加密技术,为网络环境中的各种应用提供安全服务的基础设施,由多个部分组成,各部分协同工作以实现数字证书的管理、密钥的生成与管理以及…...
android测试硬件工具 安卓硬件测试命令
Android开发常用ADB命令大全 在Android开发过程中,ADB(Android Debug Bridge)是一个非常重要的调试工具。掌握这些命令可以大大提高开发效率。如果你正在使用克魔开发助手(Keymob)这样的开发工具,你会发现它已经集成了很多ADB功能,让调试变得…...
网络编程 - 4 ( TCP )
目录 TCP 流套接字编程 API 介绍 SeverSocket Socket 用 TCP 实现一个回显服务器 服务端 客户端 运行调试 第一个问题:PrintWriter 内置的缓冲区 - flush 刷新解决 第二个问题:上述代码中,需要进行 close 操作吗? 第三…...
OSPF综合实验(HCIP)
1,R5为ISP,其上只能配置Ip地址;R4作为企业边界路由器, 出口公网地址需要通过ppp协议获取,并进行chap认证 2,整个OSPF环境IP基于172.16.0.0/16划分; 3,所有设备均可访问R5的环回&…...
真实波幅策略思路
该策略是一种基于ATR(Average True Range)指标的交易策略,主要用于期货市场中的日内交易。策略的核心思想是利用ATR指标来识别市场的波动范围,并结合均线过滤来确定买入和卖出的时机。 交易逻辑思维 1. 数据准备与初始化 - 集合竞…...
ESB —— 企业集成架构的基石:功能、架构与应用全解析
企业服务总线(Enterprise Service Bus,ESB)是一种重要的企业级集成架构,以下为你详细介绍: 一、概念与定义 ESB 是一种基于面向服务架构(SOA)的中间件技术,它充当了企业内部不同应…...
leetcode 674. Longest Continuous Increasing Subsequence
目录 题目描述 第一步,明确并理解dp数组及下标的含义 第二步,分析明确并理解递推公式 第三步,理解dp数组如何初始化 第四步,理解遍历顺序 代码 题目描述 这是动态规划解决子序列问题的例子。与第300题的唯一区别就是&#…...
STM32 外部中断EXTI
目录 外部中断基础知识 STM32外部中断框架 STM32外部中断机制框架 复用功能 重映射 中断嵌套控制器NVIC 外部中断按键控制LED灯 外部中断基础知识 STM32外部中断框架 中断的概念:在主程序运行过程中,出现了特点的中断触发条件,使得…...
Linux:基础IO---动静态库
文章目录 1. 动静态库前置知识1.1 动静态库知识回顾1.2 什么是动静态库 2. 动静态库2.1 站在库的制作者的角度2.2 站在库的使用者的角度2.3 动态库是怎么被加载的(原理) 序:上一篇文章我们从认识到理解,从理解到实现场景ÿ…...
深度学习-torch,全连接神经网路
3. 数据集加载案例 通过一些数据集的加载案例,真正了解数据类及数据加载器。 3.1 加载csv数据集 代码参考如下 import torch from torch.utils.data import Dataset, DataLoader import pandas as pd class MyCsvDataset(Dataset):def __init__(self, fil…...
SQL注入相关知识
一、布尔盲注 1、布尔盲简介 布尔盲注是一种SQL注入攻击技术,用于在无法直接获取数据库查询结果的情况下,通过页面的响应来判断注入语句的真假,从而获取数据库中的敏感信息 2、布尔盲注工作原理 布尔盲注的核心在于利用SQL语句的布尔逻辑…...
Codex CLI - 自然语言命令行界面
本文翻译整理自:https://github.com/microsoft/Codex-CLI 文章目录 一、关于 Codex CLI相关链接资源 二、安装系统要求安装步骤 三、基本使用1、基础操作2、多轮模式 四、命令参考五、提示工程与上下文文件自定义上下文 六、故障排查七、FAQ如何查询可用OpenAI引擎&…...
实现窗口函数
java 实现窗口函数 public class SlidingWin {public static void main(String[] args) {SlidingWin slidingWin new SlidingWin();double v slidingWin.SlidWin(2);System.out.println(v);}public double SlidWin(int k){int [] array new int[]{2,4,5,6,9,10,12,23,1,3,8…...
pycharm中怎么解决系统cuda版本高于pytorch可以支持的版本的问题?
在PyCharm中安装与系统CUDA版本不一致的PyTorch是可行的。以下是解决方案的步骤: 1. 确认系统驱动兼容性 检查NVIDIA驱动支持的CUDA版本:运行 nvidia-smi,右上角显示的CUDA版本是驱动支持的最高版本。只要该版本不低于PyTorch所需的CUDA版本…...
Day57 | 79. 单词搜索、89. 格雷编码
79. 单词搜索 题目链接:79. 单词搜索 - 力扣(LeetCode) 题目难度:中等 代码: class Solution {public boolean exist(char[][] board, String word) {char[] wordsword.toCharArray();for(int i0;i<board.lengt…...
清华《数据挖掘算法与应用》K-means聚类算法
使用k均值聚类算法对表4.1中的数据进行聚类。代码参考P281。 创建一个名为 testSet.txt 的文本文件,将以下内容复制粘贴进去保存即可: 0 0 1 2 3 1 8 8 9 10 10 7 表4.1 # -*- coding: utf-8 -*- """ Created on Thu Apr 17 16:59:58 …...
MATLAB - 小车倒立摆的非线性模型预测控制(NMPC)
系列文章目录 目录 系列文章目录 前言 一、摆锤/小车组件 二、系统方程 三、控制目标 四、控制结构 五、创建非线性 MPC 控制器 六、指定非线性设备模型 七、定义成本和约束 八、验证非线性 MPC 控制器 九、状态估计 十、MATLAB 中的闭环仿真 十一、使用 MATLAB 中…...
