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、什么是程序计数器?(⭐⭐⭐⭐)

        程序计数器是线程私有的,用于记录正在执行的字节码指令的地址
        java虚拟机对于多线程任务是通过线程轮流切换并分配线程执行时间来完成的。如果当前被执行的这个线程所分配的执行时间用完了【挂起】,处理器会切换到另外的一个线程上执行。当这个线程的执行时间用完了,接着处理器就会又来执行被挂起的这个线程。 为了使线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立存储。
        程序计数器是唯一一个不会出现 OutOfMemoryError 的内存区域,它的生命周期随着线程的创建而创建,随着线程的结束而死亡。

3、介绍一下Java的堆(⭐⭐⭐⭐)

  • 堆是线程共享的区域:主要用来保存对象实例数组等,当堆中没有内存空间可分配给实例,也无法再扩展时,则抛出OutOfMemoryError异常。
  • 组成:年轻代+老年代:
    • 年轻代被划分为三部分,Eden区和两个大小严格相同的Survivor区。
    • 老年代主要保存生命周期长的对象,一般是一些老的对象。
  • Jdk1.7和1.8的区别:
    • 1.7中有有一个永久代(方法区),存储的是类信息、静态变量、常量、编译后的代码。
    • 1.8移除了永久代,把数据存储到了本地内存的元空间中,防止内存溢出

4、虚拟机栈(⭐⭐⭐⭐)

4.1 什么是虚拟机栈?

  • 每个线程运行时所需要的内存,称为虚拟机栈。
  • 每个栈由多个栈帧(frame)组成,对应着每次方法调用时所占用的内存。
  • 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法。

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

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

4.3 栈帧内存分配越大越好吗?

        未必,默认的栈内存通常为1024k 。栈内存不变下,栈帧过大会导致线程数变少。

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、直接内存(⭐⭐⭐)

        直接内存不受 JVM 内存回收管理,属于操作系统的内存,常见于 NIO 操作时,用于数据缓冲区,NIO读写性能比IO高。两者区别见下图:
        传统阻塞IO 的数据传输要走两次缓存区,而NIO只需走一次。

类加载器:

7、什么是类加载器,类加载器有哪些?(⭐⭐⭐)

        类加载器(ClassLoader )的主要作用就是将类的 字节码文件加载到JVM ,从而让 Java 程序能够启动起来。
类加载器根据各自加载范围的不同,划分为四种类加载器
  • 启动类加载器(BootStrap ClassLoader)
    • 该类并不继承 ClassLoader 类,其是由 C++ 编写实现。用于加载 JAVA_HOME/jre/lib 目录下的类库。
  • 扩展类加载器(ExtClassLoader):
    • 该类是ClassLoader的子类,主要加载JAVA_HOME/jre/lib/ext目录中的类库。
  • 应用类加载器(AppClassLoader):
    • 该类是ClassLoader的子类,主要用于加载classPath下的类,也就是加载开发者自己编写的Java类。
  • 自定义类加载器:
    • 开发者自定义类继承ClassLoader,实现自定义类加载规则。

8、双亲委派模型(⭐⭐⭐⭐)

        类加载器的体系并不是“继承”体系,而是委派体系,类加载器首先会到自己的parent中查找类或者资源,如果找不到才会到自己本地查找。类加载器的委托行为动机是为了避免相同的类被加载多次

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

  • 唯一性:通过双亲委派机制可以避免某一个类被重复加载,保证唯一性。
  • 安全性: 保证类库 API 不会被修改。

9、类装载的执行过程(⭐⭐⭐)

        类从加载到虚拟机中开始,直到卸载为止,它的整个生命周期包括了7 个阶段:
  • 加载:查找和导入class文件。
  • 验证:验证类是否符合JVM规范,安全性检查。
  • 准备:为类变量分配内存并设置类变量初始值。
  • 解析:把类中的符号引用转换为直接引用。
  • 初始化:对类的静态变量,静态代码块执行初始化操作。
  • 使用:JVM 开始从入口方法开始执行用户的程序代码。
  • 卸载:当用户程序代码执行完毕后,JVM便开始销毁创建的Class对象。

垃圾回收:

10、对象什么时候可以被垃圾器回收 (⭐⭐⭐⭐)

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

