JVM生产环境问题定位与解决实战(二):JConsole、VisualVM到MAT的高级应用
生产问题定位指南:几款必备的可视化工具
引言
在上一篇文章中,详细的介绍了JDK自带的一系列命令行工具,,如jps、jmap、jstat、jstack以及jcmd等,这些工具为排查和诊断Java虚拟机(JVM)问题提供了坚实的基础。这些工具虽然强大,但使用门槛相对较高,且信息的呈现方式较为原始,不易于直观理解。为了弥补这一不足,本篇将重点介绍三个可视化工具:JConsole、VisualVM和MAT(Memory Analyzer Tool)。这些工具以图形界面的形式,将复杂的Java虚拟机信息以直观、易懂的方式呈现出来,极大地降低了问题定位的难度。
工具选型全景图
1. JConsole
简介
JConsole 是 Java 开发工具包(JDK)自带的一个监控和管理工具,主要用于监控 Java 应用程序的性能和资源消耗。它通过 JMX(Java Management Extensions)技术连接到 Java 虚拟机(JVM),并提供实时的监控数据。
使用场景
JConsole 适用于需要快速查看 JVM 状态和性能指标的场景,尤其是在开发环境和测试环境中。它的简单易用性使得开发者和运维人员可以迅速定位内存泄漏、线程死锁等问题。
核心功能矩阵
功能模块 | 监控指标示例 | 使用价值 |
---|---|---|
内存监控 | 各分区使用趋势、GC次数/耗时 | 发现内存泄漏征兆 |
线程监控 | 活动线程数、死锁检测 | 诊断线程阻塞问题 |
MBean操作 | 动态修改日志级别、触发GC | 实时干预生产环境 |
类加载监控 | 已加载类数量/卸载情况 | 检测类加载泄漏 |
启动JConsole
启动JConsole,选择目标Java进程进行连接。连接成功后,丰富的监控信息即刻呈现。例如,通过内存视图,您可以直观观察到内存使用的变化趋势,及时发现并解决内存泄漏的隐患。
# 启动jconsole
jconsole
# 带鉴权的远程连接
jconsole -J-Djavax.net.ssl.keyStore=/path/to/keystore \-J-Djavax.net.ssl.keyStorePassword=changeit \service:jmx:rmi:///jndi/rmi://192.168.1.100:9999/jmxrmi
核心功能
1. 概览(Overview)
- 作用:显示Java虚拟机(VM)和监控值的概览信息。
- 用法:在“概述”标签中,可以查看CPU使用率、内存使用率、线程数以及Java VM中加载的类的数量等关键性能指标。这些指标通常以折线图的形式展示,帮助开发者快速了解应用程序的整体性能状况。此外,对着图表点击右键可以保存数据到CSV文件,以便后续使用其他工具进行深入分析。
2. 内存 (Memory)
- 作用:显示内存使用信息,包括堆内存、非堆内存以及内存池的状况。
- 用法:在“内存”标签中,开发者可以查看堆内存和非堆内存的使用量,以及内存池(如Eden Space、Survivor Space、Tenured Gen等)的使用情况。此外,还可以查看不同垃圾回收器(GC)进行垃圾回收的次数和时间。这些信息对于调优内存性能和诊断内存泄漏非常有用。开发者可以手动触发垃圾回收操作,并观察内存变化以评估性能。
3. 线程 (Threads)
- 作用:显示线程使用信息。
- 用法:线程标签展示了当前 JVM 中所有活动线程的状态,包括它们的名称、状态、阻塞计数、等待计数以及堆栈跟踪信息 2。此标签还包括一个“检测死锁”按钮,可以帮助识别线程间是否存在死锁的情况。这对于调试多线程应用中的同步问题至关重要。
4. 类(Classes)
- 作用:显示类装载信息。
- 用法:在“类”标签中,可以监控 JVM 中类的加载和卸载情况。提供类加载器的相关信息,有助于排查类加载问题。
5. VM 摘要(VM Summary)
- 作用:显示Java虚拟机信息。
- 用法:在“VM概要”标签中,可以查看有关Java虚拟机的详细信息,包括JVM版本、内存设置(如堆大小和非堆大小)、垃圾回收器类型等。这些信息对于了解JVM的配置和调优性能非常有帮助。
6.MBeans
- 作用:显示MBean信息。
- 用法:在“MBeans”标签中,可以浏览和管理Java管理扩展(MBean)服务器中的MBean。MBean是一种Java对象,它符合特定的管理接口,使得开发者可以通过标准的方式对应用程序进行管理。通过MBeans,开发者可以监控和管理应用程序的各种资源,如数据库连接池、消息队列等。此外,还可以执行自定义的管理操作,如重启服务、更改配置参数等。
2. VisualVM
简介
VisualVM 是另一个 JDK 自带(Oracle JDK 9 中已经不再捆绑,需单独下载)的工具,它集成了多个监控和诊断工具,提供了一个统一的界面来监控 Java 应用程序的性能和资源使用情况。VisualVM 支持本地和远程监控,并且可以通过插件扩展功能。同时,VisualVM 支持对 jmap 生成的堆转储文件和 jstack 生成的线程转储文件进行分析
,为离线数据检测提供了有力支持。
使用场景
VisualVM,这一集多种功能于一身的Java性能监控与分析工具,不仅提供CPU使用率、内存使用率、线程活动等实时监控功能,还支持生成性能与内存快照,为您的后续分析与报告提供坚实基础。此外,VisualVM的插件扩展机制,更使其功能无限延伸,满足您的多样化需求。
核心功能矩阵
功能模块 | 监控指标/操作示例 | 使用价值 |
---|---|---|
CPU Profiling | 热点方法分析、调用树、采样/精确模式 | 定位性能瓶颈 |
内存分析 | 堆/非堆内存使用、GC活动、对象直方图 | 发现内存泄漏、优化内存分配 |
线程监控 | 线程状态、死锁检测、线程Dump | 诊断线程阻塞、死锁问题 |
MBean操作 | 动态修改配置、触发GC、查看运行时信息 | 实时干预生产环境 |
快照分析 | 性能快照、内存快照、线程快照 | 历史问题回溯分析 |
插件扩展 | BTrace脚本、TDA分析、GC日志可视化 | 深度定制分析能力 |
启动VisualVM
在 Oracle JDK 6~8 版本中会默认包含在里面,直接使用命令启动
jvisualvm
JDK8的8u361版本及Oracle JDK9之后需要单独下载工具,具体可以参考这篇博客。
启动VisualVM,选择本地或远程Java进程进行监控。在监控界面中,CPU使用率、内存使用率等关键指标一目了然。通过内置的分析器,您可以轻松生成快照与报告,深入挖掘应用性能的秘密。例如,内存分析器将助您发现内存泄漏问题,并详细展示对象的内存使用情况及引用关系。
核心功能
1. 概述(Overview)
作用:
概述标签提供了Java应用程序的基本信息和性能概览。它显示应用程序的启动时间、持续时间、JVM版本、类路径、系统属性等基本信息,以及CPU使用率、内存使用率等关键性能指标。
2. 监视(Monitor)标签
作用:
监视页面用于实时查看 JVM 的关键性能指标,包括堆内存使用情况、非堆内存(如永久代或元空间)使用情况、垃圾回收活动以及加载的类的数量 。用户可以通过此页面手动触发垃圾回收,并观察其对内存的影响。当出现 OutOfMemoryError 时,还可以配置生成堆转储文件。
用法:
- 在监视标签中,你可以看到CPU使用率的实时变化,以及内存的使用情况,包括堆内存的使用量、垃圾回收次数和时间等。
- 类部分显示已加载的类数量和卸载的类数量,帮助你了解类的加载和卸载情况。
- 线程部分显示当前活动的线程数量,以及线程的状态(如运行、等待、阻塞等)。
- 你可以通过监视这些数据,及时发现性能瓶颈或异常行为。
3. 线程(Threads)标签
作用:
线程页面展示了当前 JVM 中所有活动线程的状态,包括线程名称、状态、CPU 使用率等 。这里有一个特别有用的功能是“检测死锁”
,可以帮助识别是否存在线程间的死锁问题。通过时间线视图,可以追踪线程在不同时间段内的状态变化,这对于分析多线程应用中的并发问题非常有帮助。
用法:
- 在线程标签中,你可以看到所有线程的详细信息,包括线程ID、名称、状态、优先级等。
- 你可以通过线程ID或名称进行筛选,找到特定的线程。
- 线程堆栈信息部分显示每个线程的堆栈调用情况,帮助你了解线程的执行路径和状态。
- 如果发现线程死锁或性能问题,你可以通过线程Dump功能生成线程的堆栈信息,并将其保存为文件,以便后续分析。
4. 抽样器(Sampler)标签
作用:
抽样器/剖析器页面允许用户执行 CPU 和内存采样,以了解应用程序中哪些方法消耗了最多的资源 。对于 CPU 分析,可以看到每个方法的调用次数和总执行时间;对于内存分析,则可以查看对象分配的情况及存活的对象数量。这有助于定位性能瓶颈并进行针对性的优化。
用法:
- 在抽样器标签中,你可以选择对CPU或内存进行取样分析。
- 取样过程中,VisualVM会定期收集应用程序的性能数据,包括方法的调用次数、执行时间等。
- 取样完成后,你可以在分析结果中看到每个方法的性能数据,包括方法的调用次数、执行时间占比等。
- 通过这些数据,你可以找到性能瓶颈并进行优化。例如,你可以发现哪些方法占用了较多的CPU时间或内存空间,并考虑对这些方法进行优化。
5. Profiler(分析器)标签
作用:
Profiler标签提供了对Java应用程序的详细性能分析能力。它可以收集应用程序的方法级性能数据,并帮助你找到性能瓶颈。
用法:
- 在Profiler标签中,你可以选择对CPU或内存进行分析。
- 分析过程中,VisualVM会收集应用程序的方法级性能数据,包括方法的调用次数、执行时间等。
- 分析完成后,你可以在分析结果中看到每个方法的性能数据,并可以通过调用树或热点方法视图进行进一步分析。
- 通过这些数据,你可以深入了解应用程序的性能状况,并找到性能瓶颈。例如,你可以发现哪些方法占用了较多的CPU资源或内存空间,并考虑对这些方法进行优化或重构。
6.Visual GC插件
作用:
将可视垃圾收集监视工具集成到VisualVM中。Visual GC附加到应用程序,并收集并以图形方式显示垃圾收集,类加载器和HotSpot编译器性能数据。
用法:
在 VisualVM 中安装插件:点击 工具 -> 插件,选择 可用插件 标签,选中所需插件并点击 安装,然后重启 VisualVM。
离线分析
不能直接连接生产环境
VisualVM通常通过JMX(Java Management Extensions)或JDP(Java Debug Wire Protocol)协议直接连接到正在运行的Java应用程序。这种连接方式适用于本地开发环境或测试环境,因为它允许开发者实时监控和分析应用程序的性能。然而,在生产环境中,直接连接通常是不被允许的。
VisualVM为了收集数据需要与目标JVM建立连接并交换信息,这个过程会占用一定的网络带宽和服务器资源,可能会加重服务器的负担,尤其是在高并发或资源紧张的情况下。此外,开放用于远程监控的端口(例如JMX端口)还可能引入安全风险,如果不正确配置防火墙规则和访问控制,可能导致未授权访问,从而威胁到系统的安全性。因此,在生产环境中,通常建议采用分析由jmap和jstack等工具生成的离线文件的方式来进行故障排查和性能调优,这样可以在不影响生产系统的情况下深入分析潜在问题。
在上一篇文章中介绍了使用jmap创建堆转储、jstack生成线程转储,以及设置JVM参数-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=
自动保存内存溢出时的堆转储文件,本文就不再赘述。
加载堆转储文件
启动VisualVM,然后选择“文件”菜单中的“装入”,接着浏览并选择之前保存的.hprof文件即可开始分析。
3. MAT(Memory Analyzer Tool)
简介
Memory Analyzer (MAT) 是一个开源工具,由 Eclipse 社区开发和维护。它主要用于分析 Java 堆转储文件,帮助开发者识别内存泄漏、分析内存使用情况、查找大对象等。MAT 提供了丰富的图表和报告,使得内存分析变得更加直观和易于理解
使用场景
MAT 适用于需要深入分析内存问题的场景,尤其是在生产环境中出现内存泄漏或内存溢出时。它的强大分析能力使得运维专家可以快速定位内存问题的根本原因,并提供有效的解决方案。
主要功能
- 内存泄漏检测:通过分析堆转储文件,识别潜在的内存泄漏问题。
- 对象占用分析:显示每个对象占用的内存大小,帮助识别内存占用过高的对象。
- 引用链分析:显示对象的引用链,帮助理解对象的生命周期和引用关系。
- 报告生成:生成详细的内存分析报告,便于团队共享和讨论。
安装与启动MAT
你可以从Eclipse Memory Analyzer的官方网站下载最新版本的MAT。安装完成后,启动MAT,选择“File”菜单中的“Open Heap Dump”选项,浏览到你的堆转储文件(通常是一个.hprof文件),并打开它。
常见选项的含义:
Leak Suspects Report
:内存泄漏可疑点报告,自动检查堆转储是否存在泄漏嫌疑,报告哪些对象被保存起来,为什么它们没有被垃圾收集,最常用的模式
。Component Report
: 元件报告,分析一组对象是否存在可疑的内存问题:重复的字符串、空集合、终结器、弱引用等。Re-open previously run reports
: 打开以前的运行报告;
核心功能
1. 泄露疑点(Leak Suspects)
作用:报错概览标签自动分析当前内存泄漏的主要原因,并列出可能的泄漏点和相关对象。
用法:打开MAT后,加载堆快照文件,报错概览通常会在概览(Overview)页签下的Reports部分显示。用户可以查看列出的内存泄漏嫌疑对象,并通过点击详情(detail)链接获取更详细的信息,包括泄漏对象的最快路径和被引用关系。
2. 直方图(Histogram)
作用:直方图列出了堆中每个类及其对应的对象数量和所占用的内存大小,帮助用户了解内存分布情况。
用法:在MAT的概览页签下可以找到直方图。用户可以通过类名(ClassName)进行检索,查看特定类的对象数量和内存占用情况。此外,直方图还支持右键点击对象,查看其引用关系(incoming/outgoing references)。
3. 支配数(Dominator Tree)
作用:支配数视图以占用总内存的百分比方式列举出所有实例对象,帮助用户发现大内存对象及其依赖关系。
用法:在MAT中,支配数视图通常位于概览页签下。用户可以通过该视图了解哪些对象占用了大量内存,并通过点击对象查看其保留集(Retained Set)和引用关系。支配数视图是分析内存泄漏和优化内存使用的重要工具。
4. 线程视图(Thread Overview)
作用:线程视图展示了当前进程dump时的所有线程的堆栈信息,帮助用户定位线程执行的方法层级关系和异常问题。
用法:在MAT中,用户可以通过点击一级导航栏中的线程视图图标来打开该视图。在线程视图中,用户可以查看每个线程的堆栈信息,包括线程名称、状态、优先级以及执行的代码行等。这对于分析线程死锁、性能瓶颈等问题非常有帮助。
5. 顶级消费者(Top Consumers)
作用:Top Consumers标签按照包名和类分组,列出占用内存最多的对象。它帮助开发者快速定位哪些类或包占用了大量内存,从而进行针对性优化。
5. 重复类(Duplicate Classes)
作用:Duplicate Classes标签用于检测由多个类加载器加载的相同类。在Java应用中,如果同一个类被多个类加载器加载,可能会导致内存浪费和潜在问题。通过Duplicate Classes标签,开发者可以快速识别这些问题。
总结
在生产问题定位过程中,选择合适的可视化工具可以大大提高问题诊断的效率和准确性。JConsole、VisualVM 和 MAT 是几款常用的工具,它们各自有不同的优势和适用场景。运维专家应根据具体问题的性质和环境选择合适的工具,并结合实际经验进行深入分析。
通过熟练掌握这些工具,运维团队可以更高效地应对生产环境中的各种挑战,确保系统的稳定性和性能。
相关文章:

JVM生产环境问题定位与解决实战(二):JConsole、VisualVM到MAT的高级应用
生产问题定位指南:几款必备的可视化工具 引言 在上一篇文章中,详细的介绍了JDK自带的一系列命令行工具,,如jps、jmap、jstat、jstack以及jcmd等,这些工具为排查和诊断Java虚拟机(JVM)问题提供…...

c++入门-------命名空间、缺省参数、函数重载
C系列 文章目录 C系列前言一、命名空间二、缺省参数2.1、缺省参数概念2.2、 缺省参数分类2.2.1、全缺省参数2.2.2、半缺省参数 2.3、缺省参数的特点 三、函数重载3.1、函数重载概念3.2、构成函数重载的条件3.2.1、参数类型不同3.2.2、参数个数不同3.2.3、参数类型顺序不同 前言…...

Lua语言入门(自用)
全局与非全局 在lua语言当中没有被local表示的是全局变量 反之则是本地变量(仅仅作用在某个文件,函数,或者代码块) 下面是实例代码和运行结果 --hello.luaA 10;--这样就是全局变量,然后这个编译器如果是大写就是默认的全局变量 local b 3;--这样就是局部变量--reference.…...
大数据开发平台的框架
根据你的需求,以下是从 GitHub 推荐的 10 个可以实现大数据开发平台的项目: 1. Apache Spark Apache Spark 是一个开源的分布式计算框架,适用于大规模数据处理和分析。它提供了强大的数据处理能力,支持实时数据处理、机器学习和…...

