JVM生产环境问题定位与解决实战(六):总结篇——问题定位思路与工具选择策略

news2025/4/5 21:39:38

在这里插入图片描述

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

引言

在前五篇文章中,我们深入探讨了JVM生产环境问题定位与解决的实战技巧,从基础的jps、jmap、jstat、jstack、jcmd等工具,到JConsole、VisualVM、MAT的高级应用,再到Java飞行记录器(JFR)的强大功能,以及如何使用JMC进行JFR性能分析,最后介绍了Arthas这一不可错过的故障诊断利器。本篇文章作为总结篇,将梳理在面对JVM各种问题时我们的定位思路,并给出工具选择的策略。

一、JVM问题分类与核心场景

在定位问题前,需先明确问题类型。以下是JVM常见问题分类及典型特征:

1. 内存相关问题

  • 特征:内存泄漏、堆内存溢出(OOM)、元空间溢出、内存使用异常波动
  • 典型表现java.lang.OutOfMemoryError、JVM进程内存持续增长、GC频率异常

2. 性能瓶颈问题

  • 特征:响应延迟、吞吐量下降、CPU使用率异常
  • 典型表现:接口响应时间突增、TPS骤降、CPU 100%占用

3. 线程相关问题

  • 特征:线程阻塞、死锁、线程池异常、线程泄漏
  • 典型表现:线程数异常增长、接口无响应、java.util.concurrent包异常

4. GC相关问题

  • 特征:GC停顿时间过长、Full GC频繁、GC日志异常
  • 典型表现:JVM日志频繁出现Full GC、业务线程长时间被阻塞

5. 其他问题

  • 类加载异常、本地内存泄漏(Native Memory)、JVM崩溃(core dump)

二. JVM问题定位的一般思路

在生产环境中,JVM可能会遇到各种问题,比如CPU使用率过高、内存泄漏、线程死锁、性能瓶颈等。定位和解决这些问题的过程通常可以分为以下几个步骤:

  1. 监控与发现:通过操作系统提供的资源监控工具(如top、htop、free)、arthas、JVM自带工具(jps、jstat)或者搭建的监控系统(如Prometheus、Grafana)发现异常指标,如CPU飙升、内存溢出、系统宕机、gc异常等。
  2. 评估是否需要重启服务:根据问题的严重性和业务影响,决定是否立即重启服务以恢复业务。
  3. 快照捕获:使用合适的工具收集数据(如线程堆栈、堆转储文件、GC日志、应用日志等)。
  4. 数据分析:根据异常类型选择工具分析结果,确定问题的根源,例如代码缺陷、配置不当或资源竞争。
  5. 解决问题:采取针对性措施,如调整JVM参数、优化代码或修复逻辑错误。
  6. 验证与监控:解决问题后,持续监控系统,确保问题不再复现。

在这一过程中,选择合适的工具是关键。不同的工具适用于不同的场景和问题类型,接下来我们将对这些工具进行分类,并探讨如何根据具体问题选择合适的工具。

三. JVM工具分类

根据工具的使用方式和功能,我们可以将前五篇文章中介绍的工具分为以下几类:

  • 命令行工具 :

    • jps:查看JVM进程。
    • jmap:分析堆内存使用情况。
    • jstat:监控GC和JVM运行时统计信息。
    • jstack:查看线程堆栈。
    • jcmd:多功能命令行工具。
    • Arthas:在线诊断工具,支持线程分析、反编译等。
  • 图形化工具:

    • JConsole:实时监控JVM运行状态。
    • VisualVM:多功能的JVM监控和分析工具。
    • MAT(Memory Analyzer Tool):深入分析堆内存转储。
    • JMC(Java Mission Control):分析JFR记录的性能数据。
  • 性能分析工具:

    • JFR(Java Flight Recorder):内置于JDK的事件记录工具。
    • JMC:与JFR配合使用,分析性能瓶颈。

命令行工具适合在服务器上快速诊断,图形化工具适合本地深入分析,而性能分析工具则专注于性能调优。

四. 常见JVM问题及排查思路

以下是生产环境中常见的JVM问题,并针对每个问题提供可能的原因推测和实用的排查思路。

1 JVM进程突然消失

可能原因
  • OOM Killer:操作系统因内存不足触发Out-Of-Memory Killer,杀死了JVM进程。
  • JVM崩溃:JNI调用、本地代码bug或JVM本身的bug导致崩溃(会生成hs_err_pid.log文件)。
  • 外部干预:人为操作(如kill -9)或脚本误杀JVM进程。
