【高频面试题】JVM篇

news2025/1/16 11:03:40

文章目录

  • 一、JVM组成
    • 1.什么是程序计数器
    • 2.什么是Java堆?
    • 3.能不能介绍一下方法区(元空间)
    • 4.你听过直接内存吗
    • 5.什么是虚拟机栈
    • 6.垃圾回收是否涉及栈内存?
    • 7.栈内存分配越大越好吗?
    • 8.方法内的局部变量是否线程安全?
    • 9.什么情况下会导致栈内存溢出?
    • 10.堆栈的区别是什么
  • 二、类加载器
    • 11.什么是类加载器,类加载器有哪些
    • 12.什么是双亲委派模型?
    • 13.JVM为什么采用双亲委派机制?
    • 14.说一下类装载的执行过程
  • 三、垃圾回收
    • 15.强引用、软引用、弱引用、虚对象什么时候可以被垃圾器回收
      • 15.1 对象什么时候可以被垃圾器回收
    • 16.JVM 垃圾回收算法有哪些?
      • 16.1 标记清除算法
      • 16.2 标记整理算法( 标记清除算法的升级---多了一个整理阶段)
      • 16.3 复制算法
    • 17.说一下JVM中的分代回收
      • 17.1 MinorGC、 Mixed GC 、 FullGC的区别是什么
    • 18.说一下JVM有哪些垃圾回收器?
    • 19.详细聊一下G1垃圾回收器
  • 四、JVM实践
    • 20.JVM 调优的参数可以在哪里设置
    • 21.用的 JVM 调优的参数都有哪些?
    • 22.说一下 JVM 调优的工具?
    • 23.Java内存泄露的排查思路?
    • 24.CPU飙高排查方案与思路?

JVM是什么:
JVM(Java虚拟机)是Java程序的 运行环境,它是Java平台的核心组成部分之一。JVM提供了一个 运行Java字节码的虚拟机,负责将 Java程序解释和执行。

Java程序员可以在JVM上编写和运行Java程序,而不用考虑底层操作系统的差异性。JVM的特性使得Java具备了跨平台性,同一份Java代码可以在不同的操作系统上运行
在这里插入图片描述
组成部分如下:
在这里插入图片描述

一、JVM组成

1.什么是程序计数器

程序计数器:线程私有的,内部保存的字节码的行号。用于记录正在执行的字节码指令的地址。(通俗的来说就是记录当前线程的程序执行的字节码指令的行号)

在这里插入图片描述


2.什么是Java堆?

线程共享的区域:主要用来保存对象实例数组等,当堆中没有内存空间可分配给实例,也无法再扩展时,则抛出OutOfMemoryError异常。

Java1.8-JVM内存结构

在这里插入图片描述
其中:堆分为两部分
年轻代
包括三部分,Eden区和两个大小严格相同的Survivor区,根据JVM的策略,在经过几次垃圾收集后,任然存活于Survivor的对象将被移动到老年代区间。

老年代
主要保存生命周期长的对象,一般是一些老的对象

元空间
保存的类信息静态变量常量编译后的代码

Java1.7-JVM内存结构

唯一的不同就是在java8的JVM中,元空间是在本地内存中的,而java7当中元空间是作为方法区/永久代存在于堆空间中的

在这里插入图片描述
因而在1.8之后做出改动,主要是为了防止OMM内存泄漏,因为元空间(方法区/永久代)保存的是类信息静态变量常量编译后的代码,随着程序不断庞大,实现很难预估元空间的大小,久而久之就会产生OMM。

在旧的Java版本(如Java 7及更早版本)中,方法区和永久代(PermGen)都是的一部分,用于存储类的结构信息、常量池、静态变量等。但永久代容易导致内存溢出的问题,因为它的大小是固定的,并且无法在运行时动态调整。
为了解决这个问题,并改进类的元数据的存储方式,Java 8 引入了元空间(Metaspace)。元空间通过使用本地内存来存储类的元数据,有效地解决了永久代的限制和内存溢出问题。与永久代不同,元空间的大小并不受堆内存大小的限制,而是受系统的物理内存限制

元空间还具有自动调整大小的能力,可以根据需要动态地分配和释放内存。这使得元空间更具灵活性和可靠性,并能更好地适应各种应用程序的需求。


3.能不能介绍一下方法区(元空间)

在不同的JVM实现中,方法区存在位置是不一样的。
这里举例在jdk1.7时的jvm
在这里插入图片描述

