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

【面试篇】JVM

文章目录

  • 一、JVM 内存结构
    • 1. 请详细描述 JVM 的内存结构,各个区域的作用是什么?
    • 2. 堆内存是如何划分的?新生代和老年代的比例是多少?
    • 3. Eden 区和 Survivor 区的作用是什么?它们之间是如何协作的?
    • 4. 方法区中主要存储哪些内容?JDK 1.8 之后方法区有什么变化?
  • 二、垃圾回收机制
    • 1. 请介绍一下垃圾回收的算法有哪些?它们各自的特点是什么?
    • 2. 什么是 Minor GC、Major GC 和 Full GC?它们之间有什么区别?
    • 3.如何判断一个对象是否可以被回收?
    • 4. 垃圾回收器有哪些?它们各自的特点和适用场景是什么?
  • 三、类加载机制
    • 1. 请描述 Java 类加载的过程,包括加载、验证、准备、解析和初始化这几个阶段。
    • 2. 类加载器有哪些?它们之间的层次关系是怎样的?
    • 3. 什么是双亲委派模型

一、JVM 内存结构

1. 请详细描述 JVM 的内存结构,各个区域的作用是什么?

  • 堆(Heap):这是 JVM 中最大的一块内存区域,用于存储对象实例。几乎所有的对象实例和数组都在堆上分配内存。堆是垃圾回收(GC)的主要区域,又可以细分为新生代(Young Generation)和老年代(Old Generation),新生代还包括一个 Eden 区和两个 Survivor 区(一般是 S0 和 S1)。
  • 方法区(Method Area):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码缓存等数据。在 JDK 1.8 及之后,方法区被元空间(Metaspace)取代,元空间并不在虚拟机内存中,而是使用本地内存。
  • 虚拟机栈(Java Virtual Machine Stack):每个线程在创建时都会创建一个虚拟机栈,它用于存储栈帧。栈帧中保存了方法的局部变量表、操作数栈、动态链接和方法返回地址等信息。每调用一个方法就会在栈顶压入一个栈帧,方法执行完成后,栈帧出栈。
  • 本地方法栈(Native Method Stack):与虚拟机栈类似,不过它是为虚拟机使用到的本地(Native)方法服务的。例如,Java 通过 JNI(Java Native Interface)调用 C 或 C++ 代码时,就会使用本地方法栈。
  • 程序计数器(Program Counter Register):每个线程都有一个独立的程序计数器,它记录了当前线程正在执行的字节码指令的地址。如果线程正在执行一个 Java 方法,计数器记录的是正在执行的虚拟机字节码指令地址;如果正在执行本地方法,则计数器值为空(Undefined)。

2. 堆内存是如何划分的?新生代和老年代的比例是多少?

  • 堆内存分为新生代和老年代。新生代主要存放新创建的对象,老年代存放经过多次垃圾回收仍然存活的对象。
  • 在 HotSpot 虚拟机中,新生代和老年代默认比例是 1:2,即新生代占整个堆内存的 1/3,老年代占 2/3。但这个比例可以通过参数 - XX:NewRatio 来调整。例如,-XX:NewRatio=4 表示新生代与老年代的比例是 1:4,新生代占堆内存的 1/5。

3. Eden 区和 Survivor 区的作用是什么?它们之间是如何协作的?

  • Eden 区是对象最初创建时分配内存的地方。当 Eden 区内存满了,就会触发 Minor GC(新生代垃圾回收)。
  • Survivor 区有两个,一般称为 S0 和 S1。在 Minor GC 时,Eden 区中存活的对象会被复制到其中一个 Survivor 区(假设是 S0),同时 S1 中存活的对象也会被复制到 S0 中,并且对象的年龄(对象在 Survivor 区经历一次垃圾回收年龄就加 1)会增加。经过一次 Minor GC 后,Eden 区被清空,原来的 S1 也被清空,S0 变成新的 S1,原来的 S0 成为下一次 Minor GC 时存放对象的 Survivor 区。当对象的年龄达到一定阈值(默认是 15,可以通过 - XX:MaxTenuringThreshold 参数调整),就会被晋升到老年代。