排查思路
  1. 检查JVM日志:查看hs_err_pid<pid>.log文件(通常在工作目录下生成),分析崩溃堆栈。
  2. 检查系统日志:查看/var/log/messagesdmesggrep -i 'oom' /var/log/messages*grep -i 'sigterm' /var/log/syslog),确认是否被OOM Killer终止。
  3. 确认外部操作:检查服务器操作日志或运维记录,排除人为误操作。
  4. 启用JVM参数:添加-XX:+HeapDumpOnOutOfMemoryError生成堆转储文件;

2 内存使用率过高

可能原因
  • 内存泄漏:对象未被正确释放,堆内存持续增长。
  • 不合理的堆配置-Xmx-Xms设置过小或过大。
  • Metaspace溢出:类加载过多或动态代理使用不当。
  • 本地内存泄漏:JNI或NIO的Direct ByteBuffer未释放。
排查思路
  1. 监控内存使用
    • 使用jstat -gc查看堆内存和Metaspace使用情况。
    • 用Arthas的dashboard命令实时观察内存状态。
    • 通过JMC连接JVM,查看“Memory”视图中的堆使用趋势。
  2. 生成堆转储并分析内存泄漏
    • jmap -dump:live,format=b,file=heap.hprof <pid>或Arthas的heapdump /tmp/heap.hprof导出堆快照,结合MAT分析,通过Leak Suspects视图查看泄露疑点。或者选中 Retained Heap 最大的对象,右键选择 "List objects > with incoming references",查看有哪些对象引用了它。通过 "Path to GC Roots"(到 GC 根的路径)功能,找到该对象为什么没有被垃圾回收。选择 "excluding weak/soft references"(排除弱引用/软引用),以聚焦强引用路径。结合 MAT 的类名和引用链,推测可能的代码路径。
    • 用JFR记录(-XX:StartFlightRecording,settings=profile),在JMC的“Allocation”视图识别内存分配热点和泄漏对象。
  3. 检查GC日志
    • 开启JVM参数-XX:+PrintGCDetails-Xlog:gc*,分析GC频率和效果。
    • 结合Arthas的dashboard或JMC的“Garbage Collection”视图验证GC行为。
  4. 检查代码和类加载
    • 用Arthas的sc -d <className>检查类加载详情,排查Metaspace问题。
    • 用JFR的“Class Loading”事件和JMC分析类加载行为。
    • 用JMC的“Object Reference”视图追踪未释放对象的引用链,定位内存泄漏根源。
典型操作
jmap -dump:format=b,file=heap.hprof <pid>      # 生成堆转储
jstat -gcutil <pid> 1000                       # 每秒实时GC统计
jcmd <pid> VM.native_memory                    # 堆外内存分析(需开启NMT)

3 CPU使用率过高

可能原因
  • 死循环或高计算任务:代码中存在无限循环或复杂计算逻辑。
  • 线程竞争激烈:锁争用或线程池配置不当。
  • 频繁Full GC:垃圾回收过于频繁,占用CPU资源。
排查思路
  1. 定位高CPU线程
    • 使用top -H -p <pid>查看线程CPU占用,记录线程ID(转换为16进制)。
    • 用Arthas的thread命令列出线程并找到CPU占用最高的线程。
    • 用JFR(-XX:StartFlightRecording)在JMC的“CPU Load”或“Thread”视图中定位高CPU线程。
  2. 获取线程栈
    • 通过jstack <pid>生成线程调用栈,定位死循环或阻塞点。
    • 用Arthas的thread <threadId>查看具体线程堆栈。
    • 用JFR的“Method Profiling”在JMC中分析线程执行热点。
  3. 分析代码逻辑
    • 检查是否存在死循环、频繁GC或高负载任务。
  4. 检查GC行为
    • 开启GC日志(-XX:+PrintGCDetails),分析Full GC频率。
    • 结合MAT分析,Histogram视图中找到 Retained Heap 最大的对象,右键选择 "List objects > with incoming references",查看有哪些对象引用了它。通过 "Path to GC Roots"(到 GC 根的路径)功能,找到该对象为什么没有被垃圾回收。选择 "excluding weak/soft references"(排除弱引用/软引用),以聚焦强引用路径。结合 MAT 的类名和引用链,推测可能的代码路径。
    • 用Arthas的vmtool --action getInstances --className java.lang.Object检查对象创建情况。
    • 用JMC的“Garbage Collection”视图确认GC对CPU的影响。
