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)问题提供…...
【深入理解JWT】从认证授权到网关安全
最近的项目学习中,在进行登陆模块的用户信息验证这一部分又用到了JWT的一些概念和相关知识,特在此写了这篇文章、方便各位笔者理解JWT相关概念 目录 先来理解JWT是什么? 区分有状态认证和无状态认证 有状态认证 VS 无状态认证 JWT令牌的…...
esp工程报错:something went wrong when trying to build the project esp-idf 一种解决办法
最近上手了正点原子esp32s3板子,环境采用的是vscodeesp-idf插件。导入了正点原子的demo测试,每次都报这个错误无法建造。也不是网上说的ninja error,不是中文路径的问题。 在终端中查看,发现是缺少了git。(我这里没有…...
基于MATLAB红外弱小目标检测MPCM算法复现
摘要:本文详细介绍了一种基于人类视觉系统特性的红外弱小目标检测算法——Multiscale patch-based contrast measure (MPCM)。该算法通过增强目标与背景的对比度,有效检测红外图像中的弱小目标,并在MATLAB环境中进行了复现与实验验证。 关键…...
java基础面试篇
目录 1.概念 1.1说一下Java的特点 1.2Java为什么是跨平台的? 1.3 JVM、JDK、JRE三者关系? 1.4为什么Java解释和编译都有? 1.5 jvm是什么? 1.6 编译型语言和解释型语言的区别? 1.7 Python和Java区别是什么&#…...
Java Map实现类面试题
Java Map实现类面试题 HashMap Q1: HashMap的实现原理是什么? HashMap基于哈希表实现,使用数组链表红黑树(Java 8)的数据结构。 public class HashMapPrincipleExample {// 模拟HashMap的基本结构public class SimpleHashMap&…...
Vue2+Three.js加载并展示一个三维模型(提供Gitee源码)
目录 一、案例截图 二、安装Three.js 三、代码实现 四、Gitee源码 一、案例截图 二、安装Three.js npm install three 三、代码实现 模型资源我是放在public文件夹下面的: 完整代码: <template><div><div ref"container&qu…...
Spark内存并行计算框架
spark核心概念 spark集群架构 spark集群安装部署 spark-shell的使用 通过IDEA开发spark程序 1. Spark是什么 Apache Spark™ is a unified analytics engine for large-scale data processingspark是针对于大规模数据处理的统一分析引擎 spark是在Hadoop基础上的改进&…...
DeepSeek等LLM对网络安全行业的影响
大家好,我是AI拉呱,一个专注于人工智领域与网络安全方面的博主,现任资深算法研究员一职,兼职硕士研究生导师;热爱机器学习和深度学习算法应用,深耕大语言模型微调、量化、私域部署。曾获多次获得AI竞赛大奖,拥有多项发明专利和学术论文。对于AI算法有自己独特见解和经验…...
【QT】QLinearGradient 线性渐变类简单使用教程
目录 0.简介 1)qtDesigner中 2)实际执行 1.功能详述 3.举一反三的样式 0.简介 QLinearGradient 是 Qt 框架中的一个类,用于定义线性渐变效果(通过样式表设置)。它可以用来填充形状、背景或其他图形元素࿰…...
可狱可囚的爬虫系列课程 15:防盗链反爬虫的处理
一、防盗链了解 防盗链是一种技术手段,主要用于防止其他网站通过直接链接的方式使用本网站的资源(如图片、文件等),从而节省带宽和服务器资源。当其他网站尝试直接链接到受保护的资源时,服务器会根据设置的规则判断请求…...
Vue组件:从使用到原理的深度解析
一、什么是Vue组件? 组件是Vue的核心特性之一,它允许开发者将UI拆分为独立可复用的代码片段。每个组件本质上是一个Vue实例,具有自己的: 模板(Template) 数据(Data) 方法…...
SpringBoot接入DeepSeek(硅基流动版)+ 前端页面调试
文章目录 前言正文一、项目环境二、项目代码2.1 pom.xml2.2 DeepSeekController.java2.3 启动类2.4 logback-spring.xml2.5 application.yaml2.6 index.html 三、页面调试3.1 参数提示3.2 开始请求3.3 手动断开 前言 作为一个Java程序员,了解前沿科技技术ÿ…...
Lua的table(表)
Lua表的基本概念 Lua中的表(table)是一种多功能数据结构,可以用作数组、字典、集合等。表是Lua中唯一的数据结构机制,其他数据结构如数组、列表、队列等都可以通过表来实现。 表的实现 Lua的表由两部分组成: 数组部分…...
图片爬取案例
修改前的代码 但是总显示“失败” 原因是 修改之后的代码 import requests import os from urllib.parse import unquote# 原始URL url https://cn.bing.com/images/search?viewdetailV2&ccidTnImuvQ0&id5AE65CE4BE05EE7A79A73EEFA37578E87AE19421&thidOIP.TnI…...
【Python爬虫(90)】以Python爬虫为眼,洞察金融科技监管风云
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取,还涉及数据处理与分析。无论是新手小白还是进阶开发…...
idea + Docker + 阿里镜像服务打包部署
一、下载docker desktop软件 官网下载docker desktop,需要结合wsl使用 启动成功的画面(如果不是这个画面例如一直处理start或者是stop需要重新启动,不行就重启电脑) 打包成功的镜像在这里,如果频繁打包会导致磁盘空间被占满,需…...
C#模拟退火算法
模拟退火算法:寻找最优解的神奇 “退火之旅” 在生活中,我们都见过铁匠打铁。铁匠把烧得通红的铁块不断捶打,然后慢慢冷却,这样打造出来的金属制品才更坚固耐用。模拟退火算法就从这个退火过程中获得灵感,在计算机的数…...
网络安全防御模型
目录 6.1 网络防御概述 一、网络防御的意义 二、被动防御技术和主动防御技术 三、网络安全 纵深防御体系 四、主要防御技术 6.2 防火墙基础 一、防火墙的基本概念 二、防火墙的位置 1.防火墙的物理位置 2.防火墙的逻辑位置 3. 防火墙的不足 三、防火墙技术类型 四…...
APP自动化实战
APP自动化能做什么? 请看示例(实现批量的视频,封面功能复用能力(实现效果参考抖音号:71403700901) APP自动化实战-操作剪映APP PO模式 1. PO模式介绍 PO(Page Object)…...
Unity基础——资源导入
一.资源来源 1.Assert Store(Unity资源官方网站) (1)用于制作游戏的优质资源 | Unity Asset Store (2)或则通过Unity项目打开 2.外部资源 (1)淘宝 (2)找外…...
JMeter性能问题
性能测试中TPS上不去的几种原因 性能测试中TPS上不去的几种原因_tps一直上不去-CSDN博客 网络带宽 连接池 垃圾回收机制 压测脚本 通信连接机制 数据库配置 硬件资源 压测机 业务逻辑 系统架构 CPU过高什么原因 性能问题分析-CPU偏高 - 西瓜汁拌面 - 博客园 US C…...
形式化数学编程在AI医疗中的探索路径分析
一、引言 1.1 研究背景与意义 在数字化时代,形式化数学编程和 AI 形式化医疗作为前沿领域,正逐渐改变着我们的生活和医疗模式。形式化数学编程是一种运用数学逻辑和严格的形式化语言来描述和验证程序的技术,它通过数学的精确性和逻辑性,确保程序的正确性和可靠性。在软件…...
DeepSeek开源周Day1:FlashMLA引爆AI推理性能革命!
项目地址:GitHub - deepseek-ai/FlashMLA 开源日历:2025-02-24起 每日9AM(北京时间)更新,持续五天! 一、开源周震撼启幕 继上周预告后,DeepSeek于北京时间今晨9点准时开源「FlashMLA」,打响开源周五连…...
nginx 配置https
参考文档:nginx 文档 -- nginx官网|nginx下载安装|nginx配置|nginx教程 配置 HTTPS 服务器 HTTPS 服务器优化 SSL 证书链 单个 HTTP/HTTPS 服务器 基于名称的 HTTPS 服务器 具有多个名称 的 SSL 证书 服务器名称指示 兼容性 要配置 HTTPS 服务器,ssl…...
GhostBottleneck; InvertedResidual;Squeeze and Excite 是什么,怎么用
GhostBottleneck; InvertedResidual;Squeeze and Excite 是什么,怎么用 目录 GhostBottleneck; InvertedResidual;Squeeze and Excite 是什么,怎么用GhostBottleneckInvertedResidualSqueeze and Excite(SE)GhostBottleneck 概念: GhostBottleneck 是在轻量级神经网…...
Docker启动ES容器打包本地镜像
文章目录 1、安装 Docker2、下载镜像3、查看已下载的镜像4、 保存和加载镜像5、.tar 文件与 Docker 镜像的关系6、如何从 .tar 文件加载 Docker 镜像7、为什么需要 .tar 文件?8、ES 8.x版本无法启动8.1 问题原因8.2 解决方案8.3 提交容器为新镜像 1、安装 Docker 如…...
XXE漏洞:原理、危害与修复方法详解
目录 一、XXE漏洞概述二、XXE漏洞原理三、XXE漏洞危害1. 任意文件读取2. 命令执行3. 拒绝服务攻击(DoS)4. SSRF攻击四、XXE漏洞修复方法1. 禁用外部实体JavaPythonPHP2. 输入验证和过滤3. 安全配置服务器4. 升级解析器版本五、总结一、XXE漏洞概述 XXE(XML External Entity…...
android keystore源码分析
架构 Android Keystore API 和底层 Keymaster HAL 提供了一套基本的但足以满足需求的加密基元,以便使用访问受控且由硬件支持的密钥实现相关协议。 Keymaster HAL 是由原始设备制造商 (OEM) 提供的动态加载库,密钥库服务使用它来提供由硬件支持的加密服…...
状态模式
状态(State)模式属于行为型模式的一种。 状态模式允许对象在其内部状态改变时改变其行为,使其看上去就像改变了自身所属的类一样。 状态模式是为了把一大串if...else...的逻辑给分拆到不同的状态类中,使得将来增加状态比较容易。…...
C++ | 面向对象 | 类
👻类 👾语法格式 class className{Access specifiers: // 访问权限DataType variable; // 变量returnType functions() { } // 方法 };👾访问权限 class className {public:// 公有成员protected:// 受保护成员private:// 私有成员 }…...
鸿蒙-AVPlayer
compileVersion 5.0.2(14) 音频播放 import media from ohos.multimedia.media; import common from ohos.app.ability.common; import { BusinessError } from ohos.base;Entry Component struct AudioPlayer {private avPlayer: media.AVPlayer | nu…...
Android移动应用开发实践-1-下载安装和简单使用Android Studio 3.5.2版本(频频出错)
一、下载安装 1.Android Studio3.5.2下载地址:Android Studio3.5.2下载地址 其他版本下载地址:其他版本下载地址 2.安装教程(可以多找几个看看) 安装 | 手把手教你Android studio 3.5.2安装(安装教程)_a…...
从.m3u8到.mp4:使用批处理脚本完成视频处理的完整指南
这里介绍一个Windows批处理脚本(Windows Batch Script),主要用于处理 .m3u8 ts 视频文件的下载和合并功能。 以下是程序的主要功能和逻辑流程: 功能概述 参数检查与路径处理: 检查是否传递了文件或文件夹路径作为参数…...
qt5的中文乱码问题,QString、QStringLiteral 为 UTF-16 编码
qt5的中文乱码问题一直没有很明确的处理方案。 今天处理进程间通信时,也遇到了qt5乱码问题,一边是设置的GBK,一边设置的是UTF8,单向通信约定采用UTF8。 发送端保证发的是UTF8字符串,因为UTF8在网络数据包中没有字节序…...
Gurobi 并行计算的一些问题
最近尝试用 gurobi 进行并行计算,即同时用多个 cpu 核计算 gurobi 的 model,但是发现了不少问题。总体来看,gurobi 对并行计算的支持并不是那么好。 gurobi 官方对于并行计算的使用在这个网址,并有下面的大致代码: i…...
Vue3 中如何实现响应式系统中的依赖收集和更新队列的解耦?
一、问题解析:为什么需要解耦? 在响应式系统中,依赖收集(追踪数据与视图的关联关系)和更新队列(批量处理数据变化带来的副作用)是两个核心但职责不同的模块。 Vue3 通过以下设计实现解耦&…...
vue项目中动态添加类名样式不生效问题
一、问题描述 在vue项目中使用:class{tableContent: summary}给元素动态添加了类名tableContent,运行代码后查看类名已经添加成功但样式并未生效。 二、问题产生原因并解决 刚开始把样式写在了<style lang"scss" scoped></style>中&#x…...
供应链管理系统--升鲜宝门店收银系统功能解析,登录、主界面、会员 UI 设计图(一)
供应链管理系统--升鲜宝门店收银系统功能解析,登录、主界面 会员 UI 设计图(一)...
用AI写游戏3——deepseek实现kotlin android studio greedy snake game 贪吃蛇游戏
项目下载 https://download.csdn.net/download/AnalogElectronic/90421306 项目结构 就是通过android studio 建空项目,改下MainActivity.kt的内容就完事了 ctrlshiftalts 看项目结构如下 核心代码 MainActivity.kt package com.example.snakegame1// MainA…...
设计模式的引入
面向对象设计原则 1. 软件设计固有的复杂性2. 面向对象设计原则2.1 引入2.2 依赖倒置原则2.3 开放封闭原则2.4 单一职责原则2.5 Liskov 替换原则( LSP)2.6 接口隔离原则( ISP)2.7 优先使用对象组合,而不是类继承2.8 封…...
P8697 [蓝桥杯 2019 国 C] 最长子序列
P8697 [蓝桥杯 2019 国 C] 最长子序列 题目 分析代码 题目 分析 先分析一波xdm 题意呢就是在s中找有多少个能和t匹配的字符,注意:连续匹配,输出连续的次数 欧克,开始分析,首先,哎~字母!还强调…...
基于阿里云PAI平台快速部署DeepSeek大模型实战指南
一、DeepSeek大模型:企业级AI应用的新标杆 1.1 为什么选择DeepSeek? 近期,DeepSeek系列模型凭借其接近GPT-4的性能和开源策略,成为全球开发者关注的焦点。在多项国际评测中,DeepSeek-R1模型在推理能力、多语言支持和…...
【java进阶】java多态深入探讨
前言 在Java的编程宇宙中,多态是极为关键的概念,它宛如一条灵动的纽带,串联起面向对象编程的诸多特性,赋予程序宛如生命般的动态活力与高度灵活性。透彻理解多态,不仅是提升代码质量的关键,更是开启高效编程大门的钥匙。 一、多态的定义与本质 多态,从概念层面来讲,…...
蓝桥杯备赛-拔河
问题描述 小明是学校里的一名老师,他带的班级共有 nn 名同学,第 ii 名同学力量值为 aiai。在闲暇之余,小明决定在班级里组织一场拔河比赛。 为了保证比赛的双方实力尽可能相近,需要在这 nn 名同学中挑选出两个队伍,…...
Zookeeper(67) Zookeeper在HBase中的应用是什么?
Zookeeper 在 HBase 中起到了至关重要的作用,主要用于协调和管理 HBase 集群中的多个组件。具体来说,Zookeeper 在 HBase 中的应用包括以下几个方面: Master 选举:HBase 集群中可以有多个 Master 节点,但只有一个处于…...
java后端开发day20--面向对象进阶(一)--static继承
(以下内容全部来自上述课程) 1.static–静态–共享 static表示静态,是java中的一个修饰符,可以修饰成员方法,成员变量。 1.静态变量 被static修饰的成员变量,叫做静态变量。 特点: 被该类…...
IDEA使用Maven方式构建SpringBoot项目
1、环境准备 确保你已经安装了以下工具: Java JDK(推荐 JDK 8 或更高版本) IntelliJ IDEA(推荐使用最新版本) 2、创建 Spring Boot 项目 (1) 打开 IntelliJ IDEA。 (2)…...
Spring Boot2.0之十 使用自定义注解、Json序列化器实现自动转换字典类型字段
前言 项目中经常需要后端将字典类型字段值的中文名称返回给前端。通过sql中关联字典表或者自定义函数不仅影响性能还不能使用mybatisplus自带的查询方法,所以推荐使用自定义注解、Json序列化器,Spring的缓存功能实现自动转换字典类型字段。以下实现Spri…...
C#问题解决方案 --- 生成软件hash,生成文件hash
生成软件hash值: private string GetEXEHashString() {//获得软件哈希值Process currProcess Process.GetCurrentProcess();string filePath currProcess.MainModule.FileName;string hashEXE string.Empty;using (FileStream fs new FileStream(filePath, Fil…...