4. 方法区中主要存储哪些内容?JDK 1.8 之后方法区有什么变化?

  • 在 JDK 1.7 及之前,方法区主要存储已被虚拟机加载的类信息(类的全限定名、类的访问修饰符、类的父类、接口等)、常量(字符串常量池、基本类型常量)、静态变量、即时编译器编译后的代码缓存等。
  • JDK 1.8 之后,方法区被元空间取代。元空间与之前的方法区不同,它不再使用虚拟机内存,而是使用本地内存。这样做的好处是可以避免由于方法区内存不足导致的 OutOfMemoryError 错误,因为本地内存相对来说资源更充足。字符串常量池也从方法区移到了堆中。

二、垃圾回收机制

1. 请介绍一下垃圾回收的算法有哪些?它们各自的特点是什么?

  • 标记 - 清除算法(Mark - Sweep):
    过程:首先从根对象(如栈中的局部变量、静态变量等)开始遍历,标记所有可达的对象,然后清除所有未被标记的对象(即不可达对象)。
    特点:实现简单,但是会产生内存碎片,因为清除的对象在内存中可能是不连续的,导致后续大对象无法分配到连续的内存空间。
  • 复制算法(Copying):
    过程:将内存分为两块大小相等的区域,每次只使用其中一块。当这一块内存满了,就将存活的对象复制到另一块内存中,然后将原来的内存块清空。例如在新生代中,Eden 区和 Survivor 区就采用了类似的复制算法思想,Eden 区和一个 Survivor 区用于分配对象,另一个 Survivor 区用于存放复制过来的存活对象。
    特点:不会产生内存碎片,并且复制过程相对简单高效。但是内存利用率低,因为总有一半的内存空间处于空闲状态。
  • 标记 - 整理算法(Mark - Compact):
    过程:首先标记所有可达对象,然后将所有存活的对象向内存的一端移动,最后清除边界以外的内存空间。
    特点:避免了内存碎片问题,同时也不像复制算法那样浪费一半内存。但是移动对象的过程比较复杂,会增加一定的时间开销。
  • 分代收集算法(Generational Collection):
    过程:根据对象存活周期的不同将内存划分为不同的区域,如新生代和老年代。在新生代中,由于对象存活时间短,采用复制算法可以高效地回收垃圾;在老年代中,对象存活时间长,采用标记 - 清除或标记 - 整理算法,因为老年代对象移动成本较高。
    特点:综合利用了不同算法的优势,根据对象的特点选择合适的算法,提高了垃圾回收的效率。

2. 什么是 Minor GC、Major GC 和 Full GC?它们之间有什么区别?

  • Minor GC:发生在新生代的垃圾回收,主要是回收新生代中的对象。由于新生代对象大多存活时间较短,所以 Minor GC 频率较高,但回收速度相对较快。在 Minor GC 时,Eden 区和 Survivor 区中不可达的对象会被回收。
  • Major GC:通常指老年代的垃圾回收。Major GC 的频率相对较低,因为老年代对象存活时间较长。Major GC 的速度一般比 Minor GC 慢,因为老年代对象较多且可能涉及复杂的对象引用关系。在 Major GC 时,老年代中不可达的对象会被回收。
  • Full GC:是对整个堆(包括新生代、老年代和方法区)进行的垃圾回收。Full GC 会导致应用程序停顿较长时间,因为它需要处理整个堆内存。触发 Full GC 的原因有多种,例如老年代空间不足、方法区空间不足、调用 System.gc () 方法(不过该方法只是建议虚拟机进行 Full GC,虚拟机不一定会立即执行)等。

