Java面试汇总——jvm篇
目录
JVM的组成:
1、JVM 概述(⭐⭐⭐⭐)
1.1 JVM是什么?
1.2 JVM由哪些部分组成,运行流程是什么?
2、什么是程序计数器?(⭐⭐⭐⭐)
3、介绍一下Java的堆(⭐⭐⭐⭐)
4、虚拟机栈(⭐⭐⭐⭐)
4.1 什么是虚拟机栈?
4.2 垃圾回收是否涉及栈内存?
4.3 栈帧内存分配越大越好吗?
4.4 方法内的局部变量是否线程安全?
4.5 什么情况下会导致栈内存溢出?
4.6 堆栈的区别是什么?
5、介绍一下方法区(⭐⭐⭐)
5.1 方法区概述
5.2 运行时常量池
6、直接内存(⭐⭐⭐)
类加载器:
7、什么是类加载器,类加载器有哪些?(⭐⭐⭐)
8、双亲委派模型(⭐⭐⭐⭐)
9、类装载的执行过程(⭐⭐⭐)
垃圾回收:
10、对象什么时候可以被垃圾器回收 ?(⭐⭐⭐⭐)
11、JVM 垃圾回收算法(⭐⭐⭐⭐)
12、分代收集算法(⭐⭐⭐⭐)
MinorGC、 Mixed GC 、 FullGC的区别是什么?
13、JVM 垃圾回收器(⭐⭐⭐⭐)
14、强引用、软引用、弱引用、虚引用的区别?
jvm实践
15、JVM 调优的参数可以在哪里设置参数值?(⭐⭐)
16、JVM 调优的参数都有哪些?(⭐⭐⭐)
17、JVM 调优的工具(⭐⭐)
18、Java内存泄露的排查思路(⭐⭐⭐⭐)
19、CPU飙高排查方案与思路(⭐⭐⭐⭐)
JVM的组成:
1、JVM 概述(⭐⭐⭐⭐)
1.1 JVM是什么?
jvm(Java Virtual Machine),是Java程序的运行环境(java二进制字节码的运行环境)。
- 优点:
- 一次编写,到处运行。(jvm屏蔽了各种操作系统)
- 自动内存管理,垃圾回收机制。
1.2 JVM由哪些部分组成,运行流程是什么?
JVM 的主要组成部分 :
- ClassLoader(类加载器)
- Runtime Data Area(运行时数据区,内存分区)
- Execution Engine(执行引擎)
- Native Method Library(本地库接口)
- 类加载器把Java代码转换为字节码。
- 运行时数据区把字节码加载到内存中,而字节码文件只是JVM的一套指令集规范,并不能直接交给底层系统去执行,而是有执行引擎运行。
- 执行引擎将字节码翻译为底层系统指令,再交由CPU执行去执行,此时需要调用其他语言的本地库接口来实现整个程序的功能。
2、什么是程序计数器?(⭐⭐⭐⭐)
OutOfMemoryError
的内存区域,它的生命周期随着线程的创建而创建,随着线程的结束而死亡。 3、介绍一下Java的堆(⭐⭐⭐⭐)
- 堆是线程共享的区域:主要用来保存对象实例,数组等,当堆中没有内存空间可分配给实例,也无法再扩展时,则抛出OutOfMemoryError异常。
- 组成:年轻代+老年代:
- 年轻代被划分为三部分,Eden区和两个大小严格相同的Survivor区。
- 老年代主要保存生命周期长的对象,一般是一些老的对象。
- Jdk1.7和1.8的区别:
- 1.7中有有一个永久代(方法区),存储的是类信息、静态变量、常量、编译后的代码。
- 1.8移除了永久代,把数据存储到了本地内存的元空间中,防止内存溢出。
4、虚拟机栈(⭐⭐⭐⭐)
4.1 什么是虚拟机栈?
- 每个线程运行时所需要的内存,称为虚拟机栈。
- 每个栈由多个栈帧(frame)组成,对应着每次方法调用时所占用的内存。
- 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法。
4.2 垃圾回收是否涉及栈内存?
4.3 栈帧内存分配越大越好吗?
4.4 方法内的局部变量是否线程安全?
- 如果方法内局部变量没有逃离方法的作用范围,它是线程安全的。
- 如果局部变量逃离了方法的作用范围(如出现在形参或返回值),需要考虑线程安全。
4.5 什么情况下会导致栈内存溢出?
- 栈帧过多导致栈内存溢出,如:递归调用
- 栈帧过大导致栈内存溢出。
4.6 堆栈的区别是什么?
- 栈内存一般会用来存储局部变量和方法调用,但堆内存是用来存储Java对象和数组的。堆有GC垃圾回收,而栈没有。
- 栈内存是线程私有的,而堆内存是线程共享的。
- 两者异常错误不同,栈内存或者堆内存不足都会抛出异常:
- 栈空间不足:java.lang.StackOverFlowError。
- 堆空间不足:java.lang.OutOfMemoryError。
5、介绍一下方法区(⭐⭐⭐)
5.1 方法区概述
- 方法区(Method Area)是各个线程共享的内存区域。
- 主要存储类的信息、运行时常量池。
- 虚拟机启动的时候创建,关闭虚拟机时释放。
- 如果方法区域中的内存无法满足分配请求,则会抛出OutOfMemoryError: Metaspace。
永久代是 JDK 1.8 之前的方法区实现,JDK 1.8 及以后方法区的实现变成了元空间。永久代在堆中,而元空间在本地内存,发生OOM的概率比永久代小。
5.2 运行时常量池
- 常量池:可以看作是一张表,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等信息
- 当类被加载,它的常量池信息就会放入运行时常量池,并把里面的符号地址变为真实地址。
6、直接内存(⭐⭐⭐)


