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

Java 内存优化:如何避免内存泄漏?

Java 内存优化:如何避免内存泄漏?

在 Java 开发中,内存管理是一个至关重要的主题。尽管 Java 拥有自动垃圾回收机制,但这并不意味着开发人员可以忽视内存管理。内存泄漏是一个常见的问题,如果不加以控制,可能会导致应用程序性能下降,甚至崩溃。本文将深入探讨 Java 内存泄漏的原因、常见场景以及如何避免内存泄漏的策略,并提供详细的代码实例。

Java 内存泄漏的原因

内存泄漏是指程序中已分配的内存不能被释放,导致可用内存逐渐减少。在 Java 中,内存泄漏通常是由于对象被意外保留引用,使得垃圾回收器无法回收它们。以下是一些常见的内存泄漏原因:

  1. 静态集合类(如 ArrayListHashMap 等)长时间保留对象引用。
  2. 没有正确关闭资源(如文件流、数据库连接等)。
  3. 定时器和线程使用不当。
  4. 内部类和外部类之间的引用关系。
  5. 缓存实现不当。

常见的内存泄漏场景及代码实例

静态集合类的内存泄漏

静态集合类是最常见的内存泄漏来源之一。静态集合的生命周期与应用程序相同,如果向静态集合中添加对象并忘记移除,这些对象将永远不会被垃圾回收。

public class MemoryLeakExample {// 静态列表,生命周期与应用程序相同private static List<User> users = new ArrayList<>();public static void main(String[] args) {for (int i = 0; i < 100000; i++) {User user = new User("User" + i);users.add(user);// 模拟业务逻辑,没有移除用户}}static class User {private String name;public User(String name) {this.name = name;}}
}

在这个例子中,users 列表不断添加 User 对象,但从未移除。随着程序运行,列表中的对象数量不断增加,导致内存占用持续增长。

定时器和观察者模式的内存泄漏

定时器和观察者模式如果使用不当,也可能导致内存泄漏。例如,定时器任务可能在不需要时仍然保留对对象的引用。

