JVM 监控命令详解

文章目录

  • JDK 中与常用命令行工具
    • jps
    • jstat
    • jinfo
    • jmap
      • 导出 dump 文件
      • 查看堆内存信息
    • jstack
  • JVM 可视化分析工具

JDK 中与常用命令行工具

jps

查看当前服务器正在执行的 Java 进程

$> jps
7584 Application
16433 AdminApplication
14209 Jps
5813 Bootstrap
5575 TestApplication
7160 Application
6010 Bootstrap
6715 Bootstrap
3981 QuorumPeerMain
6527 jar

这里的进程id和操作系统的进程id是一致的。第二列是显示的当前正在执行的 Java 程序的名称。

$> jps -help
usage: jps [-help]jps [-q] [-mlvV] [<hostid>]Definitions:<hostid>:      <hostname>[:<port>]
  • l 显示类的完整信息
  • v 显示启动时的 Java 配置选项

jstat

查看当前Java进程的相关信息(GC信息、类加载信息、JIT编译信息等)

$> jstat -help
Usage: jstat -help|-optionsjstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]Definitions:<option>      通过 -options 可以查看有哪些option<vmid>        进程id,如果是远程格式如下:<远程的进程id>[@<hostname>[:<port>]]<lines>       打印多少行之后再次显示一下表头.<interval>    打印间隔时间格式为:<n>["ms"|"s"]<count>       重复打印的次数,如果设置了 interval 而不设置时间,则一直打印.-J<flag><flag> 的值传递给运行时系统.-t 程序执行时长
-h<lines> 打印多少行之后再次显示一下表头$> jstat -options
-class  显示 ClassLoader 的相关信息
-compiler 显示 JIT 编译的信息
-gc  显示 GC 相关信息
-gccapacity 类似 -gc
-gccause  显示发生 GC 的原因
-gcmetacapacity 
-gcnew 新生代信息
-gcnewcapacity 类似于 -gcnew
-gcold 老年代信息
-gcoldcapacity 类似于 -gcnew
-gcutil 
-printcompilation 显示 JIT 编译的信息

-gc 示例

$> jstat -gc 进程id 1s 100S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
512.0  512.0  128.0   0.0   36864.0  29170.4   152064.0   72123.0   105088.0 99428.9 12416.0 11352.7    920   22.131   4      1.018   23.149S0C:幸存者0区的总内存大小
S0U:幸存者0区已经使用的内存大小
EC、EU: Eden 区的总内存大小和已经使用的内存大小
OC、OU:老年代的内存信息
MC、MU:元空间的内存信息YGC:YoungGC 的次数
YGCT:YoungGC 的时间
FGC:FGC 的次数
FGCT:FGC 的时间
GCT:总 GC 的时间

jinfo

查看或修改JVM配置参数信息

$> jinfo -help
Usage:jinfo [option] <pid>(to connect to running process)jinfo [option] <executable <core>(to connect to a core file)jinfo [option] [server_id@]<remote server IP or hostname>(to connect to remote debug server)where <option> is one of:-flag <name>         to print the value of the named VM flag-flag [+|-]<name>    to enable or disable the named VM flag-flag <name>=<value> to set the named VM flag to the given value-flags               to print VM flags-sysprops            to print Java system properties<no option>          to print both of the above-h | -help           to print this help message

示例

$> jinfo -flags 进程id
Attaching to process ID 进程id, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.181-b13
Non-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=130023424 -XX:MaxHeapSize=2051014656 -XX:MaxNewSize=683671552 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=42991616 -XX:OldSize=87031808 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
Command line:

jinfo 命令可以动态修改Java 进程配置,配置之后立即生效。但并不是所有的选项参数都能修改,需要是标记为 manageable 的才能修改。