3.如何判断一个对象是否可以被回收?

  • 引用计数法:给每个对象添加一个引用计数器,每当有一个地方引用该对象时,计数器值加 1;当引用失效时,计数器值减 1。当计数器值为 0 时,就认为该对象可以被回收。这种方法实现简单,但是无法解决对象之间相互循环引用的问题,例如对象 A 引用对象 B,对象 B 又引用对象 A,即使它们在外部没有其他引用,引用计数器也不会为 0,导致无法回收。
  • 可达性分析算法:通过一系列称为 “GC Roots” 的根对象作为起始节点集,从这些节点开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GC Roots 没有任何引用链相连时,就说明此对象是不可达的,可以被回收。在 Java 中,可作为 GC Roots 的对象包括虚拟机栈中的局部变量表中的对象、方法区中的静态变量引用的对象、本地方法栈中 JNI 引用的对象等。

4. 垃圾回收器有哪些?它们各自的特点和适用场景是什么?

  • Serial 收集器:
    特点:单线程收集器,在进行垃圾回收时,必须暂停其他所有工作线程,直到垃圾回收完成。它的优点是简单高效,没有线程交互开销。
    适用场景:适用于客户端模式下的小型应用,因为简单且内存占用少。
  • ParNew 收集器:
    特点:Serial 收集器的多线程版本,使用多个线程进行垃圾回收。它在新生代使用复制算法,与 Serial 收集器相比,在多核心处理器环境下可以充分利用多线程优势,提高垃圾回收效率。
    适用场景:可以作为老年代使用 CMS 收集器时的新生代收集器,因为 CMS 收集器无法与 Serial 收集器配合工作。
  • Parallel Scavenge 收集器:
    特点:也是一个多线程收集器,在新生代使用复制算法。它的目标是达到一个可控制的吞吐量(运行用户代码时间与垃圾收集时间之和的比值)。可以通过设置参数 - XX:MaxGCPauseMillis 来控制最大垃圾回收停顿时间,或者通过 - XX:GCTimeRatio 来设置吞吐量大小。
    适用场景:适用于注重吞吐量的应用,例如后台计算任务等。
  • Serial Old 收集器:
    特点:Serial 收集器的老年代版本,单线程收集器,使用标记 - 整理算法。主要用于客户端模式,在服务器模式下,主要作为 CMS 收集器发生 Concurrent Mode Failure(并发模式失败,当 CMS 收集器在并发清理阶段,老年代内存增长过快,导致 CMS 无法在垃圾堆积满之前完成清理,就会发生这种情况)后的后备收集器。
    适用场景:与 Serial 收集器类似,适用于客户端模式下的小型应用,或者作为 CMS 收集器的后备方案。
  • Parallel Old 收集器:
    特点:Parallel Scavenge 收集器的老年代版本,多线程收集器,使用标记 - 整理算法。与 Parallel Scavenge 收集器配合使用,可以更好地实现高吞吐量的应用场景。
    适用场景:适用于注重吞吐量的应用,特别是在多核处理器环境下,与 Parallel Scavenge 收集器搭配能充分发挥优势。
  • CMS(Concurrent Mark Sweep)收集器:
    特点:一种以获取最短回收停顿时间为目标的收集器。它是基于标记 - 清除算法实现的,整个过程分为四个步骤:初始标记(Initial Mark)、并发标记(Concurrent Mark)、重新标记(Remark)和并发清除(Concurrent Sweep)。初始标记和重新标记阶段需要暂停其他线程,而并发标记和并发清除阶段可以与用户线程并发执行。优点是停顿时间短,对响应时间要求高的应用比较友好。
    适用场景:适用于互联网应用、B/S 系统等对响应时间要求较高的场景,但是它会产生内存碎片,并且在并发清除阶段可能会因为用户线程继续产生垃圾对象而导致 Concurrent Mode Failure。
  • G1(Garbage - First)收集器:
    特点:一种面向服务端应用的垃圾收集器。它将堆内存划分为多个大小相等的 Region,这些 Region 可以是新生代也可以是老年代。G1 收集器可以同时兼顾吞吐量和低停顿时间。它会跟踪每个 Region 中垃圾的价值(回收后获得的空间大小和回收所需时间的比值),优先回收价值最大的 Region。G1 收集器的停顿时间是可预测的,并且在回收过程中可以与用户线程并发执行。
    适用场景:适用于大内存、多核心的服务器环境,特别是对停顿时间有严格要求的应用,如电商交易系统等。

