【Java面试题】JVM(26道)

文章目录

  • JVM面试题
  • 基础
    • 1.什么是JVM?
    • 2.JVM的组织架构?
  • 内存管理
    • 3.JVM的内存区域是什么?
      • 3.1堆
      • 3.2方法区
      • 3.3程序计数器
      • 3.4Java虚拟机栈
      • 3.5本地方法栈
    • 4.堆和栈的区别是什么?
    • 5.JDK1.6、1.7、1.8内存区域的变化?
    • 6.内存泄露和内存溢出是什么意思?
    • 7.内存泄漏的原因?
    • 8.如何判断对象仍然存活?
    • 9.Java堆的内存分区了解吗?
    • 10.垃圾收集算法了解吗?
    • 11.Minor GC/Young GC、Major GC/Old GC、Mix
    • 12.Minor GC/Young GC什么时候触发?
    • 13.什么时候触发Full GC?
    • 14.对象什么时候会进入老年代?
    • 15.有哪些垃圾收集器?
    • 16.垃圾收集器的作用?
    • 17.CMS垃圾收集器的垃圾收集过程?
    • 18.G1垃圾收集器了解吗?
    • 19.有了CMS,为什么还要引入G1?
  • 虚拟机执行
    • 20.说说解释执行和编译执行的区别?
    • 21.类的声明周期?
    • 22.类加载的过程知道吗?
      • 22.1加载
      • 22.2验证
      • 22.3准备
      • 22.4解析
      • 22.5初始化
    • 23.类加载器有哪些?
    • 24.什么是双亲委派机制?
    • 25.为什么要用双亲委派机制?
    • 26.如何破坏双亲委派机制?

JVM面试题

基础

1.什么是JVM?

  1. JVM,也就是 Java 虚拟机,它是 Java 实现跨平台的基石。
  2. Java 程序运行的时候,编译器会将 Java 源代码(.java)编译成平台无关的 Java 字节码文件(.class),接下来对应平台的 JVM 会对字节码文件进行解释,翻译成对应平台的机器指令并运行。

三分恶面渣逆袭:Java语言编译运行

同时,任何可以通过 Java 编译的语言,比如说 Groovy、Kotlin、Scala 等,都可以在 JVM 上运行

三分恶面渣逆袭:JVM跨语言

2.JVM的组织架构?

  1. JVM 大致可以划分为三个部门:类加载器、运行时数据区和执行引擎。

img

  1. 类加载器:负责从文件系统、网络或其他来源加载 Class 文件,将 Class 文件中的二进制数据读入到内存当中。

  2. 运行时数据区: JVM 在执行 Java 程序时,需要在内存中分配空间来处理各种数据,这些内存区域主要包括方法区、堆、栈、程序计数器和本地方法栈。

  3. 执行引擎: 执行引擎是 JVM 的心脏,负责执行字节码。它包括一个虚拟处理器,还包括即时编译器(JIT Compiler)和垃圾回收器(Garbage Collector)。

内存管理

3.JVM的内存区域是什么?

  1. JVM 的内存区域可以粗暴地划分为
  2. 当然了,按照 Java 的虚拟机规范,可以再细分为方法区程序计数器虚拟机栈本地方法栈、等。
  3. 其中方法区是线程共享区,虚拟机栈本地方法栈程序计数器是线程私有的。

三分恶面渣逆袭:Java虚拟机运行时数据区

3.1堆

  1. Java 堆(Java Heap)是虚拟机所管理的内存中最大的一块,被所有线程共享,在虚拟机启动时创建。
  2. Java 堆中经常会出现新生代老年代Eden空间From Survivor空间To Survivor空间等名词

image-20240408081956949

三分恶面渣逆袭:Java 堆内存结构

3.2方法区

  1. 方法区是一块比较特别的区域,和堆类似,也是各个线程共享的内存区域,用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等。
  2. Java 虚拟机规范对它的约束非常宽松,所以方法区的具体实现历经了许多变迁,例如 JDK 1.7 时,方法区被永久代(Permanent Generation)所代替,而在 JDK 1.8 时,永久代被彻底移除,取而代之的是元空间(Metaspace)。

3.3程序计数器

  1. 程序计数器(Program Counter Register)也被称为 PC 寄存器,是一块较小的内存空间。它可以看作是当前线程所执行的字节码行号指示器