方法区(Method Area)是各个线程共享的内存区域
主要存储类的信息运行时常量池
虚拟机启动的时候创建关闭虚拟机时释放
如果方法区域中的内存无法满足分配请求,则会抛出OutOfMemoryError: Metaspace
在这里插入图片描述
普通常量池
可以看作是一张表,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等信息

通俗的说,就是记录了虚拟机指令和执行的类名、方法名等信息的映射关系

编译阶段:常量池的符号引用为这种#+数字,因为只是编译阶段,没到运行阶段,只需要直到机器指令和方法、类名等等的映射关系,能找到对应上就算编译通过

在这里插入图片描述
运行时常量池
在类加载阶段,JVM会将符号引用解析为直接引用(将符号替换为真实的地址值),并将其存储在常量池中,以供运行时使用。

*常量池是 .class 文件中的,当该类被加载,它的常量池信息就会放入运行时常量池,并把里面的符号地址变为真实地址

在这里插入图片描述


4.你听过直接内存吗

直接内存:并不属于JVM中的内存结构不由JVM进行管理。是虚拟机的系统内存,常见于NIO(非阻塞io)操作时,用于数据缓冲区,它分配回收成本较高,但读写性能高

直接内存最直接的体现就是常规IO和NIO的区别:
我们都知道NIO是非阻塞的,IO是传统阻塞式

IO传统阻塞式

在这里插入图片描述

相当于java程序不能直接去读系统内存给的数据,需要一个媒介就是堆内存java缓冲区

NIO非阻塞式
在这里插入图片描述

相比较IO是直接到直接内存读数据,所以只要将磁盘文件读到直接内存,数据准备就绪,程序切换到内核态就直接从直接内存读数据


5.什么是虚拟机栈

通俗来说就是线程的方法栈

Java Virtual machine Stacks (java 虚拟机栈)

每个线程运行时所需要的内存,称为虚拟机栈,先进后出

每个栈由多个栈帧(frame)组成(一个栈帧代表一个方法占用的内存),对应着每次方法调用时所占用的内存

每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法

也就是一个方法(主方法)可以调用其他很多别的方法(子方法)

在这里插入图片描述


6.垃圾回收是否涉及栈内存?

垃圾回收主要指就是堆内存,当栈帧弹栈以后,内存就会释放


7.栈内存分配越大越好吗?

未必,默认的栈内存通常为1024k
栈帧过大会导致线程数变少,例如,机器总内存为512m,目前能活动的线程数则为512个,如果把栈内存改为2048k,那么能活动的栈帧就会减半

很好理解,机器内存就那么多,单独把栈内存调大了,那么栈帧的个数自然的得变少,所以对应的线程数就会变少


8.方法内的局部变量是否线程安全?

如果方法内局部变量没有逃离方法的作用范围,它是线程安全
如果是局部变量引用了对象,并逃离方法的作用范围,需要考虑线程安全

通俗来说,就是看方法内的局部变量是不是完全包围在方法内(像如果是作为方法参数传过来的、作为返回值返回的都可以算是逃离了方法的作用范围),这样别的线程可以肆意修改方法内的局部变量

在这里插入图片描述


9.什么情况下会导致栈内存溢出?

栈帧过多导致栈内存溢出,典型问题:递归调用
在这里插入图片描述

栈帧过大导致栈内存溢出(基本上不存在)

栈的容量较小:相对于堆内存而言,栈内存的容量通常比较有限。每个线程都有自己的栈空间,而每个栈的大小通常只有几MB到几十MB。这限制了栈帧的大小,使得栈溢出的概率较低。


10.堆栈的区别是什么

分配对象和数据类型:堆内存用于分配Java对象数组。所有通过关键字new创建的对象以及通过反射或JNI创建的对象都存储在堆中。而栈内存主要用于存储基本数据类型的变量方法调用时的局部变量。

存储位置:堆内存位于JVM的堆区,是一个共享的内存区域。栈内存位于JVM的栈区每个线程都有自己的独立栈

内存管理方式内存的分配和回收由Java虚拟机的垃圾回收器负责管理。垃圾回收器会自动回收不再使用的对象,并释放对应的内存空间。而内存的分配和回收是由编译器自动管理的,当方法执行结束或变量超出作用域时,栈上的内存会自动被释放

内存分配速度内存的分配速度相对较慢,因为需要进行复杂的垃圾回收算法和对象定位操作。而内存的分配速度较快,仅仅是简单地进行指针移动。