类加载器:
7、什么是类加载器,类加载器有哪些?(⭐⭐⭐)
- 启动类加载器(BootStrap ClassLoader):
- 该类并不继承 ClassLoader 类,其是由 C++ 编写实现。用于加载 JAVA_HOME/jre/lib 目录下的类库。
-
- 扩展类加载器(ExtClassLoader):
- 该类是ClassLoader的子类,主要加载JAVA_HOME/jre/lib/ext目录中的类库。
-
- 应用类加载器(AppClassLoader):
- 该类是ClassLoader的子类,主要用于加载classPath下的类,也就是加载开发者自己编写的Java类。
-
- 自定义类加载器:
- 开发者自定义类继承ClassLoader,实现自定义类加载规则。
-
8、双亲委派模型(⭐⭐⭐⭐)
类加载器的体系并不是“继承”体系,而是委派体系,类加载器首先会到自己的parent中查找类或者资源,如果找不到才会到自己本地查找。类加载器的委托行为动机是为了避免相同的类被加载多次。
为什么采用双亲委派机制?
- 唯一性:通过双亲委派机制可以避免某一个类被重复加载,保证唯一性。
- 安全性: 保证类库 API 不会被修改。
9、类装载的执行过程(⭐⭐⭐)
- 加载:查找和导入class文件。
- 验证:验证类是否符合JVM规范,安全性检查。
- 准备:为类变量分配内存并设置类变量初始值。
- 解析:把类中的符号引用转换为直接引用。
- 初始化:对类的静态变量,静态代码块执行初始化操作。
- 使用:JVM 开始从入口方法开始执行用户的程序代码。
- 卸载:当用户程序代码执行完毕后,JVM便开始销毁创建的Class对象。
垃圾回收:
10、对象什么时候可以被垃圾器回收 ?(⭐⭐⭐⭐)
如果没有任何的引用指向该对象了,那么这个对象现在就是垃圾,如果定位了垃圾,则有可能会被垃圾回收器回收。
定位垃圾的方式:
- 引用计数法:给对象中添加一个引用计数器,每被引用一次计数器就+1,反之-1。引用数为0时代表该对象可被回收。(缺点:循环引用时会出现内存泄漏)
- 可达性分析算法:通过一系列的称为 “GC Roots”(肯定不能当做垃圾回收的对象) 的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连的话,则证明此对象是不可用的,需要被回收。
- 可以作为GC Root的对象:
- 虚拟机栈(栈帧中的局部变量表)中引用的对象
- 本地方法栈(Native 方法)中引用的对象
- 方法区中类静态属性引用的对象
- 方法区中常量引用的对象
- 所有被同步锁持有的对象
- JNI(Java Native Interface)引用的对象
- 可以作为GC Root的对象:
11、JVM 垃圾回收算法(⭐⭐⭐⭐)
- 标记清除算法:先根据可达性分析算法得出的垃圾进行标记,再直接对这些标记为可回收的内容进行垃圾回收。
- 缺点:通过标记清除算法清理出来的内存,碎片化较为严重。
- 标记整理算法:标记阶段和上述类似,在清理阶段,并不是简单的直接清理可回收对象,而是将存活对象都向内存另一端移动,然后清理边界以外的垃圾,从而解决了碎片化的问题。
- 缺点:对象需要移动,效率较低。
- 复制算法:将原有的内存空间一分为二,每次只用其中的一块,正在使用的对象复制到另一个内存空间中,然后将该内存空间清空,交换两个内存的角色,完成垃圾的回收。无碎片、效率较高。
- 缺点:内存使用率低。
12、分代收集算法(⭐⭐⭐⭐)
根据对象存活周期的不同将内存分为几块。一般将 Java 堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。
在新生代中,每次收集都会有大量对象死去,所以可以选择”标记-复制“算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集。而老年代的对象存活几率是比较高的,而且没有额外的空间对它进行分配担保,所以我们必须选择“标记-清除”或“标记-整理”算法进行垃圾收集。
对象回收分代回收的过程:
- 新创建的对象首先会分配到伊甸园。
- 当伊甸园内存不足,标记伊甸园和幸存区from中的存活对象。
- 使用复制算法将存活对象复制到to中,然后释放from和eden的内存。
- 一段时间后eden内存又不足,标记eden和to中存活的对象,复制到from中。
- 当幸存区对象熬过几次回收(15次),晋身至老年代中。(幸存区内存不足或大对象会提前晋身)
MinorGC、 Mixed GC 、 FullGC的区别是什么?
- MinorGC是 发生在新生代的垃圾回收,暂停时间短( STW )。
- FullGC : 新生代 + 老年代完整垃圾回收,暂停时间长( STW ),应尽力避免。
- Mixed GC 新生代 + 老年代部分区域的垃圾回收, G1 收集器特有 。
STW ( Stop-The-World ):暂停所有应用程序线程,等待垃圾回收的完成 。
13、JVM 垃圾回收器(⭐⭐⭐⭐)
- 串行垃圾收集器:垃圾回收时,只有一个线程在工作,并且java应用中的所有线程都要暂停 ( STW ),等待垃圾回收的完成,适用于单机模式的虚拟机。
- Serial:作用于新生代,采用复制算法。
- Serial Old: 作用于老年代,采用标记 - 整理算法。
- 并行垃圾收集器:( JDK8 默认使用此垃圾回收器)
- ParNew收集器:是Serial收集器的多线程并行版本,除了同时使用多条线程进行垃圾收集之外,其余的行为与Serial收集器完全一致。(除serial之外唯一能和CMS配合的)
- Parallel Scavenge收集器:新生代收集器,基于标记-复制算法实现,和ParNew非常相似,区别在于该收集器更加关注吞吐量(高效利用CPU)。
- Parallel Old收集器:是Parallel Scavenge收集器的老年代版本,支持多线程并发收集,基于标记-整理算法实现。
- CMS收集器:以获取最短回收停顿时间为目标的收集器,给用户带来良好的交互体验。
- 基于标记-清除算法实现,整个过程分四个步骤:初始标记和重新标记耗时较短,需要STW暂停其他线程;而整个过程中耗时最长的并发标记和并发清除阶段中,垃圾收集器线程可以与用户线程并行工作。
- 初始标记:标记GCRoots能直接关联到的对象,速度很快。
- 并发标记:标记GC Roots的间接关联对象,这个过程耗时较长但不需要停顿用户线程,可以与垃圾收集线程一起并发运行。
- 重新标记:修正并发标记期间,因用户程序继续运作而导致标记产生变动。
- 并发清除:清理删除掉标记阶段判断的已经死亡的对象,由于不需要移动存活对象,所以这个阶段也是可以与用户线程同时并发的。
- G1收集器:
- 应用于新生代和老年代,JDK9之后默认使用的收集器。
- 将java堆划分成多个区域,每个区域都可以充当 eden,survivor,old, humongous,其中 humongous 专为大对象准备。
- 采用标记复制算法,兼顾响应时间和吞吐量。
- 分为四个阶段:
- 初始标记:标记一下GC Roots能直接关联到的对象,这个阶段需要停顿线程,但耗时很短。
- 并发标记:从GC Root开始对堆中对象进行可达性分析,递归扫描整个堆里的对象图,找出要回收的对象,这阶段耗时较长,但可与用户程序并发执行。
- 最终标记:需要对用户线程做一个短暂的暂停,解决上一阶段的漏标问题。
- 筛选回收:对各个Region的回收价值和成本进行排序,根据用户所期望的停顿时间来制定回收计划,可以自由选择任意多个Region构成回收集,然后把这些Region中的存活对象复制到空的Region中,再清理掉整个旧Region的全部空间。这里的操作涉及存活对象的移动,是必须暂停用户线程,由多条收集器线程并行完成的。
停顿时间越短就越适合需要与用户交互或需要保证服务响应质量的程序,良好的响应速度能提升用户体验;而高吞吐量则可以最高效率地利用处理器资源,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的分析任务。
14、强引用、软引用、弱引用、虚引用的区别?
- 强引用:最传统的“引用”的定义,只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象。
- 软引用:如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。
- 弱引用:强度比软引用更弱,当垃圾回收器开始工作时,无论内存空间是否充足都会对弱引用的对象进行回收。
- 虚引用:虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。主要用来跟踪对象被垃圾回收器回收的活动。
jvm实践
15、JVM 调优的参数可以在哪里设置参数值?(⭐⭐)
- war包部署在tomcat中设置 修改TOMCAT_HOME/bin/catalina.sh文件
- jar包部署在启动参数设置 java -Xms512m -Xmx1024m -jar xxxx.jar
16、JVM 调优的参数都有哪些?(⭐⭐⭐)
- 设置堆空间大小:设置堆的初始大小和最大大小,为了防止垃圾收集器在初始大小、最大大小之间收缩堆而产生额外的时间,通常把最大、初始大小设置为相同的值。
- -Xms:设置堆的初始化大小
- -Xmx:设置堆的最大大小
- 虚拟机栈的大小:每个线程默认会开启1M的内存,用于存放栈帧、调用参数、局部变量等,但一般256K就够用。
- -Xss 对每个线程stack大小的调整,-Xss128k
- 年轻代中Eden区和两个Survivor区的大小比例:
- -XXSurvivorRatio=8,表示年轻代中的分配比率:survivor:eden = 2:8
- 年轻代晋升老年代阈值:默认为15。
- -XX:MaxTenuringThreshold=threshold
- 设置垃圾回收收集器:
- -XX:+UseParallelGC
- -XX:+UseG1GC
17、JVM 调优的工具(⭐⭐)
- 命令工具:
- jps:输出JVM中运行的进程状态信息。
- jstack:查看java进程内线程的堆栈信息。
- jmap:用于生成堆转存快照。
- jhat:用于分析jmap生成的堆转存快照。
- jstat:是JVM统计监测工具。可以用来显示垃圾回收信息、类加载信息、新生代统计信 息等。
- 可视化工具:
- jconsole: 对 jvm 的内存,线程,类进行监控,是一个基于 jmx 的 GUI 性能监控工具。
- 打开方式:java 安装目录 bin 目录下 直接启动 jconsole.exe 就行。
-
- VisualVM:故障处理工具,能够监控线程,内存情况,查看方法的CPU时间和内存中的对象,已被GC的对象,反向查看分配的堆栈。
- 打开方式:java 安装目录 bin目录下 直接启动 jvisualvm.exe就行。
-
18、Java内存泄露的排查思路(⭐⭐⭐⭐)
内存泄漏通常是指堆内存,通常是指一些大对象不被回收的情况。
- 1、通过jmap或设置jvm参数获取堆内存快照dump
- 2、通过工具, VisualVM去分析dump文件,VisualVM可以加载离线的dump文件
- 3、通过查看堆信息的情况,可以大概定位内存溢出是哪行代码出了问题
- 4、找到对应的代码,通过阅读上下文的情况,进行修复即可
19、CPU飙高排查方案与思路(⭐⭐⭐⭐)
- 1.使用top命令查看占用cpu的情况,查看是哪一个进程占用cpu较高。
- 2.使用ps命令查看进程中的线程信息。
- 3.使用jstack命令查看进程中线程的信息,并定位到出问题的具体线程,最终定位问题。
相关文章:

Java面试汇总——jvm篇
目录 JVM的组成: 1、JVM 概述(⭐⭐⭐⭐) 1.1 JVM是什么? 1.2 JVM由哪些部分组成,运行流程是什么? 2、什么是程序计数器?(⭐⭐⭐⭐) 3、介绍一下Java的堆(⭐⭐⭐⭐) 4、虚拟机栈(⭐⭐⭐⭐) 4.1 什么是虚拟机栈&…...

数据结构:完全二叉树(递归实现)
如果完全二叉树的深度为h,那么除了第h层外,其他层的节点个数都是满的,第h层的节点都靠左排列。 完全二叉树的编号方法是从上到下,从左到右,根节点为1号节点,设完全二叉树的节点数为sum,某节点编…...

RK3568 移植Ubuntu
使用ubuntu-base构建根文件系统 1、到ubuntu官网获取 ubuntu-base-18.04.5-base-arm64.tar.gz Ubuntu Base 18.04.5 LTS (Bionic Beaver) 2、将获取的文件拷贝到ubuntu虚拟机,新建目录,并解压 mkdir ubuntu_rootfs sudo tar -xpf u...

C++大学教程(第九版)6.34猜数字游戏 6.35 修改的猜数字游戏
文章目录 6.34题目代码运行截图6.35题目代码运行截图 6.34题目 猜数字游戏)编写一个程序,可以玩“猜数字”的游戏。具体描述如下:程序在1~1000之间的整数中随机选择需要被猜的数,然后显示: 代码 #include <iostream> #include <cstdlib>…...

