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

面试官:我们深入聊聊Java虚拟机吧

哈喽!大家好,我是奇哥,一位专门给面试官添堵的职业面试员
文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】更有我为大家准备的福利哟!

文章目录

  • 前言
  • 面试
  • Java虚拟机内存模型
  • 垃圾收集器与内存分配策略
  • 虚拟机性能监控、故障处理工具
  • 总结

前言

今天闲着没事想着好久没给面试官添堵了,准备给面试官添上一波。

回想当年在老家屯子里就经常给我大爷添堵,现在被撵出来了还是改不了给别人添堵的毛病,我可能就是你们口中所说的最忍受不了的同事。。。

在这里插入图片描述

面试

在一个晴朗的周日,我来到了一个陌生的园区,坐在陌生的会议室,等待HR小姐姐去叫面试官,此时我的心情和各位小伙伴一样五味杂陈,担心面试官问的会不会很难?问到我的知识盲区我该怎么办?

此时一位英俊潇洒,眼神犀利的面试官走了进来,看到他那犀利、仿佛能看穿一切的眼神 ,我在想要不然一会就不要30k了,要8k得了,这个面试官一看就不好糊弄啊,但是我想起来我来之前刚看了小奇的大厂面试题系列,我已经完全学会了小奇的精髓,我顿时就来了底气,决定一会先要个80k尝尝咸淡

面试官:小奇是吧,带简历了吗?

我:没带,现在彩印两块一张,我简历五张,每次面试都要花费十块,我朋友说了还没工作就先让你掏钱的工作不要去。

面试官:。。。那你靠什么来征服我,让我录用你

我:气质?

请添加图片描述
(此时面试官并没有叫保安,而是从门后拿出了恭候我多时的棍子,我瞬间怂了)

请添加图片描述
(我只好从我的双肩包中拿出了我从上午没有面试通过的其他公司面试官手中要回的简历,上午的情形是这样的,上午的面试官:今天的面试就到这吧,回去等通知吧!我:面试官你好,如果贵公司不打算录取我的话,能不能把我的纸质简历还给我,我下午还有一家面试。上午的面试官:我说你的简历怎么皱皱巴巴,原来你一直在循环利用啊!这个症状出现多久了?我:半拉月了。。。)

(当我把皱皱巴巴的简历交给面试官后,这场面试才得以继续进行。。。)

Java虚拟机内存模型

面试官:我看你简历上写的精通Java虚拟机?(哼,面试官轻蔑的一笑)

(此时我的内心非常紧张,紧张的并不是面试官把我问住,而是我如果虚拟机这方面回答的太专业了面试官听不懂怎么办,他如果不信我回答的怎么办,此时我偷偷看了一下我藏在桌下的《深入理解Java虚拟机》,如果他不信我就拿出书来和他对峙)

请添加图片描述

我:也不算精通吧,都是同行们抬爱。

面试官:那你说一下JVM虚拟机的内存模型吧

我:JVM虚拟机中有一个运行时数据区,里面主要分为程序计数器、虚拟机栈、本地方法栈、堆、方法区

在这里插入图片描述

面试官:嗯。假如我们new一个对象这个时候是放在哪里?

我:堆里

面试官:嗯。假如我们int定义一个变量number放在哪里?

我:栈里

面试官:嗯。小伙子真是惜字如金啊,能不能详细介绍一下这几个区域都是干什么的吗

我:那我就献丑了。。。

1.程序计数器:简单来说每一个线程在执行代码的时候执行到哪一行是有一个记录的,比如线程A执行到代码第10行了这个时候在线程A中是有一个程序计数器来记录10这一行。程序计数器在线程中是私有的。那么他有什么好处呢?虽然我们开发的时候可以使用多线程来开发,但是CPU在执行A线程的时候B线程就需要等待,等到CPU去执行A线程的时候B线程又需要等待了,所以说如果这个时候CPU去执行B线程,那么执行完后再回来执行A线程的时候就知道之前执行到哪一行了,可以从这一行接着执行。

2.虚拟机栈:与程序计数器一样,虚拟机栈也是线程私有的,虚拟机是栈是存放执行方法的时候用到的一些信息,例如在执行方法的时候虚拟机就会创建一个栈帧用于存储局部变量表(表里是局部变量)、操作数栈(如果要进行一些数的计算,那么会把数先读取到操作数栈中进行操作最后赋值到局部变量表中)、动态链接、方法出口等信息。