X86_64位下的GS寄存器
在 64 位模式下,段机制通常(但不是完全)被禁用,从而创建一个平坦的 64 位线性地址空间。处理器将 CS、DS、ES、SS 的段基地址视为零,从而创建一个与有效地址相等的线性地址。FS 和 GS 段是例外。这些段寄存器ÿ…...
#6【TIP2023】Dif-Fusion
📜 Dif-Fusion: Toward High Color Fidelity in Infrared and Visible Image Fusion With Diffusion Models 🍸 源码:https://github.com/GeoVectorMatrix/Dif-Fusion 🍺 前向扩散过程 前向过程看成是逐步加噪的Markov链,在每一个时间步 t t t ,...
科普:“git“与“github“
Git与GitHub的关系可以理解为:Git是一种软件工具,而GitHub则是一个在线平台,它们是“一家子”。二者的关联最直接体现在你通过Git在GitHub仓库中clone软件包到你的机器中来。 具体来说: 一、Git 定义:Git是一个开源的…...
unplugin-vue-components,unplugin-auto-import,借用ai去学习
好的,我现在需要帮助用户理解他们提供的这段Vite配置代码。用户之前已经询问过关于ElementPlusResolver的导入问题,现在他们展示了在vite.config.ts中使用该解析器的具体配置。我需要逐步分析这段代码,并解释每个部分的作用。 首先ÿ…...
蓝桥杯 2013 省 B 翻硬币
题目背景 小明正在玩一个“翻硬币”的游戏。 题目描述 桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零),比如可能情形是 **oo***oooo,如果同时翻转左边的两个硬币&…...
【硬件设计】DDR3、DDR4、DDR5、DDR6性能对比与硬件设计要点
目录 一、各代DDR技术核心性能指标对比 二、各代DDR技术特性详解 三、硬件设计通用原则与差异化需求 四、技术演进趋势总结 一、各代DDR技术核心性能指标对比 指标DDR3DDR4DDR5DDR6(预测)发布时间2007年2014年2020年预计2026年5传输速率800-1600 MT…...
生成式AI核心技术:扩散模型原理与实战优化
一、数学原理与算法演进 前向扩散过程: 通过T次迭代逐渐添加高斯噪声,β_t遵循cosine调度策略,保证信号平滑湮灭 反向去噪过程: 使用U-Net结构预测噪声,DDPM论文证明可通过简化损失函数实现稳定训练: …...
从网络基础到安全防护:网安运维小白的入门学习路线
今天的主题是给网络安全运维小白的学习建议。 事情是这样的,最近有一位想学网安(偏向网络运维)的新手小白询问我学习的方向和建议。我建议他可以从网络和Linux入手。后来他问了一个我认为非常有价值的问题:“网络部分到底是指什么…...
Python 进阶特性深度解析:从语法糖到内存管理的统一视角
生成式(推导式)的用法与内存效率分析 Python 的推导式不仅仅是语法糖,它们在内存管理和性能方面有着深刻的影响。理解推导式的工作原理,有助于我们写出更高效的代码。 推导式的内存模型分析 列表推导式在 CPython 解释器中的实现实际上比等价的 for 循环更为高效: # 列…...
Linux DMA Engine 基础
1 DMA基础信息查看 /sys/class/dma root:~# ls /sys/class/dma/ dma0chan0 dma1chan10 dma1chan27 dma2chan14 dma2chan30 dma2chan47 dma2chan63 dma3chan21 dma3chan38 dma3chan54 dma0chan1 dma1chan11 dma1chan28 dma2chan15 dma2chan31 dma2chan48 dma2…...

