当前位置: 首页 > news >正文

JVM 内存调优

内存调优

内存泄漏(Memory Leak)和内存溢出(Memory Overflow)是两种常见的内存管理问题,它们都可能导致程序执行不正常或系统性能下降,但它们的原因和表现有所不同。

内存泄漏

内存泄漏(Memory Leak)指的是程序在动态分配内存后,未能正确释放或回收已经不再使用的内存,导致这部分内存无法再被程序使用,同时也不能被操作系统重新分配。每次内存泄漏都会使得系统的可用内存减少,长时间运行的程序可能会耗尽可用的内存资源,最终导致系统性能下降甚至崩溃。

在 Java 中如果不再使用一个对象,但是该对象依然在 GC ROOT 的引用链上,这个对象则不会被垃圾回收器回收,这种情况就是内存泄漏。如果对象之间存在循环引用并且没有适当地断开引用,这些对象可能也不会被垃圾回收器正确地释放。

内存泄漏大多数情况都是由于堆内存泄漏引起的。

内存溢出

内存溢出指的是程序试图分配超过其可用内存的空间。当程序尝试向已经被其他程序或操作系统占用的内存地址空间分配内存时,会导致内存溢出。通常会导致程序崩溃或异常终止。

程序在运行时请求了大量的内存,超过了系统当前可用的物理内存或虚拟内存。或者是递归函数未能正确地终止,导致了堆栈的溢出。

当然,内存泄漏也会导致内存溢出,例如在一些大型的 Java 后端应用中,在处理用户请求之后未能及时将用户的数据删掉,随着用户请求数量越来越多,持续内存泄漏的对象占满整个堆内存最终导致了内存溢出。但是产生内存溢出的并不仅仅只有内存泄漏这一种原因

解决内存溢出的四个步骤:

image-20240708170733992

在 Linux 环境下,可以使用top命令查看系统的进程信息,它提供了实时系统资源的使用情况,进程使用的内存为 RES(常驻内存) - SHR(共享内存)。但是该命令只能查看最基础的进程信息,无法查看每个部分(如堆、方法区、堆外等)的内存占用,也无法查看内存变化的趋势图。

这个时候可以使用另一个工具:VisualVM

VisualVM是多功能合一的Java故障排除工具并且他是一款可视化工具,整合了命令行 JDK 工具和轻量级分析功能,功能非常强大。

这款软件在0racle JDK6~8中发布,但是在 0racle JDK9 之后不在JDK安装目录下需要单独下载。下载地址:https://visualvm.github.io

JDK 8及以下版本可以在 JDK 的 bin 目录下找到jvisualvm.exe程序,双击打开即可。而 8 以上的版本下载解压完成之后,在解压后的bin目录下找到visualvm.exe程序双击打开。

在 IDEA 中快速启动 VisualVM,直接在 IDEA 中下载 VisualVM Launcher 插件,然后在设置中的其他设置里面配置之前下载好的visualvm.exe程序路径。

image-20240708175709107

运行是选择用 VisualVM 运行即可

image-20240708175743548

注意:VisualVM 仅限于测试时本地使用,禁止访问生产环境下的进程程序,其中的一些功能(如手动 Full GC )会导致生产环境下的用户进程暂停。

VisualVM 虽然可以实现实时监控系统的详细数据,但是对大量集群化部署的 Java 进程需要手动进行管理,非常麻烦。

image-20240708205310012

产生原因

equals() 与 hashCode() 导致的内存泄漏

在定义新类时没有重写正确的equals()和hashCode()方法。在使用HashMap的场景下,如果使用这个类对象作为key,HashMap在判断key是否已经存在时会使用这些方法,如果重写方式不正确,会导致相同的数据被保存多份。

public class UserTest{public static long count = 0;public static Map<User,Long> userMap = new HashMap<>();public static void main(String[] args) throws InterruptedException {while(true) {if(count++ % 100 == 0) {Thread.sleep(100);}userMap.put(new User(1L, "xiaoming"),5L);}}
}class User {private Long id;private String username;private byte[] bytes;public User(Long id, String username) {this.id = id;this.username = username;this.bytes = new byte[1024];}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}
}