3.堆:堆是线程共享的,堆是虚拟机所管理的内存中最大的一块,一般优化就是优化这块内存,比如我们Student st = new Student();那么我们新创建出来的对象就在堆内存里。

4.本地方法栈:本地方法栈是用来执行本地方法的时候所使用的,例如Java中我们会看到很多Native方法,这些方法使用例如c语言写的,Java中只是调用。

在这里插入图片描述

5.方法区:方法区是线程共享的,它用于存储已被虚拟机加载的类型信息、常量、静态变量等。在方法区中还包含一个运行时常量池部分,这一部分用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中,所谓符号引用其实就是将一个例如main方法这个方法引用转化为指针应用,可以更加快速的找到这个方法在磁盘中的真正位置

面试官:嗯。可以,回答的很全面,平时都怎么学习提高呢?

我:看小奇的文章(此时真想给小奇的文章一个赞)

面试官:说一下对象创建的流程吧

我:(还想歇会喝口水呢,这么快就问下一个知识点了,我偷偷翻书看一下。。。)

当虚拟机接收到new Student()的命令后,他会先去常量池中查看这个Student()类是否有相应的符号引用,并且这个类是否被加载、解析、初始化过,如果没有的话需要先进行类的加载、解析、初始化。

面试官:嗯。那我创建对象的时候怎么给它分配内存呢,有哪些方法?

我:可以使用指针碰撞、空闲列表等方式。

指针碰撞:假如堆空间现在没有数据,并且堆空间是一个方形的空间,那么我们用一个指针放在起始位置,也就是紧挨着边,这个时候有一个占用1M的对象要创建了,那么我们的指针就从初始位置开始从左向右走1M的距离,这个时候又有一个10M的对象要创建了,我们的指针从当前位置又向右走了10M的距离,这个时候有一个1G的对象来了(指针:我淦。。。),指针向右走到头了也没有1G的距离,这个时候就创建不了这个1G的对象了。
空闲列表:指针碰撞的方式适用于堆空间连续的这种方式,如果不连续的话就不能从左到右来分配空间了,这个时候就需要用到空闲列表了,使用一个空闲列表来记录哪些空间是空闲的,新创建一个对象就放到那里去。

面试官:嗯。那我们刚刚创建了一个对象, 你能说一下对象里又是怎样的一个内存布局吗?

我:(真是往祖坟里挖啊。。。偷偷看看书,淦)

对象里可以划分为三个部分:对象头、实例数据、对齐填充。

面试官:额。。。可以详细展开了说一下吗,你这样别人也能答出来

我:(就看了一眼书,记不住那么多啊,算了硬着头皮来吧)

对象头:对象头中存储了对象自身运行时的数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳以及指向它的类型元数据的指针(通过这个指针来确定对象是哪个类的实例)。

实例数据:这一部分是我们真正在对象中定义的信息,比如对象中的一些字段等内容,还有继承父类的一些内容和在子类中定义的字段都在此记录。

对齐填充:这一部分并不是每个对象都存在的,因为虚拟机要求对象的起始地址必须是8字节的整数倍,假如我们实例数据只有4字节,那么我们需要另外填充4字节的数据来保证对象的起始位置是8字节的整数倍。.

垃圾收集器与内存分配策略

面试官:嗯。说一下虚拟机怎么判断一个对象是否是垃圾对象

我:(这么快又换下一个知识点了,啥时候能喝口水呢。。。)

可以采用可达性分析算法和引用计数算法来判断对象是否是垃圾对象。

面试官:嗯。继续说下去

我:

可达性分析算法:会从一个“GC Root”根开始依据引用关系向下搜索,如果不能搜索到的证明是垃圾对象。

在这里插入图片描述

引用计数算法:当一个对象被引用的时候就会在这个对象中的引用计数器中加1,如果引用失效时,计数器的值就会减1,当这个对象的引用计数器为0的时候就证明这个对象是垃圾对象,不过这种算法有一个缺点,就是两个对象之间相互引用的时候就会认为两个对象都不是垃圾对象,但是这两个对象是因为循环依赖造成的问题,理应被清理掉,但是这种算法解决不了这种循环引用的问题。

面试官:嗯。有哪些垃圾收集算法呢?

我:(二分法、三分法、四。。。不对,怎么感觉背串了,还是不编了,偷偷看一下书吧)