三、类加载机制

1. 请描述 Java 类加载的过程,包括加载、验证、准备、解析和初始化这几个阶段。

  • 加载(Loading):
    这是类加载的第一个阶段,通过类的全限定名获取该类的二进制字节流。这个字节流可以从多种来源获取,例如本地文件系统、网络、jar 包等。
    将字节流所代表的静态存储结构转化为方法区的运行时数据结构。
    在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口。
  • 验证(Verification):
    目的是确保 Class 文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。
    文件格式验证:验证字节流是否符合 Class 文件格式的规范,例如是否以魔数 0xCAFEBABE 开头,主次版本号是否在当前虚拟机处理范围内等。
    元数据验证:对字节码描述的信息进行语义分析,确保其符合 Java 语言规范,例如类是否有父类(除了 Object 类),类中的方法是否重写了父类的方法且符合重写规则等。
    字节码验证:通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。例如检查操作数栈的数据类型与指令代码序列是否匹配等。
    符号引用验证:确保解析动作能正确执行,例如符号引用中通过字符串描述的全限定名是否能找到对应的类等。
  • 准备(Preparation):
    为类的静态变量分配内存,并设置默认初始值。例如,对于 int 类型的静态变量,默认初始值为 0;对于对象引用类型的静态变量,默认初始值为 null。这里分配的内存是在方法区中。
    注意,对于被 final 修饰的静态常量,如果在编译期就能够确定其值(如 final int a = 10;),则在准备阶段就会直接将其初始化为指定的值,而不是默认值。
  • 解析(Resolution):
    将常量池中的符号引用替换为直接引用的过程。符号引用是一组符号来描述所引用的目标,例如类的全限定名、方法名等。直接引用则是直接指向目标的指针、相对偏移量或者是一个能间接定位到目标的句柄。
    类或接口的解析:将符号引用中的类或接口的全限定名解析为对其在方法区中对应数据结构的直接引用。
    字段解析:解析字段的符号引用,确定字段在类或接口中的具体位置。
    方法解析:解析方法的符号引用,确定方法在类或接口中的具体实现。
  • 初始化(Initialization):
    执行类构造器() 方法。() 方法是由编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并产生的。虚拟机会保证在子类的() 方法执行之前,父类的() 方法已经执行完毕。
    当初始化一个类时,如果其父类还没有被初始化,则先初始化其父类。
    当一个类中存在多个静态代码块和静态变量赋值语句时,它们会按照在代码中出现的顺序依次执行。

2. 类加载器有哪些?它们之间的层次关系是怎样的?

  • 启动类加载器(Bootstrap ClassLoader):
    它是 Java 虚拟机实现的一部分,用 C++ 语言实现(在 HotSpot 虚拟机中)。负责加载 Java 核心类库,如 rt.jar 中的类,这些类存放在 JDK 的 jre/lib 目录下。它是所有类加载器的父加载器,但是在 Java 代码中无法直接获取到它。
  • 扩展类加载器(Extension ClassLoader):
    由 Java 语言实现,继承自 ClassLoader 类。负责加载 JDK 安装目录下 jre/lib/ext 目录中的类库,或者由系统变量 java.ext.dirs 指定的路径中的类库。
  • 应用程序类加载器(Application ClassLoader):
    也称为系统类加载器,同样由 Java 语言实现,继承自 ClassLoader 类。它负责加载用户类路径(ClassPath)上所指定的类库,是程序中默认的类加载器。在 Java 代码中可以通过 ClassLoader.getSystemClassLoader () 方法获取到它。
  • 自定义类加载器:
    用户可以继承 ClassLoader 类,重写 findClass () 等方法来自定义类加载器,用于加载特定路径或特定格式的类文件。例如,在实现热部署、加密类文件加载等场景中会用到自定义类加载器。
  • 层次关系:类加载器之间采用双亲委派模型。当一个类加载器收到类加载请求时,它首先不会自己去尝试加载这个类,而是把请求委派给父类加载器去完成,每一层的类加载器都是如此,直到最顶层的启动类加载器。如果父类加载器无法完成加载请求(它的搜索范围中没有找到对应的类),子类加载器才会尝试自己去加载。这种模型保证了 Java 核心类库的安全性,避免了用户自定义的同名类覆盖核心类库中的类。