3.4Java虚拟机栈

  1. Java 虚拟机栈(Java Virtual Machine Stack),通常指的就是“栈”,它的生命周期与线程相同。
  2. Java 虚拟机栈(JVM 栈)中是一个个栈帧,每个栈帧对应一个被调用的方法。当线程执行一个方法时,会创建一个对应的栈帧,并将栈帧压入栈中。当方法执行完毕后,将栈帧从栈中移除。

3.5本地方法栈

  1. 本地方法栈(Native Method Stacks)与虚拟机栈相似
  2. 区别在于虚拟机栈是为虚拟机执行 Java 方法服务的,而本地方法栈是为虚拟机使用到的本地(Native)方法服务的。

4.堆和栈的区别是什么?

  1. 堆属于线程共享的内存区域,几乎所有的对象都在对上分配,生命周期不由单个方法调用所决定,可以在方法调用结束后继续存在,直到不在被任何变量引用,然后被垃圾收集器回收。
  2. 栈就是前面提到的 JVM 栈(主要存储局部变量、方法参数、对象引用等),属于线程私有,通常随着方法调用的结束而消失,也就无需进行垃圾收集。

5.JDK1.6、1.7、1.8内存区域的变化?

  1. JDK1.6、1.7、1.8 内存区域发生了变化,主要体现在方法区的实现:
    1. JDK1.6 使用永久代实现方法区;
    2. JDK1.7 时发生了一些变化,将字符串常量池、静态变量,存放在堆上
    3. 在 JDK1.8 时彻底干掉了永久代,而在直接内存中划出一块区域作为 元空间,运行时常量池、类常量池都移动到元空间。

6.内存泄露和内存溢出是什么意思?

  1. 内存泄露:申请的内存空间没有被正确释放,导致内存被白白占用。
  2. 内存溢出:申请的内存超过了可用内存,内存不够了。
  3. 两者关系:内存泄露可能会导致内存溢出。
  4. 用一个有味道的比喻,内存溢出就是排队去蹲坑,发现没坑位了,内存泄漏,就是有人占着茅坑不拉屎,占着茅坑不拉屎的多了可能会导致坑位不够用。

7.内存泄漏的原因?

  • 造成内存泄漏的原因有以下几种:
    1. 静态集合类静态集合的生命周期和 JVM 一致,所以静态集合引用的对象不能被释放。
    2. 单例模式:和上面的例子原理类似,单例对象在初始化后会以静态变量的方式在 JVM 的整个生命周期中存在。如果单例对象持有外部的引用,那么这个外部对象将不能被 GC 回收,导致内存泄漏。
    3. 连接(IO/数据)未释放:创建的连接不再使用时,需要调用 close 方法关闭连接,只有连接被关闭后,GC 才会回收对应的对象(Connection,Statement,ResultSet,Session)。忘记关闭这些资源会导致持续占有内存,无法被 GC 回收。
    4. 变量作用域过大:一个变量的定义作用域大于其使用范围,很可能存在内存泄漏;或不再使用对象没有及时将对象设置为 null,很可能导致内存泄漏的发生。
    5. hash值发生改变:对象 Hash 值改变,使用 HashMap、HashSet 等容器中时候,由于对象修改之后的 Hah 值和存储进容器时的 Hash 值不同,所以无法找到存入的对象,自然也无法单独删除了,这也会造成内存泄漏。说句题外话,这也是为什么 String 类型被设置成了不可变类型。
    6. ThreadLocal使用不当:使用完 ThreadLocal 一定要记得使用 remove 方法来进行清除。

8.如何判断对象仍然存活?

  1. 两种方式:引用计数算法、可达性分析算法

  2. 引用计数算法:

    • 引用计数器:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;
    • 当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。
  3. 可达性分析算法:

    • 将一系列 GC Roots 作为初始的存活对象合集(Gc Root Set),然后从该合集出发,探索所有能够被该集合引用到的对象,并将其加入到该集合中,
    • 这个过程我们也称之为标记(mark)。最终,未被探索到的对象便是死亡的,是可以回收的

9.Java堆的内存分区了解吗?

  1. Java堆划分为新生代和老年代两个区域,新生代存放存活时间短的对象,而每次回收后存活的少量对象,将会逐步晋升到老年代中存放;
  2. 新生代分为三个区域:eden、from、to(8:1:1);from和to区域统称为survivor
  3. 发生垃圾收集时,将 Eden 和 Survivor 中仍然存活的对象一次性复制到另外一块 Survivor 空间上,然后直接清理掉 Eden 和已用过的那块 Survivor 空间。默认 Eden 和 Survivor 的大小比例是 8∶1。

