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

SpringBoot 线上服务假死,CPU 内存正常,什么情况?


背景

开发小伙伴都知道线上服务挂掉,基本都是因为cpu或者内存不足,出现GC频繁OOM之类的情况。本篇文章区别以上的情况给小伙伴们带来不一样的服务挂掉。

还记得哔哩哔哩713事故中那场诡计多端的0吗?

6142db9e10d43f6c1d161d4345152016.jpeg

图片

对就是这个0,和本次事故没关系,但深受启发。

问题排查

老规矩在集群环境中同一个服务几个节点无响应。如不及时解决会可能形成雪崩效应。

优先查看服务日志是否有报错,礼貌习惯性查看服务cpu及内存情况。先复习下,若服务无报错。cpu或内存出现异常,按如下步骤排查。

常规排查

1、查看服务进程中线程情况

top -H -p pid

ps -mp pid -o THREAD,tid,time

2、查看系统异常线程16进制

printf “%x\n” nid

3、查看异常线程堆栈信息

jstack pid | grep number

查看占用最大内存对象前一百

jmap -histo pid|head -100

导出到文件

jstack -l PID >> a.log

或dump信息使用工具Mat或JProfiler查看

jmap -dump:live,format=b,file=/dump.bin pid

经过上面一通手法操作,足以解决此类常规报错了,通常大多是原因各种循环递归、或数据库慢查询等。

Mat使用

在MAT中,会有两种大小表示:

  • Shallow Size:表示对象自身占用的内存大小,不包括它引用的对象。
  • Retained size:当前对象内存大小+当前对象直接或间接引用的对象大小,全部的总和,简单理解,就是当前对象被GC后,总共能释放的内存大小。

Histogram视图

以Class Name为维度,分别展示各个类的对象数量。它默认是以byte为单位的,

ccc2f4166227ebae5fe49d6b9d05b928.jpeg

图片

要显示让单位展示出来,点击Window->Preferences选择最后一项,点击Apply and Close

再重新打开Histogram视图,就会生效了。

a78e996b109a5af5f4fcb40bf0685cbd.jpeg

图片

Leak Suspects

报表很直观地展现了一个饼图,图中颜色深的部分表示可能存在内存泄漏的嫌疑。

通过这个指标可以快速定位内存泄漏地方出现在哪个类方法里的哪行代码。

本次问题排查

1、 信息收集分析

因服务健康监测无响应,cpu及内存情况正常,直接查看堆栈信息,看看线程都在干什么

jstack -l PID >> a.log

Jstack的输出中,Java线程状态主要是以下几种:

  • RUNNABLE 线程运行中或I/O等待
  • BLOCKED 线程在等待monitor锁(synchronized关键字)
  • TIMED_WAITING 线程在等待唤醒,但设置了时限
  • WAITING 线程在无限等待唤醒

发现都是WAITING线程。

"http-nio-8888-exec-6666"  #8833 daemon prio=5 os_prio=0 tid=0x00001f2f0016e100 nid=0x667d waiting on condition [0x00002f1de3c5200]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
-&nbsp;parking&nbsp;to&nbsp; wait&nbsp; for&nbsp;&nbsp;<0x00000007156a29c8>&nbsp;(a&nbsp;java.util.concurrent.locks.AbstractQueuedSynchronizer $ConditionObject)
at&nbsp;java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at&nbsp;java.util.concurrent.locks.AbstractQueuedSynchronizer $ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at&nbsp;com.alibaba.druid.pool.DruidDataSource.takeLast(DruidDataSource.java:1897)
at&nbsp;com.alibaba.druid.pool.DruidDataSource.getConnectionInternal(DruidDataSource.java:1458)
at&nbsp;com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1253)
at&nbsp;com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4619)
at&nbsp;com.alibaba.druid.filter.stat.StatFilter.dataSource_getConnection(StatFilter.java:680)
at&nbsp;com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4615)
at&nbsp;com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1231)
at&nbsp;com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1223)
at&nbsp;com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:90)
at&nbsp;com.baomidou.dynamic.datasource.ds.ItemDataSource.getConnection(ItemDataSource.java:56)
at&nbsp;com.baomidou.dynamic.datasource.ds.AbstractRoutingDataSource.getConnection(AbstractRoutingDataSource.java:48)
at&nbsp;org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)
at&nbsp;org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)
at&nbsp;org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:82)
at&nbsp;org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:68)
at&nbsp;org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:336)
at&nbsp;org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:84)
at&nbsp;org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)
at&nbsp;org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324)
at&nbsp;org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
at&nbsp;org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
at&nbsp;com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:143)
at&nbsp;org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
at&nbsp;com.sun.proxy. $Proxy571.query(Unknown&nbsp;Source)