定位垃圾的方式:

  • 引用计数法:给对象中添加一个引用计数器,每被引用一次计数器就+1,反之-1。引用数为0时代表该对象可被回收。(缺点:循环引用时会出现内存泄漏)
  • 可达性分析算法:通过一系列的称为 “GC Roots”(肯定不能当做垃圾回收的对象) 的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连的话,则证明此对象是不可用的,需要被回收。
    • 可以作为GC Root的对象:
      • 虚拟机栈(栈帧中的局部变量表)中引用的对象
      • 本地方法栈(Native 方法)中引用的对象
      • 方法区中类静态属性引用的对象
      • 方法区中常量引用的对象
      • 所有被同步锁持有的对象
      • JNI(Java Native Interface)引用的对象

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暂停其他线程;而整个过程中耗时最长的并发标记并发清除阶段中,垃圾收集器线程可以与用户线程并行工作。
    1. 初始标记:标记GCRoots能直接关联到的对象,速度很快。
    2. 并发标记:标记GC Roots的间接关联对象,这个过程耗时较长但不需要停顿用户线程,可以与垃圾收集线程一起并发运行。
    3. 重新标记:修正并发标记期间,因用户程序继续运作而导致标记产生变动。
    4. 并发清除:清理删除掉标记阶段判断的已经死亡的对象,由于不需要移动存活对象,所以这个阶段也是可以与用户线程同时并发的。
  • 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命令查看进程中线程的信息,并定位到出问题的具体线程,最终定位问题。

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

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

相关文章

C#,入门教程(28)——文件夹(目录)、文件读(Read)与写(Write)的基础知识

上一篇: C#,入门教程(27)——应用程序(Application)的基础知识https://blog.csdn.net/beijinghorn/article/details/125094837 C#知识比你的预期简单的多,但也远远超乎你的想象! 与文件相关的知识&#xf…

【JAVA】我和我的第一个“对象”相遇

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-zAjv1fTLGQmnqncy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

刷题总结 1.23

三阶B-树根节点最少有一个关键字,其他节点最少【3/2】-1(向上取整),即为1; 所以该B树为一颗满二叉树,关键字个数为31; 这里的最优二叉树指的是赫夫曼二叉树,由赫夫曼二叉树的构造可…

MongoDB单机部署

Windows系统中的安装启动 第一步:下载安装包 MongoDB 提供了可用于 32 位和 64 位系统的预编译二进制包,你可以从MongoDB官网下载安装,MongoDB 预编译二进制包下载地址:https://www.mongodb.com/try/download/community 根据上…

抖音评论区链接,如何实现跳转到微信?-数灵通

在抖音发布带货视频后,如何有效地将用户吸引到我们的店铺呢?以微商为例,我们可以利用抖音评论区的评论置顶功能来达到这一目的。 评论置顶功能允许作者将一条评论置于评论区的顶部,使其成为评论区的焦点。我们可以利用这一功能来吸…

安装ROS2-ubuntu

相较于ROS1,ROS2在设计之初就考虑了在产品环境下⾯临的⼀些挑战,具体来说,ROS2采⽤(或者计划采⽤)以下策略以提升其在产品环境的适⽤度: ⽀持多机器⼈ 对⼩型嵌⼊式设备和微控制器的⽀持 实时系统&am…

如何在WordPress中使用 AI 进行 SEO(12 个工具)

您想在 WordPress 中使用 AI 进行 SEO 吗? 人工智能正在对 SEO 行业产生重大影响。已经有优秀的人工智能 SEO 工具,您可以使用它们来提高您的 SEO 排名,而无需付出太多努力。 在本文中,我们将向您展示如何通过我们精心挑选的工具…

html 3D 倒计时爆炸特效

下面是代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>HTML5 Canvas 3D 倒计时爆炸特效DEMO演示</title><link rel"stylesheet" href"css/style.css" media"screen&q…

架构篇10:架构设计流程-识别复杂度

文章目录 架构设计第 1 步&#xff1a;识别复杂度识别复杂度实战识别复杂度心得小结 从今天开始&#xff0c;我们分4期&#xff0c;结合复杂度来源和架构设计原则&#xff0c;通过一个模拟的设计场景“前浪微博”&#xff0c;一起看看在实践中究竟如何进行架构设计。今天先来看…

Zookeeper+Kafka集群