Java堆内存划分

10.垃圾收集算法了解吗?

  1. 标记-清除算法
  2. 标记-复制算法
  3. 标记-清除-整理算法

11.Minor GC/Young GC、Major GC/Old GC、Mix

  • 部分收集(Partial GC):指目标不是完整收集整个 Java 堆的垃圾收集,其中又分为:

    • 新生代收集(Minor GC/Young GC):指目标只是新生代的垃圾收集。

    • 老年代收集(Major GC/Old GC):指目标只是老年代的垃圾收集。目前只有CMS 收集器会有单独收集老年代的行为。

    • 混合收集(Mixed GC):指目标是收集整个新生代以及部分老年代的垃圾收集。目前只有 G1 收集器会有这种行为。

  • 整堆收集(Full GC):收集整个 Java 堆和方法区的垃圾收集。

12.Minor GC/Young GC什么时候触发?

  1. 新创建的对象优先在新生代 Eden 区进行分配,如果 Eden 区没有足够的空间时,就会触发 Young GC 来清理新生代。

13.什么时候触发Full GC?

一共有6种触发条件:

  1. System.gc()等命令触发:System.gc()、jmap -dump 等命令会触发 full gc
  2. Young GC 之前检查老年代:在要进行 Young GC 的时候,发现老年代可用的连续内存空间 < 新生代历次Young GC后升入老年代的对象总和的平均大小,说明本次 Young GC 后可能升入老年代的对象大小,可能超过了老年代当前可用内存空间,那就会触发 Full GC。
  3. Young GC 之后老年代空间不足:执行 Young GC 之后有一批对象需要放入老年代,此时老年代就是没有足够的内存空间存放这些对象了,此时必须立即触发一次 Full GC
  4. 老年代空间不足,老年代内存使用率过高,达到一定比例,也会触发 Full GC。
  5. 空间分配担保失败( Promotion Failure),新生代的 To 区放不下从 Eden 和 From 拷贝过来对象,或者新生代对象 GC 年龄到达阈值需要晋升这两种情况,老年代如果放不下的话都会触发 Full GC。
  6. 方法区内存空间不足:如果方法区由永久代实现,永久代空间不足 Full GC。

14.对象什么时候会进入老年代?

一共有四种情况:

  1. 长期存活的对象将进入老年代:在对象的对象头信息中存储着对象的迭代年龄,迭代年龄会在每次 YoungGC 之后对象的移区操作中增加,每一次移区年龄加一.当这个年龄达到 15(默认)之后,这个对象将会被移入老年代。

    #可以通过这个参数设置这个年龄值。
    - XX:MaxTenuringThreshold
    
  2. 大对象直接进入老年代:有一些占用大量连续内存空间的对象在被加载就会直接进入老年代.这样的大对象一般是一些数组,长字符串之类的对。

    #HotSpot 虚拟机提供了这个参数来设置。
    -XX:PretenureSizeThreshold
    
  3. 动态对象年龄判定:HotSpot 虚拟机并不是永远要求对象的年龄必须达到- XX:MaxTenuringThreshold 才能晋升老年代,如果在 Survivor 空间中相同年龄所有对象大小的总和大于 Survivor 空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代

  4. 空间分配担保:假如在 Young GC 之后,新生代仍然有大量对象存活,就需要老年代进行分配担保,把 Survivor 无法容纳的对象直接送入老年代。

15.有哪些垃圾收集器?

  1. 一共有7种常见的垃圾收集器:如下

在这里插入图片描述

  1. 就目前来说,JVM 的垃圾收集器主要分为两大类:分代收集器和分区收集器,分代收集器的代表是 CMS,分区收集器的代表是 G1 和 ZGC。
  2. 在这里插入图片描述

16.垃圾收集器的作用?

  1. 垃圾回收器的核心作用是自动管理 Java 应用程序的运行时内存
  2. 它负责识别哪些内存是不再被应用程序使用的(即“垃圾”),并释放这些内存以便重新使用。

17.CMS垃圾收集器的垃圾收集过程?