标记-清除算法、标记-复制算法、标记-整理算法

面试官:嗯。可以再详细的说一下算法的具体内容吗?

我:

标记-清除算法:此算法主要用于一块内存区的垃圾收集器,在标记后直接做清除操作,不会再做后续的操作。

在这里插入图片描述

标记-复制算法:此算法主要用于两块内存区的垃圾收集器,将存活对象标记,然后将存活对象放入保留区域中,然后将之前的一块区域全部清理掉作为下一次的保留区域。

在这里插入图片描述

标记-整理算法:此算法主要用于一块内存区的垃圾收集器,他与标记清除算法的区别在于他清除后会将内存区域中存活的对象重新整理到一起,使得剩下的空间可以连续起来。

在这里插入图片描述

面试官:嗯。可以说一下都有哪些垃圾收集器吗?

我:(三V肉、爬牛、爬V肉死砍胃汁、三V肉偶得、爬V肉偶得、CMS、G1、ZGC,我想了想还是画出来吧,毕竟我的英语水平读出来面试官可能会怀疑人生)

1、Serial收集器(三V肉)

file

Serial收集器是最基础、历史最悠久的收集器,这个收集器是一个单线程工作的收集器。

2、ParNew收集器(爬牛)

file

ParNew收集器实质上是Serial收集器的多线程并行版本,可以同时使用多条线程进行垃圾收集。

3、Parallel Scavenge 收集器(爬V肉死砍胃汁)

Parallel Scavenge收集器是一款新生代收集器,它是基于标记-复制算法实现的收集器。Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量,所谓吞吐量就是处理器用于运行用户代码的时间与处理器总消耗时间的比值,即。

file

4、Serial Old收集器(三V肉偶得)

file

Serial Old是Serial收集器的老年代版本,它同样是一个单线程收集器。

5、Parallel Old收集器(爬V肉偶得)

Parallel Old收集器是Parallel Scavenge收集器的老年代版本,支持多线程并行收集,基于标记-整理算法实现。

file

6、CMS收集器

file

CMS收集器是一种以获取最短回收停顿时间为目标的收集器,它的运作过程分为四个步骤,包括:

1> 初始标记

2> 并发标记

3> 重新标记

4> 并发清除

初始标记:初始标记需要stw,初始标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快。

并发标记:并发标记阶段就是从GC Roots的直接关联对象开始遍历整个对象图的过程,这个过程耗时较长但是不需要停顿用户线程,可以与垃圾收集线程一起并发运行。

重新标记:重新标记阶段则是为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间通常会比初始标记阶段稍长一些,但也远比并发标记阶段的时间短。

并发清除:这个阶段清理删除掉标记阶段判断的已经死亡的对象,由于不需要移动存活对象,所以这个阶段也是可以与用户线程同时并发的。

6、Garbage First 收集器(简称G1收集器)

G1不再坚持固定大小以及固定数量的分代区域划分,而是把连续的Java堆划分为多个大小相等的独立区域(Region),每一个Region都可以根据需要,扮演新生代的Eden空间、Survivor空间,或者老年代空间。如图。

file

G1收集器的运作过程大致可以划分为以下四个步骤:

初始标记:仅仅只是标记一下GC Roots能直接关联到的对象,

并发标记:从GC Root开始对堆中对象进行可达性分析,递归扫描整个堆里的对象图,找出要回收的对象,这阶段耗时较长,但可与用户程序并发执行。

最终标记:对用户线程做另一个短暂的暂停,用于处理并发阶段结束后仍遗留下来的最后那少量的SATB记录。

筛选回收:负责更新Region的统计数据,对各个Region的回收价值和成本进行排序,根据用户所期望的停顿时间来制定回收计划,可以自由选择任意多个Region构成回收集,然后把决定回收的那一部分Region的存活对象复制到空的Region中,再清理掉整个旧Region的全部空间。这里的操作设计存活对象的移动,是必须暂停用户线程,由多条收集器线程并行完成的。

file

面试官:嗯。可以说一下JVM堆内存模型吗?

我:

堆内存模型分为年轻代和老年代,其中年轻代中又分为Eden区和Survivor区,Survivor区又分为S0和S1区。

在这里插入图片描述

面试官:嗯。可以说一下对象在堆中的流转与回收策略吗?