内存空间大小限制堆内存的大小一般比栈内存大得多。堆内存的大小可以通过JVM的配置参数进行调整。而内存的大小是由线程的启动参数决定的,每个线程的栈大小通常是固定的。

对象的生命周期堆内存中的对象生命周期可以很长,可以在程序的任意位置被引用和访问。而内存中的局部变量生命周期与方法调用密切相关,当方法执行结束时,栈上的局部变量会自动销毁。

总结来说,堆内存主要用于存储Java对象和数组,由垃圾回收器管理,分配和回收速度相对较慢;而栈内存主要用于存储基本数据类型的变量和方法调用时的局部变量,由编译器自动管理,分配和回收速度相对较快。两者在内存管理方式、存储位置、分配速度和大小等方面有较大的区别。


二、类加载器

11.什么是类加载器,类加载器有哪些

类加载器
JVM只会运行二进制文件,类加载器的作用就是将字节码文件加载到JVM中,从而让Java程序能够启动起来。
在这里插入图片描述
类加载器包括四种

启动类加载器(加载像库里自带的类string integer等等(BootStrap ClassLoader):加载JAVA_HOME/jre/lib目录下的库
扩展类加载器(ExtClassLoader):主要加载JAVA_HOME/jre/lib/ext目录中的类
应用类加载器(加载自己java程序写的类(AppClassLoader):用于加载classPath下的类
自定义类加载器(很少自己写加载器(CustomizeClassLoader):自定义类继承ClassLoader,实现自定义类加载规则。
在这里插入图片描述


12.什么是双亲委派模型?

加载某一个类,先委托上一级的加载器进行加载,如果上级加载器也有上级,则会继续向上委托,如果该类委托上级没有被加载子加载器尝试加载该类
举例:

假设有一个Student类,需要加载
这个时候就会定位到AppclassLoader(应用类加载器),发现应用记载器有上级加载器,就先不加载,看看上级加载器里面有没有加载过的Student类,一直往上找,发现都没有加载过的Student类,那么此时AppclassLoader才会去加载Student类

在这里插入图片描述
假设有一个String类,需要加载,也是定位到AppclassLoader(应用类加载器)往上委托直到找到启动类加载器,找到了加载好的String类,直接加载。
在这里插入图片描述


13.JVM为什么采用双亲委派机制?

JVM采用双亲委派机制(Parent Delegation Model)是为了解决两个主要问题:
安全性避免类的重复加载

安全性体现在:
确保核心Java库的安全性,避免恶意代码通过自定义的类伪装成核心类库,从而提高系统的安全性。

例如下面我们自己创建一个String包装类,此时核心类库是本身就会加载这个类,这个时候就会报错,不允许加载自定义的核心库的类。

双亲委派机制可以确保核心Java库的安全性。当一个类需要被加载时,首先会委派给父类加载器进行查找和加载只有在父类加载器无法找到该类时才会由当前类加载器自己去加载。

在这里插入图片描述
在这里插入图片描述

避免类的重复加载体现在
通过双亲委派机制,当一个类需要被加载时,首先由父类加载器尝试加载,如果父类加载器已经加载了该类,就直接返回;否则,再由子类加载器尝试加载。这种机制可以确保在整个类加载器层次结构中每个类只被加载一次避免了类的重复加载,提高了运行效率


14.说一下类装载的执行过程

类在装载的时候会经历7个过程:

在这里插入图片描述

  • 加载:查找和导入class文件
  • 验证:保证加载类的准确性
  • 准备:为类变量分配内存并设置类变量初始值
  • 解析:把类中的符号引用转换为直接引用
  • 初始化:对类的静态变量,静态代码块执行初始化操作
  • 使用:JVM 开始从入口方法开始执行用户的程序代码
  • 卸载:当用户程序代码执行完毕后,JVM便开始销毁创建的Class对象。

详细参考链接:【JVM】类装载的执行过程


三、垃圾回收

15.强引用、软引用、弱引用、虚对象什么时候可以被垃圾器回收

15.1 对象什么时候可以被垃圾器回收

垃圾回收,回收的是针对于堆的
在这里插入图片描述

简单一句就是:如果一个或多个对象没有任何的引用指向它了,那么这个对象现在就是垃圾,如果定位了垃圾,则有可能会被垃圾回收器回收。

如果要定位什么是垃圾,有两种方式来确定,第一个是引用计数法,第二个是可达性分析算法

引用计数法(不常用)

一个对象被引用了一次,在当前的对象头上递增一次引用次数(ref=1),如果这个对象的引用次数为0(ref=0),代表这个对象可回收
在这里插入图片描述
但是当对象间出现了循环引用的话,则引用计数法就会失效
在这里插入图片描述

可达性分析算法
现在的虚拟机采用的都是通过可达性分析算法来确定哪些内容是垃圾。

比如下面的例子
X,Y这两个节点是可回收的
Java 虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象
扫描堆中的对象,看是否能够沿着 GC Root 对象 为起点的引用链找到该对象,找不到,表示可以回收
在这里插入图片描述
哪些对象可以作为 GC Root ?

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象
    在这里插入图片描述

  • 方法区中类静态属性引用的对象
    在这里插入图片描述

  • 方法区中常量引用的对象
    在这里插入图片描述

  • 本地方法栈中 JNI(即一般说的 Native 方法)引用的对象


16.JVM 垃圾回收算法有哪些?

参考链接:GC详解、GC四大算法和GC Root

总共分为三种:
标记清除算法:垃圾回收分为2个阶段,分别是标记和清除,效率高,有磁盘碎片,内存不连续

标记整理算法:标记清除算法一样,将存活对象都向内存另一端移动,然后清理边界以外的垃圾,无碎片,对象需要移动,效率低

复制算法:将原有的内存空间一分为二,每次只用其中的一块,正在使用的对象复制到另一个内存空间中,然后将该内存空间清空,交换两个内存的角色,完成垃圾的回收;无碎片,内存使用率低

16.1 标记清除算法

标记清除算法,是将垃圾回收分为2个阶段,分别是标记和清除
1.根据可达性分析算法得出的垃圾进行标记
2.对这些标记为可回收的内容进行垃圾回收

注意:标记GC Root引用链的对象,回收的就是没有被标记的
在这里插入图片描述

缺点:

  • 需要两次扫描,耗时严重。

先扫描一次,对存活的对象进行标记。
再次扫描,回收没有被标记的对象。

  • 会产生内存碎片,导致内存空间不连续。

当需要分配一个较大的内存块时,由于没有足够的连续内存空间,可能会导致分配失败即内存溢出。

16.2 标记整理算法( 标记清除算法的升级—多了一个整理阶段)

优缺点同标记清除算法,解决了标记清除算法的碎片化的问题,同时,标记压缩算法多了一步,对象移动内存位置的步骤,其效率也有有一定的影响。

相比较标记清除算法在垃圾回收后,会将活着的对象滑动到一侧,这样就能让空出的内存空间是连续的。
在这里插入图片描述

16.3 复制算法

相当于把一块堆内存分成两半来用,一般拿来存对象,另一半拿来做垃圾回收后的整理收纳仓(必须为空闲空间)

复制算法需要将存活的对象一个区域复制到另一个区域(空白区域),然后直接清空存活对象和待回收对象的那一片区域

注意:要求堆内存的使用比例不超过50%,因为每次垃圾回收时,需要保证目标区域有足够的空间来存放从源区域复制过来的对象。

在这里插入图片描述
优点:
在垃圾对象多的情况下,效率较高
清理后,内存无碎片

缺点:
分配的2块内存空间,在同一个时刻,只能使用一半,内存使用率较低


17.说一下JVM中的分代回收

一、堆的区域划分
堆被分为了两份:新生代和老年代【1:2】
对于新生代,内部又被分为了三个区域。Eden区幸存者区survivor(分成from和to)【8:1:1】

二、对象回收分代回收策略

  • 新创建的对象,都会先分配到eden区
  • 当伊甸园内存不足,标记伊甸园与 from(现阶段没有)的存活对象
  • 将存活对象采用复制算法复制到to中,复制完毕后,伊甸园和 from 内存都得到释放
  • 经过一段时间后伊甸园的内存又出现不足,标记eden区域to区存活的对象,将其复制到from区
  • 当幸存区对象熬过几次回收(最多15次),晋升到老年代(幸存区内存不足或大对象会提前晋升)

参考链接:【JVM】JVM中的分代回收

17.1 MinorGC、 Mixed GC 、 FullGC的区别是什么

STW(Stop-The-World):暂停所有应用程序线程,等待垃圾回收的完成

MinorGC、 Mixed GC 、 FullGC 相当于垃圾回收的等级:
在这里插入图片描述

MinorGC:【young GC】发生在新生代的垃圾回收,暂停时间短(STW)
Mixed GC新生代 + 老年代部分区域的垃圾回收,G1 收集器特有
FullGC新生代 + 老年代完整垃圾回收,暂停时间长(STW),应尽力避免


18.说一下JVM有哪些垃圾回收器?

在jvm中,实现了多种垃圾收集器,包括:

  1. 串行垃圾收集器
    Serial 作用于新生代,采用复制算法
    Serial Old 作用于老年代,采用标记-整理算法

  2. 并行垃圾收集器(JDK8默认使用此垃圾回收器
    Parallel New作用于新生代,采用复制算法
    Parallel Old作用于老年代,采用标记-整理算法

  3. CMS(并发)垃圾收集器
    针对老年代垃圾回收的

  4. G1垃圾收集器(在JDK9之后默认使用
    应用于新生代和老年代

详细参考链接:


19.详细聊一下G1垃圾回收器


四、JVM实践

20.JVM 调优的参数可以在哪里设置


21.用的 JVM 调优的参数都有哪些?


22.说一下 JVM 调优的工具?


23.Java内存泄露的排查思路?


24.CPU飙高排查方案与思路?

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

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

相关文章

ntfy 实现消息订阅和通知(无需注册、无需服务器,太好了)

目录 一、下载 ntfy 的Delphi 库(打开ntfy for Delphi 的开源库地址) 二、创建发布消息程序 三、订阅(接收)消息程序 四、说明: 五、程序下载(包含库): ntfy 可让你在任何电脑上通…

【muduo】关于自动增长的缓冲区

目录 为什么需要缓冲区自动增长的缓冲区buffer数据结构buffer类 写详细比较费时间,就简单总结下。 总结自Linux 多线程服务端编程:使用 muduo C 网络库 Muduo网络编程: IO-multiplexnon-blocking 为什么需要缓冲区 Non-blocking IO 的核心…

1990-2021年上市公司绿色专利和绿色使用新型申请获得分类号数据

1990-2021年上市公司绿色专利申请获得分类号数据 1、时间:1990-2021年 2、来源:国家知识产权局 3、指标: 绿色专利申请数量(分A类 B类C类D类E类F类G类H类)、绿色专利获得数量(分A类 B类C类D类E类F类G类…

商业智能BI,如何区别联机事务处理(OLTP)和联机分析处理(OLAP)

商业智能(Business Intelligence,简称:BI),又称商业智慧或商务智能,指用现代数据仓库技术、线上分析处理技术、数据挖掘和数据展现技术进行数据分析以实现商业价值。 商业智能BI - 派可数据数据可视化分析平台 定义为下列软件工具…

容器虚拟化基础之NameSpace

“只想从这无边的寂寞中逃出来。” 一、什么是虚拟化、容器化? 物理机:实际的服务器或者计算机。 这是相对于虚拟机而言的对实体计算机的称呼,物理机提供虚拟机以硬件环境,有时候也称为"宿主"或"寄主"。 虚拟机: 指通过软…

论文笔记--Llama 2: Open Foundation and Fine-Tuned Chat Models

论文笔记--Llama 2: Open Foundation and Fine-Tuned Chat Models 1. 文章简介2. 文章概括3 文章重点技术3.1 预训练Pretraining3.1.1 预训练细节3.1.2 Llama2模型评估 3.2 微调Fine-tuning3.2.1 Supervised Fine-Tuning(FT)3.2.2 Reinforcement Learning with Human Feedback(…

mysql 技术总结

一、mysql 索引(左小右大) 下图中为二叉树 mysql索引类型以及数据结构 BTREE结构 BTree又叫多路平衡搜索树,一颗m叉的BTree特性如下: 树中每个节点最多包含m个孩子。 除根节点与叶子节点外,每个节点至少有[ceil(m/2…

SSH连接阿里服务器搭建JAVA环境

远程连接ssh windows利用PowerShell远程连接ssh 1.打开PowerShell 方法1 1).同时按下Windows R键以弹出“运行”对话框 2).在框中键入PowerShell,然后单击OK(确定)按钮 方法2 1)在任意目录下,shift右键&#…

每日一题——寻找旋转排序数组中的最小值(I)

寻找旋转排序数组中的最小值——I 题目链接 思路 首先我们以数组[1,2,3,4,5,6,7]举个例子,经过旋转后它无非就这两种情况: 情况一:旋转过后数组变成两段有序数列: 情况二:旋转过后数组不变,仍然有序&…

流量,日志分析--理论

提供资料: Wireshark 基本语法,基本使用方法,及包过虑规则 : https://blog.csdn.net/qq_17457175/article/det ails/53019490 ctf 常见流量分析题目类型 : https://ctf-wiki.org/misc/traffic/introduction/ windows 日志 : https://jone…

内网横向移动—ARP攻击图片捕捉数据劫持DNS劫持

内网横向移动—ARP攻击&图片捕捉&数据劫持&DNS劫持 1. ARP1.1. APR介绍1.1.1. ARP工作原理1.1.2. APR欺骗工作原理 1.2. 环境准备1.3. 适用场景 2. ARP断网攻击演示2.1. 使用kali进行演示2.1.1. nmap判断存活2.1.2. 安装工具2.1.3. 攻击Windows 10虚拟机2.1.3.1. 查…

VMware 16 Pro将电脑里的文件移动到虚拟机中【附带可能出现的问题和解决】

VMware 16 Pro将电脑里的文件移动到虚拟机中 1.使用VM tools 打开VM ware会出现下面的,直接点击安装。 点击下一步 选哪个都行 之后会重启虚拟机,然后就可以使用了。 我没有程序可以打开压缩包,显示我的虚拟机网络没法用,点击…

Redis实战案例26-签到功能

1. BitMap 假如用户数量为一千万,平均每人每年签到次数为 10 次,则这张表一年的数据量为 1 亿条; 而每签到一次需要使用(8 8 1 1 3 1)共 22 字节的内存,一个月则最多需要 600 多字节,如果是…

配置Arduino+ESP32走过的巨坑

项目场景: 前几天去淘宝买了块ESP32拿来用,配置Arduino最新版ESP32 2.0.11走过的巨坑。 问题描述 先安装好了ArduinoIDE最新版(教程里介绍去官网下),然后配置ESP32开发板,后面发现安装速度惊人。 去找加速…

SpringBoot项目(验证码整合)——springboot整合email springboot整合阿里云短信服务

目录 引出springboot整合email配置邮箱导入依赖application.yml配置email业务类测试类 springboot整合阿里云短信服务申请阿里云短信服务测试短信服务获取阿里云的accessKeyspringboot整合阿里云短信导包工具类 总结 引出 1.springboot整合email,qq邮箱,…

分布式 - 消息队列Kafka:Kafka消费者分区再均衡(Rebalance)

文章目录 01. Kafka 消费者分区再均衡是什么?02. Kafka 消费者分区再均衡的触发条件?03. Kafka 消费者分区再均衡的过程?04. Kafka 如何判定消费者已经死亡?05. Kafka 如何避免消费者的分区再均衡?06. Kafka 消费者分区再均衡有什…

Matlab绘制圆形(rectangle函数、viscircles函数和圆的参数方程)

基于matlab绘制圆形 一、rectangle函数 对于绘制圆心坐标为(x,y)半径为r的圆形,函数为: x0; y0; r1; rectangle(Position, [x-r,y-r,2*r,2*r], Curvature, [1 1],EdgeColor, r); axis equalEdgeColor表示颜色 二、…

STM32F429IGT6使用CubeMX配置串口通信配置DMA

1、硬件电路 2、设置RCC,选择高速外部时钟HSE,时钟设置为180MHz 3、配置USART1引脚 4、生成工程配置 5、部分代码 /* USER CODE BEGIN 0 */ volatile uint8_t rx_len 0; //接收一帧数据的长度 volatile uint8_t recv_end_flag 0; //一帧数据接收完成标志 uint8…

42. range函数—生成器函数-更新

【目录】 文章目录 1. range( )函数是什么?2. 知识回顾-列表的切片3. range( )函数的语法3.1 range( )函数语法3.2 参数说明3.3 列表切片和range函数的区别 4. 实操练习4.1 参数为一个正整数4.2 参数为04.3 参数为一个负整数4.4 有2个参数4.5 有3个参数4.6 步长为负…

【Freertos基础入门】freertos任务的优先级

文章目录 前言一、任务优先级1.Tick2.修改任务优先级 总结 前言 本系列基于stm32系列单片机来使用freerots 任务管理是实时操作系统(RTOS)的核心功能之一,它允许开发者以并发的方式组织和管理多个任务。FreeRTOS 是一个流行的开源RTOS&…