$> java -XX:+PrintFlagsFinal -version | grep manageableintx CMSAbortablePrecleanWaitMillis            = 100                                 {manageable}intx CMSTriggerInterval                        = -1                                  {manageable}intx CMSWaitDuration                           = 2000                                {manageable}bool HeapDumpAfterFullGC                       = false                               {manageable}bool HeapDumpBeforeFullGC                      = false                               {manageable}bool HeapDumpOnOutOfMemoryError                = false                               {manageable}ccstr HeapDumpPath                              =                                     {manageable}uintx MaxHeapFreeRatio                          = 100                                 {manageable}uintx MinHeapFreeRatio                          = 0                                   {manageable}bool PrintClassHistogram                       = false                               {manageable}bool PrintClassHistogramAfterFullGC            = false                               {manageable}bool PrintClassHistogramBeforeFullGC           = false                               {manageable}bool PrintConcurrentLocks                      = false                               {manageable}bool PrintGC                                   = false                               {manageable}bool PrintGCDateStamps                         = false                               {manageable}bool PrintGCDetails                            = false                               {manageable}bool PrintGCID                                 = false                               {manageable}bool PrintGCTimeStamps                         = false                               {manageable}

注意:动态修改职能针对当前的进程,当我们的应用重启之后进程其实就变了,所以这里的动态修改也就是在线排查或在线调优的时候用一用。

jmap

导出 JVM 内存映射,它可以获取 dump 文件,还可以获取进程的内存相关信息,包括各区域的使用情况等

$> jmap -help
Usage:jmap [option] <pid>(to connect to running process)jmap [option] <executable <core>(to connect to a core file)jmap [option] [server_id@]<remote server IP or hostname>(to connect to remote debug server)where <option> is one of:<none>               to print same info as Solaris pmap-heap                to print java heap summary-histo[:live]        to print histogram of java object heap; if the "live"suboption is specified, only count live objects-clstats             to print class loader statistics-finalizerinfo       to print information on objects awaiting finalization-dump:<dump-options> to dump java heap in hprof binary formatdump-options:live         dump only live objects; if not specified,all objects in the heap are dumped.format=b     binary formatfile=<file>  dump heap to <file>Example: jmap -dump:live,format=b,file=heap.bin <pid>-F                   force. Use with -dump:<dump-options> <pid> or -histoto force a heap dump or histogram when <pid> does notrespond. The "live" suboption is not supportedin this mode.-h | -help           to print this help message-J<flag>             to pass <flag> directly to the runtime system

导出 dump 文件

## jmap -dump:format=b,file=<fileName.hprof> <pid> 
## 只导出存活对象 jmap -dump:live,format=b,file=<fileName.hprof> <pid>
$> jmap -dump:format=b,file=test.hprof 进程id
Dumping heap to /home/test/test.hprof ...
Heap dump file created

导出后我们可能需要使用相关的工具才能分析 dump 文件,这个我们后面再说。

以上为使用 jmap 命令进行导出。我们在前面文章 《JVM GC 垃圾收集器》中提到 -XX:HeapDumpPath 和 -XX:+HeapDumpOnOutOfMemoryError 参数组合也会导出 dump 文件,区别在于,自动导出时是因为触发了 FullGC。

  • -XX:HeapDumpPath=path
    将 OutOfMemoryError 转储到 .hprof 文件,此设置虚配合 -XX:+HeapDumpOnOutOfMemoryError 一起使用

示例:-XX:HeapDumpPath=./java_pid%p.hprof , %p 表示进程id

  • -XX:+HeapDumpOnOutOfMemoryError
    当出现 java.lang.OutOfMemoryError 异常,则将根据 -XX:HeapDumpPath=path 配置输出 .hprof 文件

查看堆内存信息

## jmap -heap <pid> 显示堆内存当前的使用情况
## jmap -histo[:live] <pid> 统计所有[存活]的对象并统计其占用内存信息以及对象个数等
$> jmap -heap 进程id
Attaching to process ID 进程id, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.181-b13using thread-local object allocation.
Parallel GC with 4 thread(s)# 堆空间的配置信息
Heap Configuration:MinHeapFreeRatio         = 0MaxHeapFreeRatio         = 100MaxHeapSize              = 2051014656 (1956.0MB)NewSize                  = 42991616 (41.0MB)MaxNewSize               = 683671552 (652.0MB)OldSize                  = 87031808 (83.0MB)NewRatio                 = 2SurvivorRatio            = 8MetaspaceSize            = 21807104 (20.796875MB)CompressedClassSpaceSize = 1073741824 (1024.0MB)MaxMetaspaceSize         = 17592186044415 MBG1HeapRegionSize         = 0 (0.0MB)Heap Usage:
PS Young Generation
Eden Space: # Eden 区信息capacity = 38797312 (37.0MB)used     = 35691760 (34.03831481933594MB)free     = 3105552 (2.9616851806640625MB)91.9954454576647% used
From Space: # from 区信息capacity = 524288 (0.5MB)used     = 131072 (0.125MB)free     = 393216 (0.375MB)25.0% used
To Space: # to 区信息capacity = 524288 (0.5MB)used     = 0 (0.0MB)free     = 524288 (0.5MB)0.0% used
PS Old Generation # 老年代信息capacity = 195559424 (186.5MB)used     = 54819320 (52.27977752685547MB)free     = 140740104 (134.22022247314453MB)28.03205229322009% used34583 interned Strings occupying 4040496 bytes.