【立创EDA-PCB设计基础】5.布线设计规则设置
前言:本文详解布线前的设计规则设置。经过本专栏中的【立创EDA-PCB设计基础】前几节已经完成了布局,接下来开始进行布线,在布线之前,要设置设计规则。 目录 1.间距设置 1.1 安全间距设置 1.2 其它间距设置 2.物理设置 2.1 导…...
ElementUI简介以及相关操作
ElementUI是一套基于Vue.js的桌面端组件库,提供了丰富的组件帮助开发人员快速构建功能强大、风格统一的页面。以下是ElementUI的简介以及相关操作: 简介:ElementUI是一套为开发者、设计师和产品经理准备的基于Vue 2.0的桌面端组件库ÿ…...

内存耗尽排查思路
内存耗尽排查思路 – WhiteNights Site 标签:日志 内存间断性耗尽问题的排查思路 先简单说下背景。排查了两天给我整麻了。 找了个镜像模板做虚拟机。但是发现只要一开机,内存每隔几秒就会被耗尽。看内存的波形图就和坐过山车一样,一会占…...

OpenCV书签 #差值哈希算法的原理与相似图片搜索实验
1. 介绍 差值哈希算法(Difference Hash Algorithm,简称dHash) 是哈希算法的一种,主要可以用来做以图搜索/相似图片的搜索工作。 2. 原理 差值哈希算法通过计算相邻像素的差异来生成哈希,即通过缩小图像的每个像素与平…...