典型操作
top -H -p <pid>                 # 查看线程CPU占用,记录下占用CPU最高的线程TID。
printf "%x\n" <TID>             #将TID转换为十六进制(Java堆栈中的线程ID是以十六进制表示的)
jstack <pid> > thread_dump.txt  # 抓取线程栈,在生成的thread_dump.txt中搜索对应的十六进制线程ID,找到该线程的堆栈信息。
---------------------------------------------------------------
thread -n 3                    # 显示最忙的3个线程(启动Arthas后执行)

4 线程死锁

可能原因
  • 锁顺序不当:多个线程以不同顺序获取多个锁。
  • 资源竞争:线程间对共享资源访问未正确同步。
  • 第三方库问题:依赖库中的锁使用不当。
排查思路
  1. 检测死锁
    • jstack <pid>输出末尾会明确提示Found one Java-level deadlock
    • 用Arthas的thread -b直接检测并输出死锁信息。
    • 用JFR记录(-XX:StartFlightRecording),在JMC的“Lock Instances”视图中检测锁竞争和死锁。
    • 使用JConsole或VisualVM的线程监控功能查看线程状态
  2. 分析死锁详情
    • jstack提示“Found one Java-level deadlock”,定位锁冲突点。
    • 用Arthas的thread <threadId>查看具体线程堆栈。
    • 用JMC的“Deadlock Detection”功能、JConsole或者VisualVM的线程视图展示锁冲突点和线程状态。
  3. 检查代码
    • 梳理加锁逻辑,确保锁获取顺序一致。
  4. 动态监控锁竞争
    • 用Arthas的monitor命令监控关键方法的执行频率和锁等待时间。
    • 用JMC的“Thread”视图分析锁等待时长和竞争热点,结合“Contended Locks”事件优化同步代码。

5 性能瓶颈

可能原因
  • I/O阻塞:数据库查询慢或文件操作耗时。
  • 锁等待:同步块或线程池任务排队。
  • GC暂停:STW(Stop-The-World)时间过长。
  • 网络延迟:外部服务响应慢。
排查思路
  1. 性能分析
    • 使用jvisualvm采样,定位耗时方法。
    • 用Arthas的trace <className> <methodName>追踪方法执行时间。
    • 用JFR(-XX:StartFlightRecording,settings=profile)记录,在JMC的“Method Profiling”视图定位耗时方法,结合“Latency”视图分析瓶颈来源。
  2. 检查线程状态
    • 通过jstack分析线程是否在WAITINGTIMED_WAITING状态。
    • 用Arthas的thread -state WAITING筛选等待线程。
    • 用JMC的“Thread”视图查看线程等待和阻塞详情。
  3. 优化GC
    • 调整-XX:+UseG1GC或 WiresharkCMS参数,减少暂停时间。
    • 用Arthas的dashboard监控GC状态。
    • 用JMC的“Garbage Collection”视图分析GC暂停时间。
  4. 外部依赖排查
    • 使用日志或Wireshark抓包分析网络耗时。
    • 用Arthas的watch <className> <methodName>观察方法入参和返回值。
    • 用JFR的“I/O”事件和JMC分析文件或网络操作耗时。
典型操作
# 使用Arthas的trace命令追踪方法执行时间。
trace com.ExampleController getUserInfo "#cost > 200"