public class TimerLeakExample {public static void main(String[] args) {Timer timer = new Timer();TimerTask task = new TimerTask() {@Overridepublic void run() {// 业务逻辑}};timer.schedule(task, 0, 1000); // 每秒执行一次// 模拟程序运行一段时间后停止try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}// 忘记取消定时器任务// timer.cancel();}
}

在这个例子中,定时器任务在程序运行一段时间后没有被取消,任务对象仍然被定时器保留,导致内存泄漏。

内部类和外部类的引用关系

内部类对外部类的引用也可能导致内存泄漏。如果内部类对象的生命周期超过外部类对象,外部类对象将无法被垃圾回收。

public class InnerClassLeak {private static final List<InnerClassLeak> leaks = new ArrayList<>();public InnerClassLeak() {InnerClass inner = new InnerClass();leaks.add(this);}class InnerClass {// 内部类持有外部类的引用}public static void main(String[] args) {for (int i = 0; i < 100000; i++) {new InnerClassLeak();}}
}

在这个例子中,InnerClassLeak 的实例被添加到静态列表中,而每个实例都有一个内部类对象。由于内部类对象持有外部类的引用,导致外部类对象无法被垃圾回收。

Java 垃圾回收机制

Java 的垃圾回收机制负责自动管理内存。了解垃圾回收的工作原理有助于更好地避免内存泄漏。

垃圾回收算法

Java 使用多种垃圾回收算法,如标记-清除(Mark-Sweep)、标记-整理(Mark-Compact)和复制(Copy)算法。这些算法的目标是找到并回收不再使用的对象。

代际假设

Java 虚拟机基于代际假设,将堆内存分为年轻代和老年代。年轻代的对象通常寿命较短,而老年代的对象寿命较长。这种划分有助于优化垃圾回收的性能。

引用类型

Java 提供了四种引用类型:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。不同的引用类型在垃圾回收时的行为不同,合理使用这些引用类型可以帮助避免内存泄漏。

如何检测内存泄漏

检测内存泄漏是解决内存问题的第一步。以下是一些常用的内存泄漏检测工具和方法:

VisualVM

VisualVM 是一个功能强大的 Java 性能分析工具,可以监控应用程序的内存使用情况。通过 VisualVM,可以查看堆转储(Heap Dump)并分析内存泄漏。

# 使用 VisualVM 分析内存泄漏的步骤:
1. 启动 VisualVM。
2. 连接到目标 Java 应用程序。
3. 在“监视”选项卡中查看内存使用情况。
4. 如果怀疑有内存泄漏,生成堆转储。
5. 分析堆转储,查找对象的引用链。

Eclipse Memory Analyzer Tool(MAT)

Eclipse MAT 是一个专门用于分析 Java 堆转储的工具。它可以帮助开发人员快速找到内存泄漏的根源。

# 使用 MAT 分析内存泄漏的步骤:
1. 使用 `jmap` 或其他工具生成堆转储文件。
2. 打开 MAT 并导入堆转储文件。
3. 使用 “Leak Suspects Report” 快速定位可能的内存泄漏。
4. 分析对象的引用链,找到导致泄漏的对象。

避免内存泄漏的最佳实践

为了避免内存泄漏,开发人员在编写代码时应遵循一些最佳实践。

合理管理集合类

对于集合类,确保在不再需要对象时及时移除它们。避免使用静态集合类来长时间保留对象引用。

public class CollectionManagement {private List<User> users = new ArrayList<>();public void addUser(User user) {users.add(user);}public void removeUser(User user) {users.remove(user);}public static void main(String[] args) {CollectionManagement management = new CollectionManagement();User user = new User("TestUser");management.addUser(user);// 在不再需要时移除用户management.removeUser(user);}static class User {private String name;public User(String name) {this.name = name;}}
}

及时关闭资源

确保及时关闭文件流、数据库连接等资源。使用 try-with-resources 语句可以自动关闭资源,避免资源泄漏。

public class ResourceManagement {public static void main(String[] args) {try (FileInputStream fis = new FileInputStream("example.txt")) {int data = fis.read();while (data != -1) {System.out.print((char) data);data = fis.read();}} catch (IOException e) {e.printStackTrace();}}
}

避免过度使用静态变量

静态变量的生命周期与应用程序相同,过度使用静态变量可能导致内存泄漏。尽量减少静态变量的使用,特别是在集合类中。

使用弱引用和软引用

在某些场景下,可以使用弱引用(WeakReference)和软引用(SoftReference)来避免内存泄漏。这些引用类型在垃圾回收时可以被回收。

import java.lang.ref.WeakReference;public class WeakReferenceExample {public static void main(String[] args) {Object obj = new Object();WeakReference<Object> weakRef = new WeakReference<>(obj);obj = null; // 放弃强引用// 运行垃圾回收(注意:垃圾回收的时间和行为不能保证)System.gc();try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}if (weakRef.get() == null) {System.out.println("对象已被垃圾回收");} else {System.out.println("对象仍然存在");}}
}

缓存的合理实现

缓存的实现需要特别注意内存管理。如果缓存没有大小限制,可能会导致内存泄漏。可以使用 LinkedHashMap 实现带有大小限制的缓存。

import java.util.LinkedHashMap;
import java.util.Map;public class CacheExample {private static final int CACHE_SIZE = 100;private final LinkedHashMap<String, String> cache = new LinkedHashMap<>(CACHE_SIZE, 0.75f, true) {@Overrideprotected boolean removeEldestEntry(Map.Entry<String, String> eldest) {return size() > CACHE_SIZE;}};public String get(String key) {return cache.get(key);}public void put(String key, String value) {cache.put(key, value);}public static void main(String[] args) {CacheExample cacheExample = new CacheExample();// 使用缓存cacheExample.put("key1", "value1");System.out.println(cacheExample.get("key1"));}
}

总结

内存泄漏是 Java 开发中一个常见且具有挑战性的问题。通过理解内存泄漏的原因、常见场景以及垃圾回收机制,开发人员可以更好地编写代码来避免内存泄漏。使用合适的工具检测内存泄漏,并遵循最佳实践,可以显著提高应用程序的性能和稳定性。

希望本文的内容对您有所帮助。如果您有任何问题或建议,请在评论区留言。

在这里插入图片描述

相关文章:

Java 内存优化:如何避免内存泄漏?

Java 内存优化&#xff1a;如何避免内存泄漏&#xff1f; 在 Java 开发中&#xff0c;内存管理是一个至关重要的主题。尽管 Java 拥有自动垃圾回收机制&#xff0c;但这并不意味着开发人员可以忽视内存管理。内存泄漏是一个常见的问题&#xff0c;如果不加以控制&#xff0c;可…...

数量关系 多级数列1

机械划分 真看不出来 无明显关系 后减前作差 分数数列 无规律 作乘 作积 太复杂啦 太复杂啦...

【AI提示词】物理学家

提示说明 物理学家是为那些希望深入了解物理学原理、探索宇宙奥秘或进行科学实验的用户设计的。这个专家能够提供精确的物理学概念解释、复杂的理论分析以及实验设计建议。 提示词 # 角色 物理学家## 注意 1. 物理学家专家应具备深厚的物理学知识和对科学探究的热情。 2. 专…...

黑马点评秒杀优化

异步优化秒杀业务 回顾之前的内容黑马点评 秒杀优惠券集群下一人一单超卖问题-CSDN博客&#xff0c;为了处理并发情况下的线程安全和数据一致性的问题&#xff0c;我们已经完成了查询优惠券信息、判断秒杀是否开始和结束、检查库存、用户ID加锁、创建订单和扣减库存。 尽管之前…...

宇树机器狗go2—slam建图(1)点云格式

0.前言 上一篇番外文章教大家如何在宇树机器狗go2的gazebo仿真环境中实现简单的导航运动&#xff0c;本期文章会教大家如何让宇树的机器狗go2在仿真环境中进行slam建图时经常会遇到的一些点云格式&#xff0c;在后续的slam建图和slam算法解析的时候会经常与这些点云信息打交道…...

支持中文对齐的命令行表格打印python库——tableprint

文章目录 快速入门 还在为表格中含有中文&#xff0c;命令行打印无法对齐而苦恼吗&#xff1f; 还在为冗长的数据添加代码而抓狂吗&#xff1f; tableprint来了&#xff01;&#xff01;&#xff01;&#xff0c;它完美的解决了上述两个问题&#xff0c;快来试试吧&#xff01;…...

力扣-hot100(无重复字符的最长子串)

3. 无重复字符的最长子串 中等 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。暴力直观解法一&#xff1…...

javaNIO详解

Java NIO&#xff08;Non-blocking I/O&#xff09;详解 Java NIO&#xff08;New I/O&#xff09;是 Java 1.4 引入的高性能 I/O 框架&#xff0c;相比传统的 BIO&#xff08;Blocking I/O&#xff09;&#xff0c;它提供了非阻塞、多路复用、零拷贝等能力&#xff0c;适用于…...

高精度算法(加、减、乘、除、阶乘和)​

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 唯有主动付出&#xff0c;才有丰富的果…...

在复杂性的迷宫里寻找路标 —— 读《人月神话》有感

初读《人月神话》时&#xff0c;正值参与的第一个大型项目陷入泥潭&#xff1a;需求像不断膨胀的气球&#xff0c;团队规模从 10 人扩充到 30 人&#xff0c;进度却像被灌了铅的钟表&#xff0c;指针越来越沉重。布鲁克斯在书中写下的 "向进度落后的项目增加人力&#xff…...

OpenFeign终极指南:超时控制、重试策略、拦截器与自定义Starter

目录 前言 使用 引入依赖 开启feign 编写feign客户端 效果 日志 超时配置 重试机制 拦截器 Fallback兜底返回 引入依赖 编写兜底实现 连接池 引入依赖 开启连接池 制作OpenFeign Starter 编写配置类 自动装配 前言 在RPC框架中&#xff0c;有openFeign和Du…...

如何使用flatten函数在Terraform 中迭代嵌套map

简介 flatten 接受一个列表&#xff0c;并用列表内容的扁平序列替换列表中的任何元素。 > flatten([["a", "b"], [], ["c"]]) ["a", "b", "c"] > flatten([[["a", "b"], []], [&quo…...

数字电子技术基础(五十)——硬件描述语言简介

目录 1 硬件描述语言简介 1.1 硬件描述语言简介 1.2 硬件编程语言的发展历史 1.3 两种硬件描述的比较 1.4 硬件描述语言的应用场景 1.5 基本程序结构 1.5.1 基本程序结构 1.5.2 基本语句和描述方法 1.5.3 仿真 1 硬件描述语言简介 1.1 硬件描述语言简介 硬件描述语…...

【PCIE配置空间】

1 PCIE配置空间 1.1 软件如何知道PCIE设备是Swith&#xff0c;RC还是EP&#xff1f; –软件通过读取寄存器信息。 PCIE配置空间• PCIE寄存器&#xff1b;--PCIE配置协议规定必须实现的空间。--PCIE存在两种配置空间Type0/Type1;--Type0配置空间EP设备必须实现&#xff1b;-…...

Python爬虫实战:获取网易新闻数据

一、引言 随着互联网的飞速发展,网络上蕴含着海量的信息资源。新闻数据作为其中的重要组成部分,对于舆情分析、市场研究、信息传播等多个领域具有重要价值。网易新闻作为国内知名的新闻平台,拥有丰富多样的新闻内容。使用 Python 的 Scrapy 框架进行网易新闻数据的爬取,可…...

哲学家就餐问题(避免死锁)

解决方案&#xff1a; 策略&#xff1a;奇偶哲学家拿筷子顺序不同&#xff0c;破坏循环等待。 流程&#xff1a; 偶数哲学家先左后右。 奇数哲学家先右后左。 分析&#xff1a; 无死锁&#xff0c;哲学家交替进餐&#xff0c;不同拿筷顺序避免循环等待。 实验总结 遇到的…...

下采样(Downsampling)

目录 1. 下采样的定义与作用​​ ​​2. 常见下采样方法​​ ​​(1) 池化&#xff08;Pooling&#xff09;​​ ​​(2) 跨步卷积&#xff08;Strided Convolution&#xff09;​​ ​​(3) 空间金字塔池化&#xff08;SPP&#xff09;​​ ​​3. PyTorch 实现示例​​ …...

OrbisGIS:基于Java开发的开源GIS软件

大家好&#xff0c;今天为大家介绍的软件是OrbisGIS&#xff1a;一款基于JAVA开发的开源的地理信息系统软件。下面&#xff0c;我们将从软件的主要功能、支持的系统、软件官网等方面对其进行简单的介绍。 OrbisGIS官网网址为&#xff1a;http://orbisgis.org/&#xff0c;Orbis…...

linux socket编程之udp(实现客户端和服务端消息的发送和接收)

目录 一.创建socket套接字(服务器端) 二.bind将prot与端口号进行绑定(服务器端) 2.1填充sockaddr_in结构 2.2bind绑定端口 三.直接通信(服务器端) 3.1接收客户端发送的消息 3.2给客户端发送消息 四.客户端通信 4.1创建socket套接字 4.2客户端bind问题 4.3直接通信即可…...

八大排序之直接插入排序

今天我们来学习八大排序中的直接插入排序。话不多说&#xff0c;直接上动图。 直接插入排序的主要思想是&#xff1a;当数组只有一个元素的时候&#xff0c;我们可以认为该数组是有序的。所以我们可以选择一个元素放进数组&#xff08;一般为待排数据的第一个元素&#xff09;…...

二级评论列表-Java实现

二级评论列表是很常见的功能&#xff0c;文章记录了新手用Java实现的具体逻辑。 整体实现逻辑是先用2个sql&#xff0c;分别查出两层数据。然后用java在service中实现数据组装&#xff0c;返给前端。这种实现思路好处是SQL简洁&#xff0c;逻辑分明&#xff0c;便于维护。 一…...

如何基于区块链进行虚拟电厂运营平台建设?

本项目旨在基于区块链技术建设虚拟电厂运营平台&#xff0c;以提升省内大用户及工业企业和工业园区的需求响应能力&#xff0c;优化能源结构配置&#xff0c;并推动能源交易、需求响应和现货交易等新型业态的发展。通过建设虚拟电厂&#xff0c;项目将实现工业企业及园区各供用…...

大学英语四级选词填空练习题解析

一、引言 大学英语四级考试中的选词填空部分&#xff0c;一直是不少同学的 “拦路虎”。它不仅要求我们有扎实的词汇基础&#xff0c;还需要具备良好的语境分析能力。今天&#xff0c;我们就通过一道练习题来深入剖析这类题型的解题思路。 二、题目内容 Leisure activities …...

基于控制台的小车导航游戏开发详解(C++实现)

本文将详细讲解一个基于C控制台的小车导航游戏项目。通过该项目可以学习二维数组操作、队列数据结构应用以及游戏循环控制等核心编程概念&#xff0c;特别适合刚接触游戏开发的初学者学习。 一、项目概述 1.1 游戏规则 玩家可创建多辆具有不同初始位置和移动速度的小车 每辆…...

详讲Linux下进程等待

3.进程等待 引言&#xff1a;什么是进程等待 想象有两个小伙伴&#xff0c;一个是 “大强”&#xff08;父进程 &#xff09;&#xff0c;一个是 “小强”&#xff08;子进程 &#xff09;。大强给小强安排了任务&#xff0c;比如去收集一些石头。 …...

数字孪生火星探测车,星际探索可视化

运用图扑构建数字孪生火星探测车&#xff0c;高精度还原外观与内部构造。实时映射探测车在火星表面的移动、探测作业及设备状态&#xff0c;助力科研人员远程监测、分析数据&#xff0c;为火星探索任务提供可视化决策支持。...

《JVM考古现场(二十三):归零者·重启奇点的终极奥义》

目录 楔子&#xff1a;归零者文明觉醒 上卷十维弦理论破译 第一章&#xff1a;JVM弦论代码考古 第二章&#xff1a;超膜引用解析算法 第三章&#xff1a;量子真空涨落监控 中卷归零者心法实战 第四章&#xff1a;宇宙重启倒计时引擎 第五章&#xff1a;内存奇点锻造术 第…...

设计测试用例模板

面试时问你一个场景&#xff0c;要你设计测试用例&#xff0c;你会怎么回答&#xff1f; 面试官让你设计一个功能的测试用例&#xff0c;比如“上传文件功能”&#xff0c;其实就是想考你&#xff1a; 思维是否全面能不能抓住重点会不会分类和使用测试方法有没有考虑异常情况…...

java怎么找bug?Arthas原理与实战指南

Arthas原理与实战指南 1. Arthas简介 Arthas是阿里巴巴开源的Java诊断工具&#xff0c;其名字取自《魔兽世界》的人物阿尔萨斯。它面向线上问题定位&#xff0c;被广泛应用于性能分析、定位问题、安全审计等场景。Arthas的核心价值在于它能够在不修改应用代码、不重启Java进程…...

2024年国考

数学 一&#xff0c;逻辑符号表示&#xff08;3 分&#xff09; 1&#xff0c;只有获得奥运会资格的运动员才可以参加奥运会&#xff0c;参加奥运会的云动员不一定获奖。 设&#xff1a; ( Q(x) )&#xff1a;运动员 ( x ) 获得奥运会资格( P(x) )&#xff1a;运动员 ( x )…...

fastlio用mid360录制的bag包离线建图,提示消息类型错误

我用mid360录制的bag包&#xff0c;激光雷达的数据类型是sensor_msgs::PointCloud2&#xff0c;但是运行fast_lio中的mid360 launch文件&#xff0c;会报错&#xff08;没截图&#xff09;&#xff0c;显示无法从livox_ros_driver2::CustomMsg转换到sensor_msgs::PointCloud2。…...

015-C语言字符函数和字符串函数

C语言字符函数和字符串函数 文章目录 C语言字符函数和字符串函数1. 字符分类函数2. 字符转换函数3. strlen4. strcpy5. strcat6. strcmp7. strncpy8. strncat9. strncmp10. strstr11. strtok12. strerror 1. 字符分类函数 C语言中有一系列函数是专门做字符分类的&#xff0c;也…...

docker 搭建nacos 2.2.1版本单机版

通过docker-compose搭建 services:nacos:image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nacos/nacos-server:v2.2.1container_name: nacosenvironment:- PREFER_HOST_MODEhostname- MODEstandalone- NACOS_AUTH_ENABLEtrue- NACOS_AUTH_IDENTITY_KEYxiaogang- N…...

stack,queue和priority_queue

1. stack 1.1 stack 的介绍 栈是一种容器适配器&#xff0c;专门设计用于LIFO环境&#xff08;后进先出&#xff09;&#xff0c;其中元素仅从容器的一端插入和提取。 容器适配器&#xff0c;也就是使用特定容器类的封装对象作为其底层容器&#xff0c;提供一组特定的成员函…...

服务治理-搭建Nacos注册中心

运行nacos.sql文件。 将准备好的nacos目录和nacos.tar包上传。 192.168.59.101是我的虚拟机ip&#xff0c;8848是我们设置的访问端口号。...

《Operating System Concepts》阅读笔记:p738-p747

《Operating System Concepts》学习第 63 天&#xff0c;p738-p747 总结&#xff0c;总计 10 页。 一、技术总结 1.network structure local-area networks (LAN)、wide-area networks (WAN). 2.communication structure naming and name resolution、communication proto…...

【Datawhale AI春训营】Java选手初探数据竞赛

自然语言处理基础&#xff1a; 自然语言处理(Natural Language Processing&#xff0c;NLP) 是计算机科学与人工智能领域中的一个极具挑战性和应用前景的研究方向。 它旨在使计算机能够理解、生成和处理人类的自然语言&#xff0c;从而实现人机高效交互。 NLP技术在搜索引擎、…...

React-useRef

如果我们想在hooks里面获同步取最新的值&#xff0c;那么则可以使用useRef, 关键源码如下&#xff1a; function mountRef<T>(initialValue: T): {|current: T|} {const hook mountWorkInProgressHook();const ref {current: initialValue};hook.memoizedState ref;re…...

得物官网sign签名逆向分析

打开得物官网&#xff0c;点击鞋类&#xff0c;可以看到请求 直接搜sign function p(e) {return f()("".concat(e ? s()(e).sort().reduce(function(t, n) {return "".concat(t).concat(n).concat(e[n])}, "") : "", "048a9…...

网络爬虫和前端相关知识

一 爬虫发展历史,概念与反爬机制 (一)爬虫发展历史 早期爬虫(1990s)起源 :早期的爬虫主要是为了构建搜索引擎。典型案例: Yahoo!人工目录 → 谷歌PageRank算法驱动的自动化爬虫。功能特点 :这些爬虫的功能比较单一,主要以抓取网页的文本内容为主,采用简单的广度优先…...

山东科技大学人工智能原理考试回忆复习资料

全部资料&#xff1a;https://mbd.pub/o/around_01 考试回忆版 简答题 人工智能定义 图灵测试基本思想 人工智能主要研究领域写八个以上 专家系统是什么及其特点 遗传算法流程图 综合题 语义网络表示 书上习题 证明S不满足性 用归结原理求问题 谁说真话假话的 书上例题…...

单元测试的一般步骤

Qt Test Qt Test 是 Qt 开发人员发布的一个单元测试框架&#xff0c;用于测试基于 Qt 框架的应用程序或库。它提供了单元测试框架中常见的所有功能以及用于测试图形用户界面的扩展。 1.自动化测试包络ui测试>接口测试>单元测试&#xff1b;现问如何使用Qt进行单元测试&…...

c++题目_P1443 马的遍历

P1443 马的遍历 # P1443 马的遍历 ## 题目描述 有一个 $n \times m$ 的棋盘&#xff0c;在某个点 $(x, y)$ 上有一个马&#xff0c;要求你计算出马到达棋盘上任意一个点最少要走几步。 ## 输入格式 输入只有一行四个整数&#xff0c;分别为 $n, m, x, y$。 ## 输出格式 …...

并发网路通信-套接字通信

套接字通信就是网络通信 在网络通信时,客户端和服务器的比例是N:1 服务器如何处理多个客户端的请求 并发处理方式 1.多线程并发处理->线程池并发处理,线程池可以对多个线程进行管理 2.多进程->进程池 3.io多路转接,使用select或者epoch进行处理,使用io转接函数…...

STM32N6如何调试下载代码

关键词&#xff1a;STM32N6、调试代码、开发者模式、外部Flash模式 文章目录 前言一、开发者模式调试1.1 CubeIDE调试1.2 IAR调试 二、如何下载代码&#xff08;外部FLASH模式&#xff09;2.1 准备工作2.2 编译下载2.2.1 Appli编译头文件下载2.2.2 FSBL编译头文件下载 2.3 运行…...

【2025】Datawhale AI春训营-蛋白质预测(AI+生命科学)-Task2笔记

【2025】Datawhale AI春训营-蛋白质预测&#xff08;AI生命科学&#xff09;-Task2笔记 本文对Task2使用的代码进行理解。 任务描述 Task2的任务仍然是通过对反应中包含的蛋白质残基信息&#xff0c;运用深度学习模型构建蛋白质3D结构的隐式模型&#xff0c;从而达成准确预测…...

Python基于知识图谱的医疗问答系统【附源码、文档说明】

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…...

Unreal 从入门到进阶 之 如何实现Pixel Streaming

文章目录 前言核心概念工作原理主要应用场景Pixel Streaming和Pixel Streaming2部署准备编辑器推流打包推流最后前言 Unreal Engine 5 (UE5) 的 Pixel Streaming 是一项基于云端的实时流媒体技术,允许将 UE5 应用的高质量图形渲染结果通过 WebRTC 协议传输到用户的浏览器或轻…...

作业2 CNN实现手写数字识别

# 导入必要库 import numpy as np import matplotlib.pyplot as plt import seaborn as sns # 用于高级可视化 from tensorflow import keras from tensorflow.keras import layers from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay import time # 用于…...

Linux驱动开发--阻塞、非阻塞I/O

2. 阻塞、非阻塞I/O IO 指的是 Input/Output&#xff0c;也就是输入/输出&#xff0c;是应用程序对驱动设备的输入/输出操作。当应用程序对设备驱动进行操作的时候&#xff0c;如果不能获取到设备资源&#xff0c;那么阻塞式 IO 就会将应用程序对应的线程挂起&#xff0c;直到…...