Unity中URP下获取主灯信息
文章目录 前言一、计算BulinnPhone的函数有两个重载1、 目前最新使用的是该方法(这是我们之后主要分析的函数)2、 被淘汰的老方法,需要传入一堆数据 二、GetMainLight1、Light结构体2、GetMainLight具有4个方法重载3、1号重载干了什么&#x…...

尝试着在Stable Diffusion里边使用SadTalker进行数字人制作
首先需要标明的是,我这里是图片说话类型,而且是看了知识星球AI破局俱乐部大航海数字人手册进行操作的。写下这篇文章是防止我以后遗忘。 我使用的基础软件是Stable Diffusion,SadTalker是作为插件放进来的,需要注意的是这对自己的…...

链路聚合原理与配置
链路聚合原理 随着网络规模不断扩大,用户对骨干链路的带宽和可靠性提出了越来越高的要求。在传统技术中,常用更换高速率的接口板或更换支持高速率接口板的设备的方式来增加带宽,但这种方案需要付出高额的费用,而且不够灵活。采用…...

第8章 通信网络安全
文章目录 8.1 信息系统安全概述8.1.1 信息系统的构成和分类8.1.2 信息系统安全1、信息系统中的安全概念2、信息系统安全问题的发展演变3、信息系统的安全结构 8.1.3 信息系统的安全保护等级1.TCSEC(可信计算机系统评估准则)2. 我国信息安全标准 8.1.4 通…...