1 Zookeeper 1.1 Zookeeper概述 Zookeeper是一个开源的分布式的&#xff0c;为分布式框架提供协调服务的Apache项目。 分布式系统管理框架&#xff0c;主要用来解决分布式应用集群中应用系统的一致性问题&#xff0c;想大于各种分布式应用的注册中心文件系统通知机制 本质 …

element plus表格的表头和内容居中

文章目录 需求分析 需求 对于 element-plus 中的 table 进行表头和内容的居中显示 分析 单列的表头和内容居中 &#xff1a; 在对应的那一列加上align“center” 即可 <el-table-column prop"name" label"商品名称" align"center" />…

0004.电脑开机提示按F1

常用的电脑主板不知道什么原因&#xff0c;莫名其妙的启动不了了。尝试了很多方法&#xff0c;没有奏效。没有办法我就只能把硬盘拆了下来&#xff0c;装到了另一台电脑上面。但是开机以后却提示F1&#xff0c;如下图&#xff1a; 根据上面的提示&#xff0c;应该是驱动有问题…

『论文阅读|2024 WACV 多目标跟踪Deep-EloU|纯中文版』

论文题目&#xff1a; Iterative Scale-Up ExpansionIoU and Deep Features Association for Multi-Object Tracking in Sports 论文特点&#xff1a; 作者提出了一种迭代扩展的 ExpansionIoU 和深度特征关联方法Deep-EIoU&#xff0c;用于体育场景中的多目标跟踪&#xff0c;旨…

JAVA的双亲委派机制

目录 双亲委派的介绍破坏双亲委派模型OSGI 双亲委派&#xff08;Parent Delegation&#xff09;是一种软件设计模式&#xff0c;常用于Java类加载器的实现。它通过继承关系来实现类的加载&#xff0c;即每个类加载器都有一个父加载器&#xff0c;当一个类加载器需要加载一个类时…

测试工程师必看!测试用例设计全解析,让你彻底掌握

测试工程师在入行时&#xff0c;都会接触到一个名词——测试用例&#xff0c;都知道测试用例是干什么用的&#xff0c;提到设计测试用例的方法&#xff0c;大部分测试工程师都会侃侃而谈&#xff1a;等价类法、边界值法、判定表法、正交分解法……这些方法说起来都如数家珍&…

一、认识 JVM 规范(JVM 概述、字节码指令集、Class文件解析、ASM)

1. JVM 概述 JVM&#xff1a;Java Virtual Machine&#xff0c;也就是 Java 虚拟机 所谓虚拟机是指&#xff1a;通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的计算机系统。 即&#xff1a;虚拟机是一个计算机系统。这种计算机系统运行在完全隔离的环境中…

Linux网络编程(二-套接字)

目录 一、背景知识 1.1 端口号 1.2 网络字节序 1.3 地址转换函数 二、Socket简介 三、套接字相关的函数 3.1 socket() 3.2 bind() 3.3 connect() 3.4 listen() 3.5 accept() 3.6 read()/recv()/recvfrom() 3.7 send()/sendto() 3.8 close() 四、UPD客服/服务端实…

打造专业级ChatGPT风格聊天界面:SpringBoot与Vue实现动态打字机效果,附完整前后端源码

大家好&#xff0c;今天用SpringBoot、vue写了一个仿ChatGPT官网聊天的打字机效果。 所有代码地址:gitee代码地址 &#xff0c;包含前端和后端&#xff0c;可以直接运行 使用本技术实现的项目&#xff1a;aicnn.cn&#xff0c;欢迎大家体验 如果文章知识点有错误的地方&#xf…

AEB滤镜再破碎,安全焦虑「解不开」?

不久前&#xff0c;理想L7重大交通事故&#xff0c;再次引发了公众对AEB的热议。 根据理想汽车公布的事故视频显示&#xff0c;碰撞发生前3秒&#xff0c;车速在178km/h时驾驶员采取了制动措施&#xff0c;但车速大幅超出AEB&#xff08;自动紧急刹车系统&#xff09;的工作范…

Java下载FTP服务器上的资源,附带FTP工具类

通过xftp可以看到目标服务器上面的资源如下&#xff1a; 第一步&#xff1a;导入ftp依赖&#xff1a; <dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.7</version> <!-- 使用最新…