从以上信息我们可以知道,当前进程中,大部分对象都在老年代,说明我们的很多对象生命周期过长了。

jstack

打印 Java 进程、核心文件或远程调试服务器的 Java 线程堆栈跟踪。

$> jstack -help
Usage:jstack [-l] <pid>(to connect to running process) # 连接正在执行的进程jstack -F [-m] [-l] <pid>(to connect to a hung process) # 连接到挂起的进程jstack [-m] [-l] <executable> <core>(to connect to a core file) # jstack [-m] [-l] [server_id@]<remote server IP or hostname>(to connect to a remote debug server)Options:-F  to force a thread dump. Use when jstack <pid> does not respond (process is hung) # 强制打印-m  to print both java and native frames (mixed mode) # 打印具有 Java 和本机 C/C++ 帧的混合模式堆栈跟踪-l  long listing. Prints additional information about locks # 打印有关锁的附加信息-h or -help to print this help message 

示例

$> jstack 进程id
2023-10-10 21:28:17
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.181-b13 mixed mode):"Attach Listener" #440036 daemon prio=9 os_prio=0 tid=0x00007fd96001f800 nid=0x324c waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLE # 当前线程的状态 RUNNABLE 、WAITING都算正常 TIME_WAITTING 程序 sleep 中"Java2D Disposer" #77543 daemon prio=10 os_prio=0 tid=0x00007fd91005b800 nid=0x45e0 in Object.wait() [0x00007fd900dd4000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)- locked <0x0000000088ce20b0> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)at sun.java2d.Disposer.run(Disposer.java:148)at java.lang.Thread.run(Thread.java:748)"logback-8" #50912 daemon prio=5 os_prio=0 tid=0x00007fd9740d3800 nid=0x296c waiting on condition [0x00007fd8ffecf000]java.lang.Thread.State: WAITING (parking)at sun.misc.Unsafe.park(Native Method)- parking to wait for  <0x00000000885336a0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1081)at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748)"logback-7" #44036 daemon prio=5 os_prio=0 tid=0x00007fd9740d3000 nid=0x75e8 waiting on condition [0x00007fd8fffd0000]java.lang.Thread.State: WAITING (parking)at sun.misc.Unsafe.park(Native Method)- parking to wait for  <0x00000000885336a0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1081)at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748)"logback-6" #37255 daemon prio=5 os_prio=0 tid=0x00007fd97407a000 nid=0x32ac waiting on condition [0x00007fd93e4b7000]java.lang.Thread.State: WAITING (parking)at sun.misc.Unsafe.park(Native Method)- parking to wait for  <0x00000000885336a0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1081)at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748)

显示出的状态包括如下几个:

  • DeadLock:死锁
  • Waiting on condition:等待资源
  • Waiting on monitor entry:等待获取监视器
  • Blocked:阻塞
  • Runnable:执行中
  • Suspend:暂停
  • 其他
    这其中死锁、等待资源、等待获取监视器、阻塞等情况需要进行重点关注。

关于命令的详细参数选项以及说明可以参考官网 https://docs.oracle.com/javase/8/docs/technotes/tools/unix/index.html