2、定位关键信息,追踪源代码

&nbsp;&nbsp;at&nbsp;java.util.concurrent.locks.AbstractQueuedSynchronizer $ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
&nbsp;&nbsp;at&nbsp;com.alibaba.druid.pool.DruidDataSource.takeLast(DruidDataSource.java:1897)
DruidConnectionHolder&nbsp;takeLast()&nbsp;throws&nbsp;InterruptedException,&nbsp;SQLException&nbsp;{
try&nbsp;{
while&nbsp;(poolingCount&nbsp;==&nbsp;0)&nbsp;{
emptySignal();&nbsp;//&nbsp;send&nbsp;signal&nbsp;to&nbsp;CreateThread&nbsp;create&nbsp;connection

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;(failFast&nbsp;&&&nbsp;isFailContinuous())&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;DataSourceNotAvailableException(createError);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;notEmptyWaitThreadCount++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;(notEmptyWaitThreadCount&nbsp;>&nbsp;notEmptyWaitThreadPeak)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;notEmptyWaitThreadPeak&nbsp;=&nbsp;notEmptyWaitThreadCount;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;数据库的连接都没有释放且被占用,连接池中无可用连接,导致请求被阻塞
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;notEmpty.await();&nbsp;//&nbsp;signal&nbsp;by&nbsp;recycle&nbsp;or&nbsp;creator
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;finally&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;notEmptyWaitThreadCount--;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;notEmptyWaitCount++;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;(! enable)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connectErrorCountUpdater.incrementAndGet(this);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;DataSourceDisableException();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(InterruptedException&nbsp;ie)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;notEmpty.signal();&nbsp;//&nbsp;propagate&nbsp;to&nbsp;non-interrupted&nbsp;thread
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;notEmptySignalCount++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;ie;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;decrementPoolingCount();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DruidConnectionHolder&nbsp;last&nbsp;=&nbsp;connections[poolingCount];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connections[poolingCount]&nbsp;=&nbsp;null;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;last;
}

结合日志报错定位到问题代码。因报错可用连接没有正常释放,导致一直await卡死。

问题代码如下:

try&nbsp;{
&nbsp;&nbsp;SqlSession&nbsp;sqlSession&nbsp;=&nbsp;sqlSessionFactory.openSession(ExecutorType.BATCH);
&nbsp;&nbsp;TestMapper&nbsp;mapper&nbsp;=&nbsp;sqlSession.getMapper(TestMapper.class);
&nbsp;&nbsp;mapper.insetList(list);
&nbsp;&nbsp;sqlSession.flushStatements();
}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{
&nbsp;&nbsp;&nbsp;e.printStackTrace();
}

问题复现

按照以上信息在多活环境复现。因线程被打满且都在等待导致监控检查无响应。

tomcat线程被打满:

77b28c4f96869192429e191473605da9.jpeg

图片

tomcat默认参数:

最大工作线程数,默认200。

server.tomcat.max-threads=200

最大连接数默认是10000

server.tomcat.max-connections=10000

等待队列长度,默认100。

server.tomcat.accept-count=100

最小工作空闲线程数,默认10。

server.tomcat.min-spare-threads=100

Druid连接池的默认参数如下:

ac5422cd2d9d20f1cfc29e638b52feb1.jpeg

图片

Druid连接池的配置参数如下:

4cafb048f022dfcae1e1edacd6308cbf.jpeg

3b12a6389278722eb40870129b4c3dc5.jpeg

解决

1、Druid连接池的配置超时参数

spring:&nbsp;
&nbsp;&nbsp;redis:
&nbsp;&nbsp;&nbsp;&nbsp;host:&nbsp;localhost
&nbsp;&nbsp;&nbsp;&nbsp;port:&nbsp;6379
&nbsp;&nbsp;&nbsp;&nbsp;password:&nbsp;
&nbsp;&nbsp;datasource:
&nbsp;&nbsp;&nbsp;&nbsp;druid:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stat-view-servlet:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enabled:&nbsp; true
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loginUsername:&nbsp;admin
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loginPassword:&nbsp;123456
&nbsp;&nbsp;&nbsp;&nbsp;dynamic:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;druid:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initial-size:&nbsp;5
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min-idle:&nbsp;5
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxActive:&nbsp;20
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxWait:&nbsp;60000
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeBetweenEvictionRunsMillis:&nbsp;60000
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minEvictableIdleTimeMillis:&nbsp;300000
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;validationQuery:&nbsp;SELECT&nbsp;1&nbsp;FROM&nbsp;DUAL
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testWhileIdle:&nbsp; true
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testOnBorrow:&nbsp; false
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testOnReturn:&nbsp; false
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;poolPreparedStatements:&nbsp; true
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxPoolPreparedStatementPerConnectionSize:&nbsp;20
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filters:&nbsp; stat,slf4j,wall
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connectionProperties:&nbsp;druid.stat.mergeSql\= true;druid.stat.slowSqlMillis\=5000

2、异常及时关闭连接

sqlSession.close();

来源:blog.csdn.net/zhangcongyi420/article/details/131139599

End


相关文章:

SpringBoot 线上服务假死,CPU 内存正常,什么情况?

背景 开发小伙伴都知道线上服务挂掉&#xff0c;基本都是因为cpu或者内存不足&#xff0c;出现GC频繁OOM之类的情况。本篇文章区别以上的情况给小伙伴们带来不一样的服务挂掉。 还记得哔哩哔哩713事故中那场诡计多端的0吗&#xff1f; 图片 对就是这个0&#xff0c;和本次事…...

kotlin从入门到精通之内置类型

基本类型 声明变量 val&#xff08;value的简写&#xff09;用来声明一个不可变的变量&#xff0c;这种变量在初始赋值之后就再也不能重新赋值&#xff0c;对应Java中的final变量。 var&#xff08;variable的简写&#xff09;用来声明一个可变的变量&#xff0c;这种变量在初始…...

实战指南:使用Spring Boot实现消息的发送和接收

当涉及到消息发送和接收的场景时&#xff0c;可以使用Spring Boot和消息中间件RabbitMQ来实现。下面是一个简单的示例代码&#xff0c;展示了如何在Spring Boot应用程序中创建消息发送者和接收者&#xff0c;并发送和接收一条消息。 首先&#xff0c;你需要进行以下准备工作 确…...

常用的数据结构——栈

目录 1、入栈 2、出栈 3、获取栈顶的元素 4、从栈中查找元素 栈是一种常见的数据结构&#xff0c;栈的特点是后进先出&#xff0c;就像我们叠盘子&#xff0c;拿走上面的盘子才能拿到下一个。java中的栈java.util.Stack是通过java.util.Vector实现的&#xff0c;所以底层都…...

C++完成淄博烧烤节管理系统

背景&#xff1a; 这次我们结合今年淄博烧烤做一个餐厅管理系统&#xff0c;具体需求如下&#xff0c;我们选择的是餐饮商家信息管理 问题描述&#xff1a; 淄博烧烤今年大火&#xff0c;“进淄赶烤”是大家最想干的事情&#xff0c;淄博烧烤大火特火的原因&#xff0c;火的…...

我心中的TOP1编程语言

目录 一、评选最佳编程语言时需要考虑哪些标准 &#xff08;一&#xff09;易用性 &#xff08;二&#xff09;执行效率 &#xff08;三&#xff09;语言功能特性 &#xff08;四&#xff09;工具生态环境 &#xff08;五&#xff09;开发者社区 二、不同编程语言的优点…...

Linux工具之gdb(含移植到arm-linux系统)

文章目录 文件目录结构移植ncurses库移植gdb移植到arm板调试测试 linux主机&#xff1a;ubuntu-18.04 交叉编译器&#xff1a;arm-buildroot-linux-gnueabihf 开发板kernel&#xff1a;Linux 5.4.0-150-generic x86_64 开发板&#xff1a;100ASK_STM32MP157_PRO开发板 arm-…...

DolphinScheduler

参考 Apache DolphinScheduler v1.3.9 使用手册 内置组件 masterserverworkserverzookeepertask queuealertapiui 设计 去中心化设计 通过zk选举 UI功能 队列管理 Yarn调度器的资源队列 用户管理 租户对应的是Linux系统用户&#xff0c;是Worker执行任务使用的用户 用户…...

10大白帽黑客专用的 Linux 操作系统

平时在影视里见到的黑客都是一顿操作猛如虎&#xff0c;到底他们用的都是啥系统呢&#xff1f; 今天给大家分享十个白帽黑客专用的Linux操作系统。 ▍1. Kali Linux Kali Linux是最著名的Linux发行版&#xff0c;用于道德黑客和渗透测试。Kali Linux由Offensive Security开发&…...

Golang每日一练(leetDay0099) 单词规律I\II Word Pattern

目录 290. 单词规律 Word Pattern &#x1f31f;  291. 单词规律 II Word Pattern ii &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 …...

linux_centos7.9/ubuntu20.04_下载镜像及百度网盘分享链接

1、镜像下载站点 网易开源镜像&#xff1a;http://mirrors.163.com/ 搜狐开源镜像&#xff1a;http://mirrors.sohu.com/ 阿里开源镜像&#xff1a;https://developer.aliyun.com/mirror/ 首都在线科技股份有限公司&#xff1a;http://mirrors.yun-idc.com/ 常州贝特康姆软件技…...

Reqable HTTP一站式开发+调试工具(小黄鸟作者另一力作、小黄鸟完美替代品)

本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!Reqable HTTP一站式开发+调试工具(小黄鸟作者另一力作、小黄鸟替代品) 环境 win10pixel4Android13概览 …...

Yacc 与 Lex 快速入门

Yacc 与 Lex 快速入门 简介&#xff1a; Lex 和 Yacc 是 UNIX 两个非常重要的、功能强大的工具。事实上&#xff0c; 如果你熟练掌握 Lex 和 Yacc 的话&#xff0c;它们的强大功能使创建 FORTRAN 和 C 的编译器如同儿戏。本文详细的讨论了编写自己的语言和编译器所 用到的这两…...

【开源与项目实战:开源实战】80 | 开源实战二(下):从Unix开源开发学习应对大型复杂项目开发

上两节课&#xff0c;我们分别从代码编写、研发管理的角度&#xff0c;学习了如何应对大型复杂软件开发。在研发管理这一部分&#xff0c;我们又讲到比较重要的几点&#xff0c;它们分别是编码规范、单元测试、持续重构和 Code Review。其中&#xff0c;前三点在专栏的理论部分…...

【单周期CPU】LoongArch | 立即数扩展模块Ext | 32位算术逻辑运算单元(ALU)

前言&#xff1a;本章内容主要是演示在vivado下利用Verilog语言进行单周期简易CPU的设计。一步一步自己实现模型机的设计。本章先介绍单周期简易CPU中基本组合逻辑部件的设计。 &#x1f4bb;环境&#xff1a;一台内存4GB以上&#xff0c;装有64位Windows操作系统和Vivado 201…...

Python实现数据结构的基础操作

目录 一、列表&#xff08;List&#xff09; 二、字典&#xff08;Dictionary&#xff09; 三、集合&#xff08;Set&#xff09; 四、链表的实现 五、队列和栈 数据结构是计算机科学中非常重要的概念&#xff0c;它用于存储和组织数据以便有效地进行操作。Python作为一种…...

20230624----重返学习-vue-响应式处理思路-仿源码

day-098-ninety-eight-20230624-vue-响应式处理思路-仿源码 vue vue大体概念 Vue是渐进式框架 所谓渐进式框架&#xff0c;就是把一套全面的框架设计体系&#xff0c;拆分成为多个框架&#xff0c;项目中需要用到那些需求&#xff0c;再导入对应的框架&#xff0c;以此来保证…...

【MongoDB】三、使用Java连接MongoDB

【MongoDB】三、使用Java连接MongoDB 实验目的实验内容练习1、开启Eclipse&#xff0c;创建Java Project项目&#xff0c;命名为Mongo12、添加项目依赖的jar包3、创建类MongoDemo4、连接数据库5、查看集合6、创建集合7、删除集合8、查看文档9、插入文档10、更新文档11、删除文档…...

【C++】通讯录的基本实现,附有源码分享

目录 1、运行环境 2、系统实现功能 2.1菜单功能 2.2退出通讯录功能 2.3添加联系人功能 2.4显示联系人功能 2.5删除联系人功能 2.6查找联系人功能 2.7修改联系人功能 2.8清空联系人功能 2.9动态扩容功能 2.10选择优化功能 2.11文件操作 3、源码分享 1、运行环境 …...

UI 自动化测试 —— selenium的简单介绍和使用

selenium 是 web 应用中基于 UI 的自动化测试框架&#xff0c;支持多平台、多浏览器、多语言。 提到 UI 自动化就先了解什么是自动化测试&#xff1f; 目录 1. 自动化测试 2. UI 自动化 2.1 UI 自动化的特点 2.2 UI 自动化测试的优缺点 2.3 UI 自动化测试的使用对象 2.4…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...