当前位置: 首页 > 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…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景

Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知&#xff0c;帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量&#xff0c;能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度&#xff0c;还为机器人、医疗设备和制造业的智…...