JVM 可视化分析工具

  • jconsole JDK bin 目录下
  • jvisualvm JDK bin 目录下,也可以直接下载相关 Visualvm 软件。idea 中可以使用 VisualVM Launcher 插件来快速启动。Visualvm 本身也有许多有用的插件。
  • JMC JDK bin 目录下
  • Eclipse MAT(Memory Analyzer Tool) Eclipse 推出的内存分析工具,也可以在 Eclipse 中通过插件引入。其特点是开源免费,老牌 IDE Eclipse 出品,功能也挺多的,可直接下载 MAT 软件启动,也可以在 Eclipse 中通过插件引入。
  • JProfiler:商业付费,idea 有快速启动其的同名插件。界面清晰,功能强大,目前最新的 14.0 版本是支持中文显示界面的。14.0 版本官方教程文档 https://www.ej-technologies.com/resources/jprofiler/v/14.0/help_zh_CN/doc/main/introduction.html
  • Arthas:阿里开源,它是可以在生产环境进行运行分析的,官方说明是,它可以不停止应用对应用进行分析,且不会像远程调试一样会阻塞应用执行。官网地址为:https://arthas.aliyun.com/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/158213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML+CSS+ElementUI搭建个人博客静态页面展示(纯前端)

网站演示 搭建过程 技术选取:HTML/CSS VUE2 ElementUI(Version - 2.15.14)编程软件:VSCode 环境配置与搭建 安装指令 1. 先确保你的电脑已经安装好了npm和node npm -vnode -v2. ElementUI下载&#xff0c;推荐使用 npm 的方式安装 npm i element-ui -S3. CDN引入 <!--…

根据list集合进行分页