3. 什么是双亲委派模型

  • 双亲委派模型:如上述类加载器层次关系中所述,当一个类加载器收到类加载请求时,它首先把请求委派给父类加载器去完成,只有当父类加载器无法完成加载请求时,子类加载器才会尝试自己去加载。
  • 优点:
    安全性:保证了 Java 核心类库的安全性。例如,对于 java.lang.Object 类,无论哪个类加载器去加载它,最终都是由启动类加载器加载,避免了用户自定义的同名类覆盖核心类库中的类,防止了恶意代码对核心类库的破坏。

相关文章:

【面试篇】JVM

文章目录 一、JVM 内存结构1. 请详细描述 JVM 的内存结构,各个区域的作用是什么?2. 堆内存是如何划分的?新生代和老年代的比例是多少?3. Eden 区和 Survivor 区的作用是什么?它们之间是如何协作的?4. 方法区…...

【TI MSPM0】ADC DAC学习

一、样例展示 通过ADC0触发单次采样,如果采样结果大于0.5倍的VDD,就点亮LED 否则熄灭LED 编译加载运行这个历程,提供一个电压到A0_2引脚上,电压范围在0-VCC之间同时观察LED1.在上电后,默认将ADC配置到正确的引脚模式,…...

Cesium系列:从入门到实践,打造属于你的3D地球应用

一、Cesium简介 CesiumJS 是一个开源的 JavaScript 库,它能够帮助开发者创建出具有卓越性能、高精度、出色视觉质量和易用性的世界级 3D 地球仪和地图。无论是在航空航天领域,用于模拟飞行路径和展示卫星数据;还是在智能城市中,用…...

笔记1——数据通信网络基础

一、概述 数据通信网络:由路由器、交换机、防火墙、无线设备以终端构成的网络 功能:实现数据互通 二、网络设备 交换机: 特点:距离终端用户最近的设备 作用:终端接入、二层交换机 广播域:交换机连接的终端构成一个广播…...

Linux系统程序设计:从入门到高级Day01

知识点1 【系统调用】 系统调用的概述 系统调用:内核 提供给 用户 可以 操作内核 的一组函数接口 关系:用户 借助 系统调用 操作内核 进程的空间分为:内核空间 和 用户空间 用户一般都是在用户空间操作的,但是有的时候用户需要…...

openEuler24.03 LTS下安装HBase集群

前提条件 安装好Hadoop完全分布式集群,可参考:openEuler24.03 LTS下安装Hadoop3完全分布式 安装好ZooKeeper集群,可参考:openEuler24.03 LTS下安装ZooKeeper集群 HBase集群规划 node2node3node4MasterBackup MasterRegionServ…...

关于testng.xml无法找到类的问题

问题:testng.xml添加测试类的时候飘红 解决办法: 1.试图通过自动生成testng.xml插件去解决,感觉也不是这个问题,没有尝试; 2.以为是创建包的方式不对,重新删除后新建--还是找不到 想新建类的时候发现从m…...

数据结构:探秘AVL树

本节重点 理解AVL树的概念掌握AVL树正确的插入方法利用_parent指针正确更新平衡因子掌握并理解四种旋转方式:左单旋,右单旋,左右双旋,右左双旋 一、AVL树的概念 AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis&…...

Linux 入门:基础开发工具(上)vim,gcc/g++,make/makefile