我:(这可有点多了。。。说了不知道你能不能听得懂啊,算了,不行就拿出我藏在桌下的书给你讲吧)

对象优先在Eden分配:new一个对象首先会放到Eden区中,当Eden区域放满了后,会将Eden区域中存活的对象放入到Survivor区中的S0区域,然后将Eden区域清空,这个时候新new的对象还是放入Eden区域中,当Eden区域中再次满了的话就将Eden区域中的存活对象和S0中的存活对象都拿出来放入到S1区域中,并将Eden区域和S0区域中都清理掉,当Eden区域再次满了就向Eden区域中的存活对象和S1中的存活对象一起放入到S0中,也就是循环将Eden区域中的存活对象和Survivor中的其中一块区域中的存活对象一块拿出来放入到Survivor中的另外一块区域中,如此循环,每循环一次对象的GC年龄加1,当GC年龄到达15的时候就会移入到老年代。
放入老年代的时候的GC我们可以称他为轻GC,这个GC的时间比较短,当老年代满了的时候会进行重GC,这个GC的时间比较长。

长期存活的对象进入老年代:就是对象在年轻代来回循环,到达15次(默认,这个数值可以设置),就会将对象放入老年代。

大对象直接进入老年代:当新创建的对象比较大的时候我们可以直接将他放入老年代,这样可以避免在年轻代来回复制造成的额外开销,具体多大的对象是大对象我们可以根据 -XX:PretenureSizeThreshold参数来设置。

动态对象年龄判定:如果在Survivor空间中低于或等于某年龄的所有对象大小的总和大于Survivor空间的一半,那么年龄大于或等于该年龄的对象就可以直接进入老年代,无需等到年龄达到15,假如现在最大的对象年龄为10,但是Survivor空间以及使用一半了,如果再往下走可能还没有对象达到15就造成Survivor区域满了,所以就提前将大年龄的对象放入老年代了。

空间分配担保:在发生轻GC之前,虚拟机就会先检查老年代可用的空间是否大于新生代所有对象的总空间,如果大于,即便新生代所有的对象都不是垃圾对象,那么老年代也放的下,如果不大于呢?虚拟机会先查看是否设置了允许担保失败的参数,如果允许,虚拟机会判断老年代的剩余空间是否大于历次从新生代到老年代里的对象的平均大小。
如果大于就会进行轻GC将新生代的存活对象放入老年代,这一次是冒险的,因为有可能这一次轻GC比之前轻GC的平均值存活的要多,这样会造成老年代内存直接溢出。
如果小于就会先进行一次重GC将老年代的空间腾出来,保证可以将年轻代的存活对象放进去。
如果配置的参数是不允许担保失败,那么我们每一次到达老年代剩余的空间不够新生代所有对象的总空间的时候我们就会进行一次重GC将老年代的空间先腾出来。

面试官:可以啊,小伙子有点东西

我:还行吧(有点东西你不给我倒点水喝。。。)

虚拟机性能监控、故障处理工具

面试官:刚才都是一些概念性的东西,现在问你点实操的,说一下有哪些虚拟机性能监控方法呢?

我:(刚想歇一会。。。早知道简历上写精通Java虚拟机会被这么问我就只写了解Java虚拟机了,哎。。。)

在这里插入图片描述

jps:虚拟机进程状态工具
命令格式:jps 【options】【hostid】
jps -l命令可以查看主类全名,如果进程执行的是jar包,则输出jar路径
在这里插入图片描述
jps -v命令可以查看虚拟机进程启动时的JVM参数

jstat:虚拟机统计信息监视工具
命令格式:jstat 【options】【hostid】【ms】【count】
参数ms和count代表查询间隔和次数,如果省略了这个2个参数,说明只查询一次,假设现在我们要查询66320的垃圾收集情况,250毫秒查询一次,一共查询20次
jstat -gc 66320 250 20
在这里插入图片描述

jinfo:Java配置信息工具
jinfo的作用是实时查看和调整虚拟机各项参数。

jmap:Java内存映像工具
jmap命令用于生成堆转储快照。

jhat:虚拟机堆转储快照分析工具
jhat命令与jmap搭配使用,来分析jmap生成的堆转储快照。

jstack:Java堆栈跟踪工具
jstack命令用于生成虚拟机当前时刻的线程快照。

面试官:你这些都是命令,有哪些可视化的虚拟机故障处理工具吗?