# 输出结果
`---[213.3576ms] com.ExampleController:getUserInfo()
    +---[212.12ms] com.UserService:queryFromDB() # 发现DB查询耗时
    |   `---[210.45ms] org.mybatis.spring.SqlSessionTemplate:selectOne()
    `---[1.2ms] com.Utils:maskPhoneNumber() 

watch com.example.Service::handleRequest '{args,requestTime}'

6 GC问题

典型表现
  • 频繁Full GCjstat -gcutil中FGC列快速增加
  • GC停顿过长:通过-Xlog:gc*日志观察暂停时间
  • 晋升失败:年轻代对象过快进入老年代
可能原因
  • GC频率过高:对象创建速度快,年轻代空间不足。
  • Full GC频繁:老年代填满,触发长时间STW。
  • GC配置不当:垃圾回收器选择或参数设置不合理。
排查思路
  1. 开启GC日志并实时监控
    • 配置-XX:+PrintGCDetails -Xlog:gc*,分析GC耗时和效果。
    • 用Arthas的dashboard实时查看GC状态。
    • 用JMC的“Garbage Collection”视图分析GC次数和暂停时间。
  2. 监控内存分区
    • jstat -gcutil <pid>观察Eden、Survivor、Old区使用率。
    • 用Arthas的ognl '@java.lang.management.ManagementFactory@getGarbageCollectorMXBeans()'获取GC统计。
    • 用JFR的“Memory”视图和JMC分析内存分配与GC行为。
  3. 调整堆大小并分析GC根因
    • 根据业务负载调整-Xmx-Xms-XX:NewRatio
    • 用Arthas的heapdump生成堆快照分析老年代对象。
    • 用JFR(-XX:StartFlightRecording,dump-on-exit=true)生成堆快照,在JMC的“Allocation”视图定位高频分配对象,优化代码减少GC压力。
  4. 选择合适GC算法
    • 低延迟场景用G1,高吞吐量用Parallel GC。
    • 结合JMC的“GC Times”和“GC Pause”分析优化参数。
    • 调整堆大小-Xms-Xmx设为相同值,避免动态扩容

五. 先重启还是先排查的选择

在生产环境中遇到JVM问题时,开发者往往面临一个抉择:是立即重启服务以快速恢复,还是先排查问题以避免复发?以下是选择依据及后续排查措施。

判断依据

  • 问题严重性
    • 如果服务完全不可用(如JVM进程消失或响应超时),且影响核心业务,优先考虑重启以恢复服务。
    • 如果问题仅表现为性能下降或间歇性异常,可先尝试在线排查。
  • 数据丢失风险
    • 重启可能导致内存中未持久化的数据丢失,需评估业务影响。
  • 复现难度
    • 如果问题难以复现,重启前尽量收集现场数据(如堆转储、线程栈、JFR记录)。

必须立即恢复服务的措施

若必须马上恢复服务,可采取以下措施在不中断排查的情况下继续分析问题:

  1. 收集关键数据后重启
    • 在重启前快速执行jmap -dump:live,format=b,file=heap.hprof <pid>生成堆转储。
    • jstack <pid>抓取线程栈。
    • 确保JFR已启用(-XX:StartFlightRecording,dumponexit=true),保存退出时的记录文件。
  2. 流量复制到测试环境
    • 配置流量镜像工具(如TCPdump或服务网格的Sidecar),将生产流量复制到测试环境。
    • 在测试环境回放流量,观察是否复现问题。
  3. 在测试环境复现
    • 根据生产环境的日志、请求参数和负载特征,构造测试用例。
    • 在测试环境启用JFR(-XX:StartFlightRecording)和Arthas,模拟问题场景。
  4. 开启新节点并隔离问题节点
    • 部署新JVM节点接管流量,保持问题节点运行但不接收新请求。
    • 在隔离节点上用Arthas(dashboardthread)或JMC实时分析,避免影响服务。

六. 工具选择指南

在实际工作中,面对JVM问题时,可以参考以下指南选择工具:

  1. 快速诊断
    • 在服务器上使用命令行工具(如jstack、jmap、Arthas)快速获取初步信息。
    • 示例:CPU过高时,运行jstack > stack.txt查看线程堆栈。
  2. 深入分析
    • 将堆转储文件或JFR记录下载到本地,使用MAT、JMC等工具进行详细分析。
    • 示例:分析内存泄漏时,用MAT打开jmap生成的heap.hprof文件。
  3. 实时监控
    • 使用JConsole或VisualVM观察JVM的实时状态,适合初步排查。
    • 示例:连接到远程JVM,监控内存和线程变化。
  4. 性能分析
    • 使用JFR和JMC进行全面性能分析,适合长期优化。
    • 示例:运行JFR记录1分钟数据,用JMC查看方法耗时分布。
  5. 在线诊断
    • 在不重启JVM的情况下,使用Arthas进行动态排查。
    • 示例:怀疑某方法有问题,用jad com.example.MyClass反编译代码。

JVM问题的排查需要综合运用工具、日志和代码分析。传统工具如jps(查看进程)、jmap(堆转储)、jstack(线程转储)、jstat(GC监控),结合Arthas的动态诊断和JMC/JFR的深度分析能力,可以覆盖内存泄漏、锁竞争、性能瓶颈和GC问题等多种场景。工具之间还可以组合使用。例如,先用jstack找到问题线程,再用Arthas的jad反编译相关类;或者用JFR记录数据,再用JMC可视化分析。

在生产环境中,建议提前配置监控日志,部署Arthas并启用JFR,遇到问题时根据严重性选择重启或排查策略,确保服务稳定性和问题根因分析兼顾。希望本文的排查思路能为您解决JVM问题提供实用指导!

附录:系列目录

  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生产环境问题定位与解决实战(六):总结篇——问题定位思路与工具选择策略

🔥 下篇预告:《JVM生产环境问题定位与解决实战(七):真实案例解剖——从工具链到思维链的完全实践》
🚀 关注作者,获取实时更新通知!有问题欢迎在评论区交流讨论~

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

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

相关文章

并行治理机制对比:Polkadot、Ethereum 与 NEAR

治理是任何去中心化网络的基础。它塑造了社区如何发展、如何为创新提供资金、如何应对挑战以及如何随着时间的推移建立信任。随着 Web3 的不断发展&#xff0c;决定这些生态系统如何做出决策的治理模型也在不断发展。 在最近的一集的【The Decentralized Mic】中, Polkadot 汇…

TDengine tar.gz和docker两种方式安装和卸载

下载地址 3.1.1.0 Linux版本 安装包 下载地址 3.1.1.0 docker 镜像 下载地址 3.1.1.0 Window客户端 1. 将文件上传至服务器后解压 tar -zxvf TDengine-server-3.1.1.0-Linux-x64.tar.gz 2. tar.gz安装 解压文件后&#xff0c;进入相应子目录&#xff0c;执行其中的 install.…

【STM32设计】基于STM32的智能门禁管理系统(指纹+密码+刷卡+蜂鸣器报警)(代码+资料+论文)

本课题为基于单片机的智能门禁系统&#xff0c;整个系统由AS608指纹识别模块&#xff0c;矩阵键盘&#xff0c;STM32F103单片机&#xff0c;OLED液晶&#xff0c;RFID识别模块&#xff0c;继电器&#xff0c;蜂鸣器等构成&#xff0c;在使用时&#xff0c;用户可以录入新的指纹…

java知识梳理(二)

一.lambda表达式 作用&#xff1a;Lambda 表达式在 Java 8 引入&#xff0c;主要用于简化匿名内部类的写法&#xff0c;特别是在函数式编程场景中&#xff0c;比如 函数式接口、流式 API&#xff08;Streams&#xff09;、并发编程等。它让 Java 代码更简洁、可读性更强&#x…

鸿蒙Flutter实战:20. Flutter集成高德地图,同层渲染

本文以同层渲染为例&#xff0c;介绍如何集成高德地图 完整代码见 Flutter 鸿蒙版 Demo 概述 Dart 侧 核心代码如下&#xff0c;通过 OhosView 来承载原生视图 OhosView(viewType: com.shaohushuo.app/customView,onPlatformViewCreated: _onPlatformViewCreated,creation…

AI辅助下基于ArcGIS Pro的SWAT模型全流程高效建模实践与深度进阶应用

目前&#xff0c;流域水资源和水生态问题逐渐成为制约社会经济和环境可持续发展的重要因素。SWAT模型是一种基于物理机制的分布式流域水文与生态模拟模型&#xff0c;能够对流域的水循环过程、污染物迁移等过程进行精细模拟和量化分析。SWAT模型目前广泛应用于流域水文过程研究…

尚语翻译图册翻译|专业图册翻译|北京专业翻译公司推荐|专业文件翻译报价

内容概要 尚语翻译公司聚焦多语种产品图册翻译的竞价推广服务&#xff0c;通过行业垂直化运营构建差异化竞争力。其核心服务覆盖机械制造、医疗器械、电子元件三大领域&#xff0c;依托ISO 17100认证的翻译流程和Trados术语管理系统&#xff0c;实现技术文档的精准转化。为提升…

LeetCode 解题思路 30(Hot 100)

解题思路&#xff1a; 递归参数&#xff1a; 生成括号的对数 n、结果集 result、当前路径 path、左括号数 open、右括号数 close。递归过程&#xff1a; 当当前路径 path 的长度等于 n * 2 时&#xff0c;说明已经生成有效括号&#xff0c;加入结果集。若左括号数小于 n&…

Java EE(18)——网络原理——应用层HTTP协议

一.初识HTTP协议 HTTP(HyperText Transfer Protocol&#xff0c;超文本传输协议)是用于在客户端&#xff08;如浏览器&#xff09;和服务器之间传输超媒体文档&#xff08;如HTML&#xff09;的应用层协议。 HTTP协议发展至今发布了多个版本&#xff0c;其中1.0&#xff0c;1.…

强大而易用的JSON在线处理工具

强大而易用的JSON在线处理工具&#xff1a;程序员的得力助手 在当今的软件开发世界中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;已经成为了数据交换的通用语言。无论是前端还是后端开发&#xff0c;我们都经常需要处理、验证和转换JSON数据。今天&a…

Qt笔记----》不同环境程序打包

文章目录 概要1、windows环境下打包qt程序2、linux环境下打包qt程序2.1、程序目录2.2、创建一个空文件夹2.3、添加依赖脚本2.4、打包过程2.4.1、添加程序依赖库2.4.2、添加Qt相关依赖库 概要 qt不同运行环境下打包方式&#xff1a;windows/linux 1、windows环境下打包qt程序 …

企业服务器备份软件,企业服务器备份的方法有哪些?

企业服务器备份需综合考虑数据量、业务连续性要求&#xff08;RTO/RPO&#xff09;、合规性及成本等因素。以下是分场景的工具和方法指南&#xff1a; 一、备份软件推荐 1. 80KM备份软件 80KM备份软件可以进行很复杂的备份方式&#xff0c;也可以内网对内网备份、还能内网的…

html5炫酷图片悬停效果实现详解

html5炫酷图片悬停效果实现详解 这里写目录标题 html5炫酷图片悬停效果实现详解项目介绍技术栈核心功能实现1. 页面布局2. 图片容器样式3. 炫酷悬停效果缩放效果倾斜效果模糊效果旋转效果 4. 悬停文字效果5. 性能优化6. 响应式设计 项目亮点总结 项目介绍 本文将详细介绍如何使…

机器学习的一百个概念(5)数据增强

前言 本文隶属于专栏《机器学习的一百个概念》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见[《机器学习的一百个概念》 ima 知识库 知识库广场搜索&…

在MCU工程中优化CPU工作效率的几种方法

在嵌入式系统开发中&#xff0c;优化 CPU 工作效率对于提升系统性能、降低功耗、提高实时性至关重要。Keil 作为主流的嵌入式开发工具&#xff0c;提供了多种优化策略&#xff0c;包括 关键字使用、内存管理、字节对齐、算法优化 等。本文将从多个方面介绍如何在 Keil 工程中优…

美团民宿 mtgsig 小程序 mtgsig1.2 分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 cp execjs.compile(open(民…

(done) MIT6.824 Lecture 02 - RPC and Threads

知乎专栏&#xff1a;https://zhuanlan.zhihu.com/p/641105196 原视频&#xff1a;https://www.bilibili.com/video/BV16f4y1z7kn?spm_id_from333.788.videopod.episodes&vd_source7a1a0bc74158c6993c7355c5490fc600&p2 看知乎专栏 一、Why we choose go&#xff1f…

LayaAir3.3.0-beta.3重磅更新!Spine4.2、2D物理、UI系统、TileMap等全面升级!

正式版推出前&#xff0c;说明3.3的功能还没开发完。所以&#xff0c;又一大波更新来了~ 下面对重点更新进行说明。 Spine的重要更新 3.3.0-beta.3版本开始&#xff0c;新增了Spine 4.2 的运行时库&#xff0c;Spine动画上可以支持物理特性了。例如&#xff0c;下图右侧女孩在启…

【AI学习】机器学习算法

1&#xff0c;线性回归模型&#xff08;Linear Regression&#xff09;:预测连续数值 寻找自变量&#xff08;解释变量&#xff09;与因变量&#xff08;被解释变量&#xff09;之间的线性关联关系&#xff0c;通过构建线性方程来对数据进行拟合和预测。即两个变量之间是一次函…

【渗透测试】Vulnhub靶机-FSoft Challenges VM: 1-详细通关教程

下载地址&#xff1a;https://www.vulnhub.com/entry/fsoft-challenges-vm-1,402/ 目录 前言 信息收集 目录扫描 wpscan扫描 修改密码 反弹shell 提权 思路总结 前言 开始前注意靶机简介&#xff0c;当第一次开机时会报apache错误&#xff0c;所以要等一分钟后重启才…