/*** param pageInfo* param caseInfoList*/ public static Map<String, Object> resultPageList(PageInfo pageInfo, List<?> caseInfoList) {Map<String, Object> resultMap new HashMap<>();int pageSize 0;int count 0;//刚开始的页面为第一页pa…

C语言入门——第十七课

一、二分查询 1.概念 二分查询又被称为二分查找&#xff0c;是一种在有序数组或序列中快速查找到对应元素的一种方法。每次查找范围缩小至原来的一半。 ①前提条件 数组和列表必须有序&#xff0c;否则无法进行二分查找。 ②初始化 确定查找数组和列表的左边界&#xff0…

C盘变红怎么办?一个快速解决C盘快满的方法

前情提要 通常解决C盘快满的方法是&#xff1a; 找到C盘—右击选择“属性”—选择“详细信息”—卸载不常用的软件或者清除临时文件 缺点&#xff1a;成效甚微 今日重点 1.背景知识&#xff1a;微信是我们日常工作和生活都离不开的工具&#xff0c;我们每天使用微信会产生大量…

java网络编程Socket output is already shutdown

在java的网络编程中使用TCP协议在Client端和Server端循环收发消息时&#xff0c;如果用的是BufferedReader和BufferedWriter&#xff0c;出现Client端只能发送一次消息&#xff0c;当发送第二次消息时&#xff0c;Server端已经关闭的情况&#xff0c;具体报错为&#xff1a;Soc…

C 语言共用体(Union)

C 语言共用体(Union) 在本教程中&#xff0c;您将学习C语言编程中的共用体。更具体地说&#xff0c;如何创建共用体&#xff08;联合体&#xff09;&#xff0c;访问其成员以及了解共用体与组织之间的差异。共用体又被称为联合体, 和结构体同属于C语言数据类型中的结构类型。 …

Mendix与Java组件的完美结合实践

前言 在技术驱动的今天&#xff0c;应用开发的速度和质量已经成为企业竞争力的决定性因素。Mendix&#xff0c;作为一款领先的低代码开发平台&#xff0c;已经为全球数千家企业提供了快速、高效的开发解决方案。但在某些情况下&#xff0c;企业的特定需求可能超出了Mendix的标…

sqli-labs(3)

11. 看到登录框直接or 11 在hackerabar中我们可以看到这里是post传递的数据&#xff0c;在get中用--来注释后面的内容 因为get中#是用来指导浏览器动作的&#xff0c;--代表注释是空格&#xff0c;所以这里用# 之后就和get的一样了 1 order by 2 # order by 3报错 联合注入 …

21款奔驰GLS450升级23P驾驶辅助 提升安全出行

辅助驾驶越来越多的被大家所青睐&#xff01;为了提升驾驶安全性和舒适便捷性奔驰改装原厂半自动驾驶23P辅助系统 23P智能辅助驾驶系统还是很有必要的&#xff0c;因为在跑高速的时候可以使用23P智能驾驶的自动保持车速&#xff0c;保持车距&#xff0c;车道自动居中行驶以及自…

CRM商机管理软件:构建客户为中心的管理理念

企业为什么选择CRM商机管理软件&#xff1f;1.CRM软件能够帮助企业建立以客户为中心的管理理念&#xff1b;2.CRM商机管理软件全面直观的展示客户数据&#xff1b;3.市场人员可以制订个性化的营销策略&#xff1b;4.移动应用为外出的销售带来的便利。 1.构建客户为中心的管理理…

C++实现KNN和K-Means

学校机器学习课程的实验课要求实现KNN和K-Means&#xff1a; &#xff08;平时没听课&#xff09;临时去查了一下KNN和K-Means是啥&#xff0c;然后自己用C写了小例子&#xff0c;想着写都写了那就把代码贴出来吧。 顺便再聊聊自己对于这俩算法的理解。 下面是文心一言的回答…

十年诉讼,迈瑞真的赢了吗?

迁延十年&#xff0c;迈瑞与科曼的知识产权纠纷案究竟要如何解读&#xff1f; 发端于2013年&#xff0c;两家国内医疗器械行业知名公司间的专利互诉官司&#xff0c;成为全行业最具代表性的案例。但这一案例本质并不复杂&#xff1a;不过商业利益之争。 要在烈度不断抬升的市…

项目管理PMP6.0-五大过程组、十大知识领域、四十九个过程(记忆码:7664363734)

项目管理PMP6.0-五大过程组、十大知识领域、四十九个过程&#xff08;记忆码&#xff1a;7664363734&#xff09; 项目经理的影响力范围三者关系图&#xff08;五大过程组、十大知识领域、四十九个过程&#xff09;五大过程组十大知识领域十大知识领域之间联系 四十九个过程&am…

如何通过提升客户体验带来更大的增长、更好的客户留存率?

客户期望的转变 在一个日益数字化的世界里&#xff0c;有必要采取以客户为中心的思维方式。因为客户与企业互动的方式有很多是在数字空间发生的&#xff0c;客户的需求和模式已经转变。 这种情况已经酝酿了几年&#xff0c;但在2020年才打开闸门。随着疫情的爆发&#xff0c;企…

FTX的前世今生:崛起、辉煌与崩塌

FTX&#xff0c;一度被誉为加密货币领域的明星交易所&#xff0c;其快速的崛起和令人瞩目的崩塌吸引了全球的关注。让我们回顾一下FTX的前世今生&#xff0c;了解其短暂的辉煌和骤然的崩塌。 1. 崛起&#xff1a; FTX的创始人山姆班克曼-弗里德在加密货币领域具有深厚的背景和…

Linux主机间的相互免秘钥

主机间的相互免秘钥 1.生成密钥 ssh-keygen -t rsa -P -f ~/.ssh/id_rsa运行以上命令后会在 ~/.ssh/ 目录下生成一对密钥对。 2.拷贝公钥 把自己的公钥传递给对方主机即可&#xff0c;这个公钥文件必须放在对方主机的~/.ssh/authorized_keys 文件中。 ssh-copy-id -i ~/.s…

智能座舱架构与芯片 - (2) 架构篇

一、定义 1.1 智能座舱定义 按照百度百科的定义&#xff0c;智能座舱&#xff08;intelligent cabin&#xff09;旨在集成多种IT和人工智能技术&#xff0c;打造全新的车内一体化数字平台&#xff0c;为驾驶员提供智能体验&#xff0c;促进行车安全。目前国内外已经有很多研究…

Django ORM 执行复杂查询的技术与实践

概要 Django ORM&#xff08;Object-Relational Mapping&#xff09;是 Django 框架的核心组件之一&#xff0c;提供了一种高效、直观的方式来处理数据库操作。尽管简单查询在 Django ORM 中相对容易实现&#xff0c;但在面对复杂的数据请求时&#xff0c;需要更深入的了解和技…

SSM应用程序启动流程

在一个基于SSM&#xff08;Spring Spring MVC MyBatis&#xff09;框架的Web应用程序中&#xff0c;启动过程涉及到Spring的IOC容器和MVC容器的初始化。 IOC容器初始化&#xff1a; Spring的IOC容器主要负责管理和装配应用程序中的各个Bean。在SSM框架中&#xff0c;IOC容器的…

【文末送书】深入浅出嵌入式虚拟机原理

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…