目录 一.软件包管理器 一).软件包 二).安装软件 三).删除软件 二.编辑器vim 一).vim的基本介绍 1.正常/普通/命令模式(Normal mode) 2.插入模式(Insert mode) 3.底行模式(last line mode) 二).vim的基本操作 …...

计算机科学基础设施之数学:科研工具、资源与环境详介

李升伟 整理 数学科研涉及广泛的工具、资源和环境,涵盖从理论分析到数值模拟、从数据获取到论文发表的各个环节。以下是对数学科研中常用工具、资源和环境的详细介绍: 一、数学科研工具 1. 文献检索与管理工具 Google Scholar:全球最大的…...

Turtle事件处理(键盘与鼠标交互)

Turtle 提供了 事件驱动编程,允许我们使用 键盘 和 鼠标 控制 Turtle,从而实现交互式绘图。例如,我们可以让 Turtle 响应 按键、鼠标点击 和 拖动 事件,使其根据用户的输入进行移动、旋转或绘制图形。 1. 事件机制概述 Turtle 的事件处理主要依赖 turtle.Screen() 提供的 …...

5、无线通信基站的FPGA实现架构

基站(Base Station,BS),也称为公用移动通信基站,是无线电台站的一种形式,具体则指在一定的无线电覆盖区中,通过移动通信交换中心,与移动电话终端之间的信息传递的无线电收发信电台。…...

关于 UPDATE 语句 和 SELECT ... FOR UPDATE 的对比分析,包括语法、功能、锁机制、使用场景及示例代码

以下是关于 UPDATE 语句 和 SELECT ... FOR UPDATE 的对比分析,包括语法、功能、锁机制、使用场景及示例代码: 1. UPDATE 语句 功能 直接修改数据:立即更新表中的数据,并提交修改。无显式锁:虽然会自动加锁&#xff…...

Linux2 CD LL hostnamectl type mkdir dudo

查看主机名信息 设置静态主机名 同时配置静态、瞬时主机名 下载Vmware tools https://blog.csdn.net/qq_34638161/article/details/102779721 mkdir创建目录 问题:为什么在root目录下 看不到 /var /usr那些文件夹...

Docker容器部署Java项目的自动化脚本(Shell编写)

🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Docker容器部署Java项目的自动化脚本&#x…...

计组(蒋)期末不挂科纲要

2025.03.27:计算机组成原理期末不挂科速成纲要 计组期末不挂科速成纲要 第1章 概论第2章 数据的机器层次表示习题练习 第3章 指令系统习题练习 第4章 数值的机器运算习题练习 第5章 存储系统和结构习题练习 第6章 中央处理器习题练习 第7章 总线 第1章 概论 冯诺依曼…...

STM32F103C8T6单片机硬核原理篇:讨论GPIO的基本原理篇章1——只讨论我们的GPIO简单输入和输出

目录 前言 输出时的GPIO控制部分 标准库是如何操作寄存器完成GPIO驱动的初始化的? 问题1:如何掌握GPIO的编程细节——跟寄存器如何打交道 问题2:哪些寄存器,去哪里找呢? 问题三,寄存器的含义&#xff…...

UniApp集成极光推送详细教程