CMS 收集齐的垃圾收集分为四步:

  • 初始标记(CMS initial mark):单线程运行,需要 Stop The World,标记 GC Roots 能直达的对象。
  • 并发标记((CMS concurrent mark):无停顿,和用户线程同时运行,从 GC Roots 直达对象开始遍历整个对象图。
  • 重新标记(CMS remark):多线程运行,需要 Stop The World,标记并发标记阶段产生对象。
  • 并发清除(CMS concurrent sweep):无停顿,和用户线程同时运行,清理掉标记阶段标记的死亡的对象。

Concurrent Mark Sweep收集器运行示意图

18.G1垃圾收集器了解吗?

  1. Garbage First(简称 G1)收集器是垃圾收集器的一个颠覆性的产物,它开创了局部收集的设计思路和基于 Region 的内存布局形式
  2. 以前的收集器分代是划分新生代、老年代、持久代等。
  3. G1 把连续的 Java 堆划分为多个大小相等的独立区域(Region),每一个 Region 都可以根据需要,扮演新生代的 Eden 空间、Survivor 空间,或者老年代空间。收集器能够对扮演不同角色的 Region 采用不同的策略去处理。
  4. 这样就避免了收集整个堆,而是按照若干个 Region 集进行收集,同时维护一个优先级列表,跟踪各个 Region 回收的“价值,优先收集价值高的 Region

G1 Heap Regions

  1. G1垃圾收集器的运行过程如下:
    • 初始标记(initial mark),标记了从 GC Root 开始直接关联可达的对象。STW(Stop the World)执行。
    • 并发标记(concurrent marking),和用户线程并发执行,从 GC Root 开始对堆中对象进行可达性分析,递归扫描整个堆里的对象图,找出要回收的对象、
    • 最终标记(Remark),STW,标记再并发标记过程中产生的垃圾。
    • 筛选回收(Live Data Counting And Evacuation),制定回收计划,选择多个 Region 构成回收集,把回收集中 Region 的存活对象复制到空的 Region 中,再清理掉整个旧 Region 的全部空间。需要 STW

19.有了CMS,为什么还要引入G1?

  • 优点:CMS 最主要的优点在名字上已经体现出来——并发收集、低停顿

  • 缺点:CMS 同样有三个明显的缺点。

    • Mark Sweep(标记-清除) 算法会导致内存碎片比较多

    • CMS 的并发能力比较依赖于 CPU 资源,并发回收时垃圾收集线程可能会抢占用户线程的资源,导致用户程序性能下降。

    • 并发清除阶段,用户线程依然在运行,会产生所谓的理“浮动垃圾”(Floating Garbage),本次垃圾收集无法处理浮动垃圾,必须到下一次垃圾收集才能处理。如果浮动垃圾太多,会触发新的垃圾回收,导致性能降低。

G1 主要解决了内存碎片过多的问题

虚拟机执行

20.说说解释执行和编译执行的区别?

  1. 解释和编译的区别?

    • 解释:将源代码逐行转换为机器码。
    • 编译:将源代码一次性转换为机器码。
  2. 解释执行和编译执行的区别?

    • 解释执行:程序运行时,将源代码逐行转换为机器码,然后执行。
    • 编译执行:程序运行前,将源代码一次性转换为机器码,然后执行。

21.类的声明周期?

一个类从被加载到虚拟机内存中开始,到从内存中卸载,整个生命周期需要经过七个阶段:

  • 加载 (Loading)

  • 连接:

    • 验证(Verification)
    • 准备(Preparation)
    • 解析(Resolution)
  • 初始化 (Initialization)

  • 使用(Using)

  • 卸载(Unloading)

类的生命周期

22.类加载的过程知道吗?

除去使用和卸载,就是 Java 的类加载过程。这 5 个阶段一般是顺序发生的,但在动态绑定的情况下,解析阶段发生在初始化阶段之后。

22.1加载

载入过程中,JVM 需要做三件事情:

  1. 通过一个类的全限定名来获取定义此类的二进制字节流
  2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
  3. 在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口。

载入

22.2验证

JVM 会在该阶段对二进制字节流进行校验,只有符合 JVM 字节码规范的才能被 JVM 正确执行。

22.3准备

VM 会在该阶段对类变量(也称为静态变量,static 关键字修饰的)分配内存并初始化,对应数据类型的默认初始值,如 0、0L、null、false 等。

22.4解析

解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。解析动作主要针对类或接口、字段、类方法、接口方法、方法类型等。

22.5初始化

该阶段是类加载过程的最后一步。在准备阶段,类变量已经被赋过默认初始值,而在初始化阶段,类变量将被赋值为代码期望赋的值。换句话说,初始化阶段是执行类构造器方法(javap 中看到的 <clinit>() 方法)的过程。

23.类加载器有哪些?

  • 启动类加载器(Bootstrap ClassLoader)用来加载 java 核心类库,无法被 java 程序直接引用。
  • 扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
  • 系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader()来获取它。
  • 用户自定义类加载器 (user class loader),用户通过继承 java.lang.ClassLoader 类的方式自行实现的类加载器

24.什么是双亲委派机制?

双亲委派模型的工作过程:

  1. 如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类
  2. 而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此
  3. 因此所有的加载请求最终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求时 ,子加载器才会尝试自己去完成加载

双亲委派模型

25.为什么要用双亲委派机制?

答案是为了保证应用程序的稳定有序

例如类 java.lang.Object,它存放在 rt.jar 之中,通过双亲委派机制,保证最终都是委派给处于模型最顶端的启动类加载器进行加载,保证 Object 的一致。反之,都由各个类加载器自行去加载的话,如果用户自己也编写了一个名为 java.lang.Object 的类,并放在程序的 ClassPath 中,那系统中就会出现多个不同的 Object 类

26.如何破坏双亲委派机制?

如果不想打破双亲委派模型,就重写 ClassLoader 类中的 fifindClass()方法即可,无法被父类加载器加载的类最终会通过这个方法被加载。而如果想打破双亲委派模型则需要重写 loadClass()方法。
在这里插入图片描述

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

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

相关文章

Python学习入门(1)——基础语句(二)

14. 迭代器和迭代协议 在Python中&#xff0c;迭代器是支持迭代操作的对象&#xff0c;即它们可以一次返回其成员中的一个。任何实现了 __iter__() 和 __next__() 方法的对象都是迭代器。 class Count:def __init__(self, low, high):self.current lowself.high highdef __i…

tailwindcss在manoca在线编辑智能感知

推荐一下monaco-tailwindcss库&#xff0c;它实现在monaco-editor网页在线编辑器中对tailwindcss的智能感知提示&#xff0c;在利用tailwindcss实现html效果布局。非常的方便。 生成CSS

7/8电源连接器航空插头端子

概述 7/8电源连接器是一种工业电源连接器的规格型号之一&#xff0c;常见于工业领域的电力传输和连接应用。它的名称中的“7/8”代表连接器插头的直径尺寸&#xff0c;通常为7/8英寸。这种类型的连接器通常用于较大电流传输和较高功率设备的连接&#xff0c;具有较大的电流承载…

Java 中文官方教程 2022 版(三十九)

原文&#xff1a;docs.oracle.com/javase/tutorial/reallybigindex.html XPath 如何工作 原文&#xff1a;docs.oracle.com/javase/tutorial/jaxp/xslt/xpath.html XPath 规范是各种规范的基础&#xff0c;包括 XSLT 和链接/寻址规范&#xff0c;如XPointer。因此&#xff0c;对…

Ubuntu系统 - 使用不同的libssl库

1 ubuntu-20.04.2.0-desktop-amd64 - 依赖libssl1.1 $ readelf -d mainDynamic section at offset 0x2d60 contains 29 entries:Tag Type Name/Value0x0000000000000001 (NEEDED) Shared library: [libssl.so.1.1]0x0000000000000…

【Java-TesseractOCR】通过Java实现OCR

通过Java实现OCR 一、TesseractOCR二、引入pom训练集下载地址三、引入训练集三、使用 一、TesseractOCR 本文使用的是TesseractOCR进行识别 二、引入pom <dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId&…

多态——C++

这里写目录标题 衔接继承总结继承和组合白箱复用黑箱复用 多态的概念多态的定义以及实现虚函数重写的两个例外协变面试题析构函数的重写 finalvoerride重载隐藏(重定义)重写(覆盖)抽象类什么是抽象类&#xff1f; 实现继承和接口继承多态的原理虚函数表 那多态的调用是怎么实现…

从零开始HashMap

目录 1.HashMap的数据结构 2.put&#xff08;&#xff09;流程 2.1了解扩容机制 2.2扩容三个地方 2.3存入数据步骤 3.HashMap和Hashtable的区别 4.HashMap线程安全的解决办法 4.1Hashtable 4.2Collections 4.3ConcurrentHashMap 线程安全实现机制 1.HashMap的数据结…

14届蓝桥杯 C/C++ B组 T6 岛屿个数 (BFS,FloodFill,填色)

首先拿到这道题不要想着去直接判断环里面的岛屿&#xff0c;这样太困难了&#xff0c;我们可以使用之前做过的题的经验&#xff0c;在输入加入一圈海水&#xff0c;然后从(0,0)点开始BFS&#xff0c;这里进行八向搜索&#xff0c;搜到的0全部都染色成2&#xff0c;假如2能够蔓延…

Vue项目打包配置生产环境去掉console.log语句的方法

一、Vue2项目 使用webpack内置的 terser 工具&#xff0c;在vue.config.js文件加上相应的配置即可。 二、Vue3项目 同样是使用 terser 工具&#xff0c;不过vite没有内置terser&#xff0c;需要手动安装依赖 安装完后在vite.config.js文件加上相应的配置即可。 2024-4-9

日本韩国海外网红达人合作:共创TikTok与YouTube双赢营销格局

【本篇由言同数字科技有限公司原创】日韩地区拥有庞大的互联网用户群体&#xff0c;其中TikTok和YouTube作为两大主流平台&#xff0c;吸引了大量的用户和网红。随着直播带货在全球范围内的兴起&#xff0c;日韩地区的网红们也开始积极参与直播带货&#xff0c;将其作为一种新的…

如何使用pandoc转word和正确的参考文献格式

如何使用pandoc转word和正确的参考文献格式 latex转word参考文献样式 .csl 文件获取方法&#xff1a; bib转ris 在线转换导入endnote文献管理工具 latex转word 在cmd中转到latex文件所在目录&#xff0c;运行&#xff1a; pandoc sn-article.tex -o output_1.docx -w docx --…

VRRP——虚拟路由冗余协议

什么是VRRP 虚拟路由冗余协议VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;是一种用于提高网络可靠性的容错协议。 通过VRRP&#xff0c;可以在主机的下一跳设备出现故障时&#xff0c;及时将业务切换到备份设备&#xff0c;从而保障网络通信的连续性和可…

研华UNO-3082-BTO工控机维修Advantech工业计算机主机深圳捷达工控维修

Intel Core™ 2 双核自动化计算机 带双 DVI、2 x PCI 和 FireWire Intel Core™ 2 双核自动化计算机 带双 DVI、1 x PCIe、3 x PCI 和 FireWire 板载 Intel Core 2 Duo L7500 1.6 GHz 处理器 双 DVI-I 支持最多 3 个显示器 用于视觉检测设备的双 IEEE-1394 通过跳线选择 AT/AT…

php其他反序列化知识学习

简单总结一下最近学习的&#xff0c;php其他的一些反序列化知识 phar soap session 其他 __wakeup绕过gc绕过异常非公有属性&#xff0c;类名大小写不敏感正则匹配&#xff0c;十六进制绕过关键字检测原生类的利用 phar 基础知识 在 之前学习的反序列化利用中&#xff0…

kvm虚拟机磁盘镜像加密

一、qcow2的aes加密 低版本的qemu能够支持对qcow2文件进行aes加密的方式&#xff0c;例如对一个已经存在的磁盘文件test.qcow2&#xff0c;可以将其转换为经过加密的qcow2文件。 qemu-img convert -O qcow2 --object secret,idsec0,data123456 -o encryptionon,encrypt.key-s…

(学习日记)2024.04.18:UCOSIII第四十六节:CPU利用率及栈检测统计

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

SQL explain 显示子查询A类型为ALL怎么优化

当 SQL EXPLAIN 显示子查询 A 的类型为 ALL 时&#xff0c;这意味着数据库系统正在执行全表扫描&#xff0c;而不是使用索引来执行子查询。全表扫描可能会导致性能下降&#xff0c;特别是在大型表上。 为了优化这种情况&#xff0c;您可以考虑以下几点&#xff1a; 1. **索引…

【Linux学习笔记】安卓运行C可执行文件No such file or directory

文章目录 开发环境运行失败现象解决办法方法一&#xff1a;使用静态库方法二&#xff1a;使用动态库创建lib查找依赖库复制需要注意的事情 开发环境 开发板&#xff1a;正点原子RK3568开发板安卓版本&#xff1a;11可执行程序命名&#xff1a;ledApp需加载模块&#xff1a;dts…

Redis的过期策略与内存淘汰机制原理及实践

Redis作为高性能的键值存储系统&#xff0c;其对数据过期与内存管理的设计直接影响到系统的性能与资源利用率。本文将以生动的比喻、通俗的语言&#xff0c;深入剖析Redis的过期策略与内存淘汰原理&#xff0c;助您全面理解数据在Redis中的生命周期管理艺术。 一、Redis过期策…