我:可以使用jdk自带的VisualVM可视化工具
命令:jvisualvm
在这里插入图片描述
在这里插入图片描述

面试官:小伙子真厉害啊,我这边没有什么要问的了,你还有什么问题要问(面试官两眼放光)

我:额。。。面试官这个我的纸质简历可以给我吗,可以不往我的简历上写写画画吗,我明天的面试还要用。

面试官:还面啥别的公司啊,就来我这吧,条件随便开

我:那就100k吧(此时面试官又拿起了他准备好的棍子)

总结

Java虚拟机是即基础又有点深奥的东西,所以大家要收藏后认真反复的去学习,如果觉得我的文章还不错的话就点个赞吧,另外可以微信搜索【小奇JAVA面试】的好文章,获取我为大家准备的资料。

相关文章:

面试官:我们深入聊聊Java虚拟机吧

哈喽!大家好,我是奇哥,一位专门给面试官添堵的职业面试员 文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】更有我为大家准备的福利哟! 文章目录 前言面试Java虚拟机内存模型垃圾收集器…...

【电源专题】案例:异常样机为什么只在40%以下电量时与其他样机显示电量差异10%,40%以上电量差异却都在5%以内。

本案例发生在一个量产产品的测试中,因为产品带电池,所以需要测试产品对于电池电量显示的精确程度。产品使用的是最简单的开路电压查表法进行设计。 案例测试报告的问题在于不同样机之间电量百分比存在差异,大部分是在3%~4%之间。但在7.2V电压时,能够差异10%左右。 在文章:…...

React 全栈体系(七)

第四章 React ajax 一、理解 1. 前置说明 React本身只关注于界面, 并不包含发送ajax请求的代码前端应用需要通过ajax请求与后台进行交互(json数据)react应用中需要集成第三方ajax库(或自己封装) 2. 常用的ajax请求库 jQuery: 比较重, 如果需要另外引入不建议使用axios: 轻…...

NVIDIA 显卡硬件支持的精度模式

很多炼丹师不知道自己英伟达显卡支持哪些精度模式,本文整理了NVIDIA官网的数据,为你解开疑惑。 1. 首先了解CUDA计算能力及其支持的精度模式; 2. 查看自己显卡(或其它NVIDIA硬件)的计算能力值为多少。 表1 CUDA计算…...

【Java|golang】210. 课程表 II---拓扑排序

一、拓扑排序的定义&#xff1a; 先引用一段百度百科上对于拓扑排序的定义&#xff1a; 对一个有向无环图 ( Directed Acyclic Graph 简称 DAG ) G 进行拓扑排序&#xff0c;是将 G 中所有顶点排成一个线性序列&#xff0c;使得图中任意一对顶点 u 和 v &#xff0c;若边 <…...

STM32CubeMX systick bug?

发觉用新版&#xff08;V6.9.1&#xff09;的它生成代码&#xff0c;会有问题。可能是 BUG。具体如下&#xff1a; 一个简单的点灯程序&#xff0c;用 Keil MDK 5.38a&#xff08;compiler version 6&#xff09;编译。 如果在变量前&#xff0c;不加上关键字“volatile”&am…...

徐亦达机器学习:Kalman Filter 卡尔曼滤波笔记 (一)

P ( x t P(x_t P(xt​| x t − 1 ) x_{t-1}) xt−1​) P ( y t P(y_t P(yt​| x t ) x_t) xt​) P ( x 1 ) P(x_1) P(x1​)Discrete State DM A X t − 1 , X t A_{X_{t-1},X_t} AXt−1​,Xt​​Any π \pi πLinear Gassian Kalman DM N ( A X t − 1 B , Q ) N(AX_{t-1}B,Q)…...

Java和vue的包含数组组件contains、includes