最近项目要集成推送服务,选型极光推送,记录一下开发过程。 1、极光官网注册登录 1.1选择极光推送产品,新建应用 1.2在下一步中选择Android/IOS的消息推送服务 1.3产品设置中输入应用包名(一经输入后不可更改,一定要正…...

探索Doris:日志分析的新宠,是否能取代老牌ES?

在大数据时代,日志存储与分析对于企业的运营和决策起着至关重要的作用。Elasticsearch(简称 ES)作为一款广泛应用的开源分布式搜索和分析引擎,长期以来在日志管理领域占据着举足轻重的地位。然而,随着技术的不断发展&a…...

HCIA/HCIP基础知识笔记汇总

HCIA/HCIP基础知识笔记汇总 ICT产业链: 上游:芯片制造、元器件生产、光纤光缆制造 中游:硬件组装、软件开发、网络建设维护 下游:电信服务、互联网服务、终端产品 VLAN端口类型: access :…...

AI战略群与星际之门:软银AI投资版图计划深度解析

一、星际之门:万亿美元级 AI 基础设施革命 1.1 项目背景与战略定位 在 AI 技术迅猛发展的今天,算力已成为推动其前进的核心动力。软银联合 OpenAI、甲骨文、英伟达、微软、arm推出的 “星际之门”(Stargate)计划,无疑是 AI 领域的一颗重磅炸弹。作为 AI 领域史上最大单笔…...

系统思考与时间管理

时间管理的真正秘诀:主动浪费时间? 巴菲特的私人飞机驾驶员觉得自己不够成功,于是向巴菲特请教应该怎么做。巴菲特让他列出了自己人生中最想实现的25个目标,并按重要程度排序,接着安排时间专注做前五件最重要的事情。…...

mac air m系列arm架构芯片安装虚拟机 UTM+debian 浏览器firefox和chrome

成果展示:debian虚拟机,你值得拥有! 预期结果 1、mac的m系列芯片,arm 架构且内存小,安装虚拟机。 考虑到mac m系列芯片8g内存,arm架构想安装一个轻量的虚拟机,偶然之间发现了debian&#xff0c…...

大模预测法洛四联症的全方位研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、法洛四联症概述 2.1 病理特征 2.2 临床表现 2.3 现有治疗手段 三、大模预测法洛四联症的原理与模型构建 3.1 大模预测基本原理 3.2 模型构建的数据收集与处理 3.3 模型训练与优化 四、术前风险预测与准…...

Keepalived+LVS+nginx高可用架构

注明:所有软件已经下载好,防火墙和SELinux已经全部关闭 一.搭建NFS 1.服务端 1.创建文件 [rootnfs ~]# mkdir -p /nfs/data 2、修改权限 [rootnfs ~]# chmod orw /nfs/data 3、写配置文件 [rootnfs ~]# cat /etc/exports /nfs/data 192.168.111.118(r…...

【力扣hot100题】(034)LRU缓存

做完这题已经没有任何力气写链表题了。 思路很简单,就是调试特别的痛苦。 老是频频报错,唉。 class LRUCache { public:struct ListNode{int key,val;ListNode* next; ListNode* prev;ListNode() : key(0), val(0), next(nullptr), prev(nullptr) {}L…...

【redis】缓存 更新策略(定期、实时生存),缓存预热、穿透、雪崩、击穿详解

什么是缓存 redis 最常用的场景 核心思路就是把一些常用的数据,放到触手可及(访问速度更快)的地方 ⽐如我需要去⾼铁站坐⾼铁. 我们知道坐⾼铁是需要反复刷⾝份证的 (进⼊⾼铁站, 检票, 上⻋,乘⻋过程中, 出站…)正常来说, 我的⾝份证是放在…...

好文和技术网站记录

后续不断记录一些本人觉得的好文和一些技术网站 技术网站 Java 全栈知识体系 https://www.pdai.tech/ 文章 利用 NginxKeepalived 实现高可用技术 https://cloud.tencent.com/developer/article/1647182?policyId1004...

使用STM32CubeMX和Keil在STM32上创建并运行一个简单的FreeRTOS多任务程序

目标 利用FreeRTOS运行两个任务,分别为点灯和OLED屏的显示。 利用STM32CubeMX生成Keil工程和相关初始化代码 知识回顾 之前已经利用STM32CubeMX生成过Keil工程和相关初始化代码了,可以去回顾一下,详情见:https://blog.csdn.ne…...

从查重报告入手的精准论文降重秘籍

每个同学在使用论文查重时,为何同一篇文章,可能重复率从10%—30%不等?归根结底还是使用了不同查重系统。其实不同的论文查重与论文AIGC检测系统的算法、数据及模型都不一样,那如何针对这些系统的“个性”精准降重,这篇…...