因为 hashCode 方法未实现,会导致相同id的用户对象计算出来的hash值并不同,会被分配到不同的槽中。而 equals 方法未实现,会导致 key 在比对的时候,即使用户对象的id是相同的,也会被认定为不同的key。

所以在阿里巴巴java开发手册中就有这样的规定,其目的也是为了防止编码的不规范而出现内存溢出:
image-20240709105655542

这种问题的解决方案有以下三点:

  1. 在定义新实体时,始终重写 equals() 和 hashCode() 方法。
  2. 重写时一定要确定使用了唯一标识去区分不同的对象,比如用户的 id 等。
  3. Hashmap 使用时尽量使用编号 id 等数据作为 key,不要将整个实体类对象作为 key 存放。

内部类引用外部类

非静态的内部类默认会持有外部类,尽管代码上不再使用外部类,所以如果有地方引用了这个非静态内部类,会导致外部类也被引用,垃圾回收时无法回收这个外部类。

匿名内部类对象如果在非静态方法中被创建,会持有调用者对象,垃圾回收时无法回收调用者。

/*** 外部类** @author HeXin* @date 2024/07/09*/
public class Outer {private byte[] bytes = new byte[1024 * 1024];private static String name = "外部类";public List<String> newList(){List<String> list = new ArrayList<>();list.add("1");list.add("2");list.add("3");return list;}/*** 内部类** @author HeXin* @date 2024/07/09*/class Inner{private String name;public Inner(){this.name = Outer.name + "==> 内部类";System.out.println(this.name);}}public static void main(String[] args) {int count = 0;List<Inner> inners = new ArrayList<>();List<Object> objects = new ArrayList<>();// 非静态的内部类默认会持有外部类,会导致外部类也被引用,垃圾回收时无法回收这个外部类。while(true) {System.out.println(++count);inners.add(new Outer().new Inner());}// 匿名内部类对象如果在非静态方法中被创建,会持有调用者对象,垃圾回收时无法回收调用者。while(true) {System.out.println(++count);objects.add(new Outer().newList());}}
}

解决上述内存溢出问题的办法是:

  1. 若不想持有外部类对象,应该使用静态内部类,而使用内部类的原因是可以直接获取外部类中的成员变量值。
  2. 使用静态方法,避免匿名内部类持有调用者对象。

ThreadLocal 使用后未及时清理

若仅仅只是使用手动创建的线程,即便没有调用 ThreadLocal 的 remove 方法清理数据,也不会产生内存泄漏问题。因为线程被回收时,ThreadLocal 也同样会被回收,但若使用线程池则不一样,有可能会出现内存泄漏问题。

// 未发送内存泄漏
public class ThreadLocalTest {public static ThreadLocal<Object> threadLocal = new ThreadLocal<>();public static void main(String[] args) throws InterruptedException {while(true) {new Thread(()->{threadLocal.set(new byte[1024 * 1024 * 100]);}).start();Thread.sleep(100);}}
}
public class ThreadLocalTest {public static ThreadLocal<Object> threadLocal = new ThreadLocal<>();public static void main(String[] args) throws InterruptedException {ThreadPoolExecutor executor = new ThreadPoolExecutor(Integer.MAX_VALUE,Integer.MAX_VALUE,0, TimeUnit.DAYS,new SynchronousQueue<>());int count = 0;while(true) {System.out.println(executor.getPoolSize());executor.execute(()-> threadLocal.set(new byte[1024 * 1024 * 1024]));Thread.sleep(100);}}
}

当线程方法执行完毕后,一定要调用 ThreadLocal 中的 remove 方法清理对象。

String 的 intern 方法

在 JDK6 中字符串常量池位于堆内存中的Perm Gen永久代中,如果不同字符串的 intern 方法被大量调用,字符串常量池会不停的变大超过永久代内存上限之后就会产生内存溢出问题。

解决办法:

  1. 注意代码逻辑,尽量不要将随机生成的字符串加入字符串常量池。
  2. 增大永久代空间的大小,根据实际的测试/估算结果进行设置JVM参数-XX:MaxPermSize=512M

通过静态字段保存对象

如果大量数据在静态变量中被长期引用,数据就不会得到释放。若这些数据将永久不被使用,则这些数据也成为了内存泄漏。

  1. 尽量减少将对象长时间的保存在静态变量中,如果不再使用,必须将对象删除(比如在集合中)或
    者将静态变量设置为 null。
  2. 使用单例模式时,尽量使用懒加载( @Lazy 懒加载注解 ),而不是立即加载。
  3. Spring 的 Bean 中不要长期存放大对象,如果是缓存用于提升性能,尽量设置过期时间定期失效。

并发请求问题

并发请求问题指用户通过发送请求向 Java 程序获取数据,正常情况下 Java 后端程序将数据返回之后,这部分数据就可以在内存中被释放掉。但是由于用户的并发请求量有可能很大,同时处理数据的时间很长,导致大量的数据存在于内存中,最终超过了内存的上限,导致内存溢出。这类问题的处理思路和内存泄漏类似,首先要定位到对象产生的根源。

快速定位

当堆内存溢出时,需要在堆内存溢出时将整个堆内存保存下来,生成内存快照(Heap Profile)文件。

使用MAT打开hprof文件,并选择内存泄漏检测功能,MAT会自行根据内存快照中保存的数据分析内存泄漏的根源。

如果想要生成内存快照则需要添加以下的 JVM 参数:

-XX:+HeapDumpOnOutOfMemoryError:当程序发生内存溢出(Out of Memory Error)错误时,会自动生成 hprof 内存快照文件。

-XX:HeapDumpPath=<path>:指定 hprof 文件的输出路径。

如果需要导出运行中系统的内存快照,有两种方式,注意只需要导出标记为存活的对象

  1. 通过JDK自带的jmap命令导出,格式为:

    jmap -dump:live,format=b,file=文件路径和文件名 进程ID
    
  2. 通过arthas的heapdump命令导出,格式为:

    heapdump --live 文件路径和文件名
    

在开发使用的机器内存范围内的快照文件,可以直接使用 MAT 打开分析。但是可能经常遇到服务器上的程序占用的内存达到 10G 之上的,开发环境无法正常打开内存快照的情况,并且还需要将其快照文件下载转移到开发环境,也是一个较为耗时的操作。此时需要下载服务器操作系统对应的MAT(https://eclipse.dev/mat/downloads.php)。

然后在服务器上执行下面的 MAT 中的脚本生成分析报告(几个静态页面),将其转移到开发环境中查看分析。

# suspects->内存泄漏检测报告  overview->总览图  top_components->组件图
./ParseHeapDump.sh 快照文件路径 org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components

注意:默认MAT分析时只使用了1G的堆内存,如果快照文件超过1G,需要修改MAT目录下的 MemoryAnalyzer.ini配置文件调整最大堆内存。最好修改为快照文件大小的 1.5 倍左右

MAT 内存泄漏检测原理

MAT提供了称为支配树(Dominator Tree)的对象图。支配树展示的是对象实例间的支配关系。在对象引用图中,所有指向对象B的路径都经过对象A,则认为对象A支配对象B。

image-20240712172832705

支配树中对象本身占用的空间称之为浅堆(Shallow Heap)

支配树中对象的子树就是所有被该对象支配的内容,这些内容组成了对象的深堆(Retained Heap),也称之为保留集(Retained Set )。深堆的大小表示该对象如果可以被回收,能释放多大的内存空间。

image-20240712173043378

MAT就是根据支配树,从叶子节点向根节点“收缩”遍历,若发现深堆的大小超过整个堆内存的一定比例阈值,则会将其标记为内存泄露的可疑对象

修复问题

造成内存溢出问题的原因有以下三点:

  1. 编写代码时代码规范意识不强,导致其产生了代码中的内存泄漏。
  2. 由于参数设置不合理,并发场景下引起内存溢出,例如堆内存设置过小,会导致并发量增加之后超过堆内存的上限。
  3. 系统的设计方案不合理,例如直接使用*查询数据库,获取大量无用数据;线程池的设计不合理(线程池参数设置不当,会导致大量线程的创建或者队列中保存了大量的数据)等。

相关文章:

JVM 内存调优

内存调优 内存泄漏&#xff08;Memory Leak&#xff09;和内存溢出&#xff08;Memory Overflow&#xff09;是两种常见的内存管理问题&#xff0c;它们都可能导致程序执行不正常或系统性能下降&#xff0c;但它们的原因和表现有所不同。 内存泄漏 内存泄漏&#xff08;Memo…...

数据结构(java)栈与队列

栈&#xff1a;&#xff08;先进后出&#xff09; 入栈: 1.普通栈一定要放、最小栈放的原则是: *如果最小栈是空的&#xff0c;那么放 *如果最小栈的栈顶元素没有当前的元素小&#xff0c;则放 2.如果要放的的元素小于等于最小栈栈顶元素可以放吗?放 出栈: 需要…...

医疗大模型落地方案:技术选型、部署策略与调优

医疗大模型的落地应用已成为推动医疗行业数字化转型的重要引擎。本文将从技术选型、部署策略和调优方案三大维度&#xff0c;系统性地解析医疗大模型落地的关键要素&#xff0c;为医疗机构提供可操作的落地指南。随着人工智能技术的快速发展&#xff0c;医疗大模型已在影像诊断…...

JVM:类加载子系统

一、类加载子系统概述 类加载子系统由多个类加载器组成&#xff0c;它们负责从文件系统或者网络中读取二进制形式的字节码&#xff08;.class&#xff09;文件&#xff0c;并将其加载进 JVM。字节码文件中关于类的定义、类中属性的定义、类中方法的定义以及类中方法的字节码等…...

独家!美团2025校招大数据题库

推荐阅读文章列表 2025最新大数据开发面试笔记V6.0——试读 我的大数据学习之路 面试聊数仓第一季 题库目录 Java 1.写一个多线程代码 2.写一个单例代码 3.LinkedBlockingQueue原理 4.模板设计模式 5.如何设计一个 生产者-消费者队列 6.堆内存和栈内存 7.ThreadLo…...

Angular 框架详解:从入门到进阶

Hi&#xff0c;我是布兰妮甜 &#xff01;在当今快速发展的 Web 开发领域&#xff0c;Angular 作为 Google 主导的企业级前端框架&#xff0c;以其完整的解决方案、强大的类型系统和丰富的生态系统&#xff0c;成为构建大型复杂应用的首选。不同于其他渐进式框架&#xff0c;An…...

使用Vue 3与.NET 8.0通过SignalR实现实时通信,并结合JWT身份验证

实时通信是一个非常重要的功能。SignalR是一个强大的库&#xff0c;能够帮助我们轻松实现客户端和服务器之间的实时数据传输。本文将结合你的代码示例&#xff0c;向你展示如何使用Vue 3作为前端框架&#xff0c;ASP.NET Core作为后端框架&#xff0c;通过SignalR实现实时消息通…...

Harmonyos-Navigation路由跳转

Harmonyos-Navigation路由跳转 概述Navigation路由跳转模块内页面路由系统路由表测试页代码创建并配置路由表文件配置创建好的路由表文件跳转页面 自定义路由表 跨模块路由封装库模块路由跳转工具类 概述 Navigation是路由容器组件&#xff0c;一般作为首页的根容器&#xff0…...

《人工智能应用创新》5天出审稿意见!

期刊简介 《人工智能应用创新&#xff08;Innovative Applications of AI&#xff09;》 &#xff08;ISSN&#xff1a;3078-2147&#xff09;是由香港修墨信息工程研究院举办&#xff0c;经国际同行评审后收录的学术期刊。本刊共分三个栏目&#xff1a;综述分析、应用示范、前…...

Excel数据自动填充到Word自定义表格

上一份工作在一家国企做软件测试&#xff0c;需求变来变去&#xff08;3天一小改&#xff0c;5天换版面&#xff09;&#xff0c;xmind要先整理一遍测试用例&#xff08;版本迭代&#xff0c;该废的废&#xff0c;该加的加&#xff09;&#xff0c;完了细节在禅道里补充&#x…...

Spring Boot一次接口请求涉及的完整执行链路

Spring Boot一次接口请求涉及的完整执行链路 &#x1f501; Spring 项目请求执行链路&#xff08;简化视图&#xff09; 客户端请求&#xff08;浏览器、Postman&#xff09;↓ Tomcat&#xff08;Servlet 容器&#xff09;↓ 【Listener 监听器】↓ 【Filter 过滤器】&#x…...

mapbox基础,加载视频到地图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️raster 栅格图层 api二、🍀加载视频到…...

Android动态化技术优化

Android动态化技术优化 一、WebView优化基础 1.1 WebView性能瓶颈 初始化耗时内存占用高页面加载慢白屏问题 1.2 WebView基本配置 class OptimizedWebView : WebView {init {// 开启硬件加速setLayerType(LAYER_TYPE_HARDWARE, null)// 配置WebSettingssettings.apply {//…...

Spring Boot 自定义定时任务组件深度解析:Quartz 集成与设计模式实战

一、组件设计目标 解决痛点&#xff1a; 简化 Quartz 原生 API 的复杂性统一任务调度管理&#xff08;增删改查、日志、重试&#xff09;与 Spring Boot 生态无缝整合 二、实现步骤详解 1. 组件初始化配置 1.1 初始化 Quartz 表结构 下载 SQL 脚本 &#x1f517; 官方表…...

Java Bean演进历程:从POJO到Spring Boot配置绑定

一、早期阶段&#xff1a;手动编写Java Bean 基本结构 私有属性&#xff1a;所有字段均为private&#xff0c;保证封装性。 公共构造方法&#xff1a;提供无参构造&#xff08;JavaBean规范&#xff09;或有参构造&#xff08;POJO常见&#xff09;。 Setter/Getter方法&…...

信息科技伦理与道德0:课程安排

1 课程安排 分组讨论的议题如下&#xff1a; 1.1 生成对抗网络&#xff08;GAN&#xff09; &#xff08;1&#xff09;GAN生成伪造人脸与身份冒用风险 算法原理&#xff1a; GAN通过生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discriminator&#xff09;…...

STM32F103C8T6-基于FreeRTOS系统实现步进电机控制

引言 上一篇文章讲述了如何使用蓝牙连接stm32进行数据收发控制步进电机&#xff0c;这篇在之前的基础上通过移植操作系统&#xff08;FreeRTOS或者其他的也可以&#xff0c;原理操作都类似&#xff09;实现步进电机控制。 上篇博客指路&#xff1a;STM32蓝牙连接Android实现云…...

数字资产和交易解决方案

数字资产和交易解决方案 一、背景 &#xff08;一&#xff09;数字经济的蓬勃发展 随着信息技术的飞速发展&#xff0c;数字经济已成为全球经济增长的新引擎。数字资产作为数字经济的重要组成部分&#xff0c;其价值逐渐被人们所认识和重视。数字资产包括但不限于数字货币、…...

计算机网络 实验四 静态路由的配置与应用

一、实验目的 熟悉路由器的工作原理&#xff1b;熟悉静态路由的原理&#xff1b;熟悉华为网络模拟器的使用方法&#xff1b;掌握网络拓扑图的绘制&#xff1b;掌握路由器的配置。 二、实验设备 PC、华为模拟器ENSP。 三、实验步骤 知识准备&#xff1a;路由器和静态路由的…...

二进制求和 - 简单

************* C topic: 67. 二进制求和 - 力扣&#xff08;LeetCode&#xff09; ************* Give the topic an inspection. Too many works these days. And no spare time for code learning. However here I am gagin. This topic is an easy one and I want to pra…...

【C++】 —— 笔试刷题day_18

一、压缩字符串(一) 题目解析 题目给定一个字符str&#xff0c;让我们将这个字符串进行压缩&#xff1b; **压缩规则&#xff1a;**出现多次的字符压缩成字符数字&#xff1b;例如aaa压缩成a3。如果字符值出现一次&#xff0c;1不用写。 算法思路 这道题总的来说就非常简单了…...

LeetCode 热题 100_最长递增子序列(87_300_中等_C++)(动态规划)

LeetCode 热题 100_最长递增子序列&#xff08;87_300&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;动态规划&#xff09;&#xff1a; 代码实现代码实现&#xff08;思路一&#xff08;动态规划&#xf…...

asp-for等常用的HTML辅助标记?

在ASP.NET Core Razor Pages 和 MVC 中&#xff0c;除了asp-for之外&#xff0c;还有许多常用的 HTML 辅助标记&#xff0c;下面为你详细介绍&#xff1a; 表单与路由相关 asp-action 和 asp-controller 用途&#xff1a;这两个标记用于生成表单或链接的 URL&#xff0c;指定…...

map用法介绍

在 C 里&#xff0c;map是标准库提供的一种关联容器&#xff0c;它以键 - 值对的形式存储元素&#xff0c;并且按键的升序排列。下面为你展示如何在 C 用map。 如果没有用万能头的时候&#xff0c;需要加入#include 用法介绍&#xff1a; 映射[需要注意map的映射是1对1的不能出…...

AIGC-十款知识付费类智能体完整指令直接用(DeepSeek,豆包,千问,Kimi,GPT)

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列AIGC(GPT、DeepSeek、豆包、千问、Kimi)👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资…...

一页概览:桌面虚拟化方案

2010年左右手绘的&#xff0c;用的是公司的信纸&#xff0c;马克笔。当时在买VMware和Citrix的桌面虚拟化方案&#xff0c;以及Wyse的瘦客户端。...

通过导入 Excel 的方式复制文件或文件夹

在进行文件或文件夹的批量整理时&#xff0c;许多人都会遇到需要将大量文件或文件夹复制到另一个文件夹中的问题。传统的手动复制粘贴方法不仅繁琐&#xff0c;而且效率低下。今天给大家介绍一种方法&#xff0c;可以实现将多个不同文件夹中的文件复制到一个或者多个文件夹&…...

Python单例设计模式深度解析

目录 一、什么是单例设计模式 核心特点 二、为什么需要单例模式 典型应用场景 优势对比 三、Python实现单例的三种方式 1. 使用__new__方法&#xff08;经典实现&#xff09; 2. 使用装饰器实现 3. 使用模块实现&#xff08;Python特有&#xff09; 四、深入理解__new…...

WPF 图标原地旋转

如何使元素原地旋转 - WPF .NET Framework | Microsoft Learn <ButtonRenderTransformOrigin"0.5,0.5"HorizontalAlignment"Left">Hello,World<Button.RenderTransform><RotateTransform x:Name"MyAnimatedTransform" Angle"…...

深入解析Java日志框架Logback:从原理到最佳实践

Logback作为Java领域最主流的日志框架之一&#xff0c;由Log4j创始人Ceki Glc设计开发&#xff0c;凭借其卓越的性能、灵活的配置以及与SLF4J的无缝集成&#xff0c;成为企业级应用开发的首选日志组件。本文将从架构设计、核心机制、配置优化等维度全面剖析Logback的技术细节。…...

【设计模式——装饰器模式】

在 Unity 游戏开发中&#xff0c;装饰模式是一种非常灵活的设计模式&#xff0c;用于在运行时动态地为对象添加功能。以下是装饰模式的设计思路和实现步骤&#xff0c;以角色的装备系统为例进行说明。 设计思路 装饰模式的核心思想是通过创建一个装饰器类来包装原有的对象&am…...

在 macOS 上切换默认 Java 版本

下载javasdk 打开android studio -> setting -> build.execution,dep -> build tools -> gradle -> Gradle JDK -> download JDK… 点击下载&#xff0c;就下载到了 ~/Library/Java/JavaVirtualMachines/ 安装 jenv brew install jenv将 jenv 集成到 Shell …...

【Linux网络与网络编程】11.数据链路层mac帧协议ARP协议

前面在介绍网络层时我们提出来过一个问题&#xff1a;主机是怎么把数据交给路由器的&#xff1f;那里我们说这是由数据链路层来做的。 网络上的报文在物理结构上是以mac帧的形式流动的&#xff0c;但在逻辑上是以IP流动的&#xff0c;IP的流动是需要mac帧支持的。 数据链路层解…...

158页PPT | 某大型研发制造集团信息化IT规划整体方案

该文档是某大型研发制造集团信息化IT规划整体方案&#xff0c;涵盖项目过程回顾、信息平台分析、现状评估、规划及治理建议和下阶段工作计划。项目旨在理解集团战略目标&#xff0c;评估信息化应用现状&#xff0c;制定可扩展的蓝图&#xff0c;明确未来3年管理与IT建设子项目&…...

ON DUPLICATE KEY UPDATE 更底层解释它的优势

从更底层来看&#xff0c;ON DUPLICATE KEY UPDATE 的优势主要源于以下几个方面&#xff1a; 1. 减少网络往返次数 先查询再更新&#xff1a;这种方式需要客户端和数据库服务器之间进行多次网络通信。首先&#xff0c;客户端发送一个 SELECT 查询请求&#xff0c;然后等待服务…...

Python 赋能区块链金融——从零构建智能交易系统

Python 赋能区块链金融——从零构建智能交易系统 引言:区块链金融系统的崛起 区块链技术正在颠覆传统金融体系,带来去中心化、透明化和高效的交易模式。从 DeFi(去中心化金融)到 NFT 市场,区块链金融系统已成为 Web 3.0 生态的重要支柱。如何用 Python 构建一个区块链金…...

基础(测试用例设计方法:流程图法,等价类划分法,边界值分析法,判定表法,正交分析法,错误推测法,其他方法,案例)

目录 流程图法&#xff08;场景法&#xff09; 业务流程 流程图 流程图法设计测试用例 案例-退款泳道图 案例-刷视频流程 等价类划分法 等价类 等价类设计测试用例 案例1-验证电话号码 案例2-验证邮箱格式 边界值分析法 测试数据的选取 边界值法设计测试用例 案例…...

QT —— 信号和槽(槽函数)

QT —— 信号和槽 信号和槽信号(Signal)槽(Slot)声明方式工作原理连接方式1. 传统连接方式(Qt4风格)2. 新式连接方式(Qt5风格) 区分槽函数和信号通过QtCreator生成信号槽代码自动生成槽函数显式连接的优势命名约定自动连接的局限性最佳实践建议结论 我们之前对QT&#xff0c;有…...

ROS2模块库概览

一、核心通信与基础库&#xff08;最常用&#xff09; 客户端库 rclcpp (ROS Client Library for C) 核心API&#xff1a;create_node(), create_publisher(), create_subscription()高级特性&#xff1a; 生命周期节点&#xff1a;通过rclcpp_lifecycle实现configure/activate…...

HADOOP——序列化

1.创建一个data目录在主目录下&#xff0c;并且在data目录下新建log.txt文件 2.新建flow软件包&#xff0c;在example软件包下 FlowBean package com.example.flow;import org.apache.hadoop.io.Writable;import java.io.DataInput; import java.io.DataOutput; import java.i…...

第五章 5.2ESP32物联网应用:HTTP与Web服务器详细教学

本文将详细讲解如何在ESP32上搭建Web服务器&#xff0c;通过HTTP协议实现远程控制LED灯。每行代码均有详细注释&#xff0c;适合零基础学习。 一、HTTP协议基础 HTTP是客户端&#xff08;浏览器&#xff09;和服务器之间的通信协议&#xff0c;常用请求方法&#xff1a; GET&a…...

c++11 绑定器bind

文章目录 std::bind 使用总结&#xff08;C11&#xff09;1. 绑定普通函数2. 使用占位符 _1, _2&#xff0c;调用时传参数3. 绑定类的成员函数&#xff08;类外&#xff09;4. 绑定类的成员函数&#xff08;类内&#xff09;5. 占位符结合成员函数小结 std::bind 使用总结&…...

实现时间最优轨迹生成/轨迹规划方法(TOTG),不使用moveit,可用于ROS驱动机械臂FollowJointTrajectoryGoal()

前言 在我的这篇文章&#xff1a;https://blog.csdn.net/weixin_45702459/article/details/139293391?spm1011.2415.3001.5331中&#xff0c;写了不使用moveit来ros驱动机械臂的方法&#xff0c;也就是用FollowJointTrajectoryGoal()来进行一系列点的关节运动&#xff0c;其实…...

2025年推荐使用的开源大语言模型top20:核心特性、选择指标和开源优势

李升伟 编译 随着人工智能技术的持续发展&#xff0c;开源大型语言模型&#xff08;LLMs&#xff09;正变得愈发强大&#xff0c;使最先进的AI能力得以普及。到2025年&#xff0c;开源生态系统中涌现出多个关键模型&#xff0c;它们在各类应用场景中展现出独特优势。 大型语言…...

高并发多级缓存架构实现思路

目录 1.整体架构 3.安装环境 1.1 使用docket安装redis 1.2 配置redis缓存链接&#xff1a; 1.3 使用redisTemplate实现 1.4 缓存注解优化 1.4.1 常用缓存注解简绍 1.4.2 EnableCaching注解的使用 1.4.3使用Cacheable 1.4.4CachePut注解的使用 1.4.5 优化 2.安装Ngin…...

Qt 的 事件队列

Qt 的 事件队列 是其核心事件处理机制之一&#xff0c;用于管理和分发系统与用户生成的事件&#xff08;如鼠标点击、键盘输入、定时器、信号槽中的队列连接等&#xff09;。理解 Qt 的事件队列对多线程、界面响应以及异步处理尤为关键。 一、Qt 的事件处理模型概览 Qt 是基于…...

html-css样式

1. 所有类型为文本的 元素的样式 指定所有类型为文本的 元素的样式 /* 文本框的样式 */ input[type"text"] { font-size: 25px;width: 80px; /* 文本框的宽度 */ padding: 25px; } font-size&#xff1a;字体大小 width&#xff1a;文本框宽度 padding&#…...

Qemu-STM32(十五):STM32F103加入Flash控制器

概述 本文主要描述了在Qemu平台中&#xff0c;如何添加STM32F103的Flash控制器模拟代码。 参考资料 STM32F1XX TRM手册&#xff0c;手册编号&#xff1a;RM0008 添加步骤 1、在hw/arm/Kconfig文件中添加STM32F1XX_FLASH&#xff0c;如下所示: 号部分为新增加内容 diff -…...

设计模式(责任链模式)

责任链模式 模板模式、策略模式和责任链模式&#xff0c;这三种模式具有相同的作用&#xff1a;复用和扩展&#xff0c;在实际的项目开发中比较常用&#xff0c;特别是框架开发中&#xff0c;我们可以利用它们来提供框架的扩展点&#xff0c;能够让框架的使用者在不修改框架源…...

【Mac-ML-DL】深度学习使用MPS出现内存泄露(leaked semaphore)以及张量转换错误

MPS加速修改总结 先说设备&#xff1a;MacBook Pro M4 24GB 事情的起因是我在进行深度学习的时候想尝试用苹果自带的MPS进行训练加速&#xff0c;修改设备后准备开始训练&#xff0c;但是出现如下报错&#xff1a; UserWarning: resource_tracker: There appear to be 1 leak…...