L1-092 进化论(Java)
在“一年一度喜剧大赛”上有一部作品《进化论》,讲的是动物园两只猩猩进化的故事。猩猩吕严说自己已经进化了 9 年了,因为“三年又三年”。猩猩土豆指出“三年又三年是六年呐”…… 本题给定两个数字,以及用这两个数字计算的结果,…...
SpringBoot 源码解析5:ConfigurationClassPostProcessor整体流程和@ComponentScan源码分析
SpringBoot 源码解析5:ConfigurationClassPostProcessor整体流程和ComponentScan源码分析 1. 知道以下几点,读ConfigurationClassPostProcessor源码会更轻松2. 源码解析 ConfigurationClassPostProcessor#postProcessBeanDefinitionRegistry2.1 Configur…...

一.初识Linux 1-3操作系统概述Linux初识虚拟机介绍
目录 一.初识Linux 1.操作系统概述 计算机组成 硬件: 软件: 操作系统: 操作系统工作流程 操作系统作用 常见的操作系统 PC端: 移动端:(掌上操作系统) 一.初识Linux 2.Linux初识 linu…...

Eureka整合seata分布式事务
文章目录 一、分布式事务存在的问题二、分布式事务理论三、认识SeataSeata分布式事务解决方案1、XA模式2、AT模式3、SAGA模式4.SAGA模式优缺点:5.四种模式对比 四、微服务整合Seata AT案例Seata配置微服务整合2.1、父工程项目创建引入依赖 2.2、Eureka集群搭建2.3、…...

华为云磁盘性能指标(参考)
MD[华为云磁盘性能指标(参考)] 云硬盘(Elastic Volume Service, EVS) 根据性能,磁盘可分为极速型SSD V2、极速型SSD、通用型SSD V2、超高IO、通用型SSD、高IO、普通IO。 性能指标(参考),测速说明:操作系统-windows …...
利用OpenGL图形库实现人物动画移动效果
使用OpenGL库实现人物动画移动效果需要涉及到更复杂的图形编程和事件处理。以下是一个简单的例子,使用OpenGL和GLUT库实现人物的基本动画移动效果。 确保你已经安装了OpenGL和GLUT。你可以使用包管理器或者从官方网站下载并安装。 一、如果你已经安装过了OpenGL和…...
History命令解释,及一个相关的bash脚本(如何编写脚本程序从记录文件中提取history命令)
目 录 一、history命令介绍 1、history命令是什么? 2、history的主要功能 二、history命令的用法 1、语法 2、选项说明 3、命令实例 三、history和历史记录文件bash_history 四、history命令的相关配置 1,命令带时间展示-HISTTI…...
apisix 单机部署 linux
安装etcd: cd /home/app rz tar -zxvf etcd-v3.5.4-linux-amd64.tar.gz cd etcd-v3.5.4-linux-amd64 vim start.sh内容: #!/bin/sh nohup etcd --name infra0 --initial-advertise-peer-urls http://127.0.0.1:2380 \--listen-peer-urls http://127.0.…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...