【JavaEE】SpringMVC 请求传参
目录 一、请求二、传递单个参数三、传递多个参数四、传递对象五、RequestParam注解 后端参数重命名(后端参数映射)六、传递数组七、传递集合,RequestParam八、传递JSON数据8.1 JSON字符串和Java对象互转8.1.1 Test注解8.1.2 Java对象转JSON8.…...

观察者模式说明(C语言版本)
观察者模式主要是为了实现一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。下面使用C语言实现了一个具体的应用示例,有需要的可以参考…...

LeetCode 230.二叉搜索树中第K小的元素
题目:给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数)。 思路: 代码: /*** Definition for a binary tree node.* public class Tre…...

11、集合框架
一、简介 Java集合框架位于java.util包中 Collection是Set和List的父类,Collections是工具类,提供了对集合进行排序、遍历等多种算法的实现。 ArrayList: 有序(放进去顺序和拿出来顺序一致),可重复 HashSet: 无序(放进去顺序和拿出来顺序不…...
git常用指令详解
文章目录 Git 基本指令的使用Git 远程仓库Git的分支管理 Git 基本指令的使用 git init //初始化一个git仓库,在当前目录下生成.git文件夹,并且会默认生成一个master分支。git clone <url> [directory] //url为git仓库地址,directory为本地目录 gi…...
Debezium 报错:“The db history topic is missing” 的处理方法
Debezium 报错:“The db history topic is missing” 的处理方法 一、引言 在使用 Debezium 进行数据同步时,可能会遇到一个常见的错误:“The db history topic is missing”。这个错误表明 Debezium 无法找到或访问其数据库历史记录主题(db history topic),这通常是由…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...