List<String> tempList Arrays.asList("10018","1007","10017","1012"); if(tempList.contains(initMap.get("asset_type_id").toString())){// todo 计算运营终点桩号-起点桩号BigDecimal diffSum collectNum(col…...

OpenCV_CUDA_VS编译安装

一、OpenCV 我这里是下载的OpenCV4.5.4&#xff0c;但是不知道到在vs里面build时一直报错&#xff0c;后面换了4.7.0的版本测试&#xff0c;安装成功。 Release OpenCV 4.5.4 opencv/opencv GitHub 这个里面有官方预编译好的OpenCV库&#xff0c;可以直接食用。 扩展包&am…...

基于减法优化SABO优化ELM(SABO-ELM)负荷预测(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

记录第一个启动代码的诞生

核使用R52&#xff0c;参考汇编模板&#xff0c;一步一步来实现。 首先是ld文件&#xff0c;这个没啥好说的&#xff0c;主要是关注给vector_table划一块地址、stack地址&#xff0c;如下&#xff1a; .text.intvec :{_vectors_start .;KEEP(*(.text.intvec))_vectors_end .;…...

基于STM32的简化版智能手表

一、前言 本文的OLED多级菜单UI为一个综合性的STM32小项目&#xff0c;使用多传感器与OLED显示屏实现智能终端的效果。项目中的多级菜单UI使用了较为常见的结构体索引法去实现功能与功能之间的来回切换&#xff0c;搭配DHT11&#xff0c;RTC&#xff0c;LED&#xff0c;KEY等器…...

揭秘弹幕游戏制作

最近好多人问弹幕游戏&#xff0c;甚至是招人的也要DOTS做弹幕游戏... 实际上目前的弹幕游戏绝大多数应该和DOTS没有半点关系&#xff0c;别忘了DOTS这项技术渲染问题还没能够被合理解决呢 所以目前用的全都是GPU Instance这项技术&#xff0c;于是乎我决定下场写这篇帖子&am…...

2327. 知道秘密的人数;1722. 执行交换操作后的最小汉明距离;2537. 统计好子数组的数目

2327. 知道秘密的人数 核心思想&#xff1a;动态规划&#xff0c;每天的人可以分为三种&#xff0c;可分享秘密的人&#xff0c;不可分享秘密的人&#xff0c;忘记秘密的人。定义f[i]为第i天可分享秘密的人&#xff0c;那么第(idelay ,iforget)天&#xff0c;会增加f[i]个可分…...

【TCPDF】使用TCPDF导出PDF文件

目录 一、安装TCPDF类库 二、安装字体 三、使用TCPDF导出PDF文件 目的&#xff1a;PHP通过TCPDF类库导出文件为PDF。 开发语言及类库&#xff1a;ThinkPHP、TCPDF 效果图如下 一、安装TCPDF类库 在项目根目录使用composer安装TCPDF&#xff0c;安装完成后会在vendor目录下…...

MacBook苹果电脑重装、降级系统

1、下载balenaEtcher镜像启动盘制作工具 https://tails.net/etcher/balenaEtcher-portable.exe 2、选择从文件烧录选择下载好的Mac 镜像文件 百度网盘 请输入提取码&#xff08;Mac OS 10.10-12版本镜像文件&#xff09; 第二步选择目标磁盘&#xff0c;这里需要准备一块1…...

Java 解决long类型数据在前后端传递失真问题

问题&#xff1a;雪花算法的id长度为19位&#xff0c;前端能够接收的数字最多只能是16位的&#xff0c;因此就会造成精度丢失&#xff0c;得到的ID不是真正的ID。 解决&#xff1a; 在拦截器中加入Long类型转换&#xff0c;返回给前端string package io.global.iot.common.c…...

IDEA的快捷键大全

快捷键 说明 IntelliJ IDEA 的便捷操作性&#xff0c;快捷键的功劳占了一大半&#xff0c;对于各个快捷键组合请认真对待。IntelliJ IDEA 本身的设计思维是提倡键盘优先于鼠标的&#xff0c;所以各种快捷键组合层出不穷&#xff0c;对于快捷键设置也有各种支持&#xff0c;对…...

简单记一下Vue router 路由中使用 vue-i18n 进行标题国际化

引入状态管理和国际化文件 import store from ../store import i18n from /configs/i18n使用状态管理设置路由当前国际化选项 // 使用状态管理 i18n.locale store.state.setStore.i18n??zh路由中使用i18n { path: /login, name: login, component: LoginPage, meta: { ti…...

【Gitea】 Post “http://localhost:3000/api/internal/hook/pre-receive/aa/bbb“ 异常

引 使用 JGit 做了一个发布代码到 Gitea 的接口&#xff0c;使用该接口发布代码到 http://xxx-local/{name}/{project} &#xff0c;报了 Post "http://localhost:3000/api/internal/hook/pre-receive/{name}/{project} 相关的异常。具体内容如下&#xff1a; Gitea: In…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...