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

【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()方法。
在这里插入图片描述

相关文章:

【Java面试题】JVM(26道)

文章目录 JVM面试题基础1.什么是JVM&#xff1f;2.JVM的组织架构&#xff1f; 内存管理3.JVM的内存区域是什么&#xff1f;3.1堆3.2方法区3.3程序计数器3.4Java虚拟机栈3.5本地方法栈 4.堆和栈的区别是什么&#xff1f;5.JDK1.6、1.7、1.8内存区域的变化&#xff1f;6.内存泄露…...

(十三)强缓存和协商缓存的区别

一、浏览器的缓存策略 浏览器的缓存策略是指浏览器在加载页面时如何使用和管理缓存机制。可以提高网页加载速度&#xff0c;减轻服务器负载&#xff0c;并提供更好的用户体验。常用的缓存策略有两种&#xff1a;一种是发送请求&#xff08;协商缓存&#xff09;&#xff0c;一…...

如何创建Windows下google Chrome便携版?

创建google Chrome便携版教程 准备工作&#xff1a; 1&#xff0c;下载GoogleChromePortable启动器 2&#xff0c;下载谷歌浏览器 3&#xff0c;下载7-ZIP 解压提取器 用7zip解压GoogleChromePortable&#xff0c;得到GoogleChromePortable.exe启动器 解压谷歌浏览器 用7…...

rabbitmq安装rabbitmq-delayed-message-exchange插件

下载地址&#xff1a;Community Plugins | RabbitMQ 上传到rabbitmq安装目录的/plugins目录下 我的是/usr/lcoal/rabbitmq/plugins/ 直接安装 [rootk8s-node1 rabbitmq]# rabbitmq-plugins enable rabbitmq_delayed_message_exchange [rootk8s-node1 rabbitmq]# rabbitmq-pl…...

B02、分析GC日志-6.3

1、相关GC日志参数 -verbose:gc 输出gc日志信息&#xff0c;默认输出到标准输出-XX:PrintGC 输出GC日志。类似&#xff1a;-verbose:gc-XX:PrintGCDetails 在发生垃圾回收时打印内存回收详细的日志&#xff0c; 并在进程退出时输出当前内存各区域分配情况-XX:PrintGCTimeStamp…...

Redis中的集群(二)

节点 集群数据结构 redisClient结构和clusterLink结构的相同和不同之处 redisClient结构和clusterLink结构都有自己的套接字描述符和输入、输出缓冲区&#xff0c;这两个结构的区别在于&#xff0c;redisClient结构中的套接字和缓冲区是用于连接客户端的&#xff0c;而clust…...

UVA12538 Version Controlled IDE 题解 crope

Version Controlled IDE 传送门 题面翻译 维护一种数据结构&#xff0c;资磁三种操作。 1.在p位置插入一个字符串s 2.从p位置开始删除长度为c的字符串 3.输出第v个历史版本中从p位置开始的长度为c的字符串 1 ≤ n ≤ 50000 1 \leq n \leq 50000 1≤n≤50000&#xff0c;所…...

OAuth2.0客户端和服务端Java实现

oauth2 引言 读了《设计模式之美》和《凤凰架构》架构安全篇之后&#xff0c;决定写一个OAuth2.0的认证流程的Demo&#xff0c;也算是一个阶段性的总结&#xff0c;具体原理实现见《凤凰架构》(架构安全设计篇)。 涉及到的源码可以从https://github.com/WeiXiao-Hyy/oauth2获…...

物流自动分拣系统激光雷达漫反射板

早在二十世纪六十年代&#xff0c;激光器的诞生为激光雷达技术的发展奠定了基础。随后&#xff0c;激光雷达技术开始应用于各种领域&#xff0c;包括军事、航空、地理勘测等。然而&#xff0c;在物流自动分拣领域&#xff0c;激光雷达的应用相对较晚。 随着物流行业的快速发展和…...

2024 抖音欢笑中国年(三):编辑器技巧与实践

前言 本次春节活动中&#xff0c;我们大部分场景使用内部的 SAR Creator互动方案来实现。 SAR Creator 是一款基于 TypeScript 的高性能、轻量化的互动解决方案&#xff0c;目前支持了Web和字节内部跨端框架平台&#xff0c;服务于字节内部的各种互动业务&#xff0c;包括但不限…...

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

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

vue 百度地图 使用 vue-baidu-map 进行当前位置定位和范围展示

vue 百度地图 使用 vue-baidu-map 进行当前位置定位和范围展示&#xff08;考勤打卡&#xff09; 一、创建百度地图账号&#xff0c;获取秘钥二、 引入插件1、安装vue-baidu-map2、在main.js中引入 三、 简单使用 最近写项目的时候&#xff0c;做到了考勤打卡的模块内容&#x…...

使用idea运行程序,发现控制台的中文出现乱码

修改UTF-8发现没有效果&#xff0c;寻找.idea文件夹的encodings.xml文件&#xff0c;将里面的UTF-8全部变成GBK....

基于javassm实现的大学生兼职信息系统

开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&…...

O2OA开发平台如何查看数据表结构?

在访问后端api地址&#xff0c;页面最下方有列示平台的各个服务&#xff0c;点击进入可查看具体的表内容 后端api地址&#xff1a; http://{hostIP}/x_program_center/jest/list.html 其中&#xff1a;{hostIP}为中心服务器所在域名或者IP地址 如下图&#xff1a;...

心理测评性格测试矩阵版h5微信抖音QQ快手小程序app开源版开发

心理测评性格测试矩阵版h5微信抖音QQ快手小程序app开源版开发 支持SAAS、支持独立加密、支持独立开源、价格不同。 自带题库数据&#xff0c;后台一键初始&#xff0c;支持自己上传题目 心理测评 微信公众号微信小程序抖音小程序可打包APP 支持单题、跳跃题、计分题、因子题、…...

【蓝桥杯】十六进制转八进制 C++实现

1.题目信息 时间限制&#xff1a;1.0s 内存限制&#xff1a;512.0MB 问题描述 给定n个十六进制正整数&#xff0c;输出它们对应的八进制数。 输入格式 输入的第一行为一个正整数n &#xff08;1<n<10&#xff09;。 接下来n行&#xff0c;每行一个由09、大写字母AF组成…...

明明设置数字居中对齐,为什么excel的数字却不居中?

有时候在excel里&#xff0c;选中数据&#xff0c;设置对齐方式 左右居中&#xff0c;然而&#xff0c;数字却怎么都不居中&#xff0c;为什么呢&#xff1f; 1.按快捷键Ctrl1&#xff0c;打开单元格自定义格式对话框&#xff0c;看到是初始界面是在数字的会计专用&#xff0c;…...

深入解析API技术:原理、实现与应用

在现代软件开发中&#xff0c;API&#xff08;应用程序接口&#xff09;扮演着至关重要的角色。API 允许不同的软件应用程序和系统之间进行通信和数据交换&#xff0c;从而构建出更加高效、灵活和可扩展的软件解决方案。本文将深入解析API技术的原理、实现方法&#xff0c;并附…...

C语言——数组指针变量

一、什么是数组指针 数组指针变量是指向数组的指针&#xff0c;它可以用来遍历数组元素、进行数组操作以及作为函数参数传递数组等操作。在C语言中&#xff0c;数组名本身就是数组的首地址&#xff0c;因此数组指针可以指向数组的首地址。 数组指针变量的基本形式&#xff1a…...

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

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

【24届数字IC秋招总结】提前批面试经验1——小米、百度昆仑芯、长鑫存储

文章目录 前言一、小米-SOC验证工程师1.1 面试问题二、百度昆仑芯-芯片验证工程师2.1 一面面试问题2.2 二面面试问题三、长鑫存储-数字电路前言 提前批面试公司:小米、百度昆仑芯、长鑫存储 一、小米-SOC验证工程师 面试时间:7.23 周末 1.1 面试问题 1、 问研究生项目,自…...

第7章、ReactRedux 实战 - 登录注册验证;

一、登录注册认证系统课程介绍&#xff1b; 1、基本概念&#xff1b; &#xff1b; 2、代码&#xff1b; 二、搭建前端环境&#xff1b; 1、基本概念&#xff1b; &#xff1b; 2、代码&#xff1b; 三、搭建后端环境&#xff1b; 1、基本概念&#xff1b; &#xff1…...

16路HDMI+AV流媒体IPTV高清编码器JR-3216HD

产品简介&#xff1a; JR-3216HD 16路高清HDMIAV编码器是专业的高清音视频编码产品&#xff0c;该产品具有支持16路高清HDMI音视频采集功能&#xff0c;16路标清AV视频采集功能&#xff0c;16路3.5MM独立外接音频输入&#xff0c;编码输出双码流H.264格式&#xff0c;音频MP3/…...

vscode 配置文件settings.json和c_cpp_properties.json的作用

前言 在 Visual Studio Code (VSCode) 中&#xff0c;settings.json 和 c_cpp_properties.json 都是配置文件&#xff0c;它们分别用于不同的目的。 settings.json settings.json 文件是 VSCode 的用户或工作区设置文件。它允许你自定义 VSCode 的各种行为和外观。 用户设置…...

【postgresql 基础入门】入门教程成形了,八大章节,涵盖库,表,事务,约束,数据类型,聚集函数,轻松入门

Postgresql 基础入门 ​专栏内容&#xff1a; postgresql内核源码分析手写数据库toadb并发编程 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 序言 Postg…...

【计算机毕业设计】人事管理系统——后附源码

&#x1f389;**欢迎来到我的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 一名来自世界500强的资深程序媛&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 在深度学习任务中展现出卓越的能力&#xff0c;包括但不限于…...

OceanBase V4.2 MySQL模式下,如何通过DBLINK实现跨数据源访问

概述 跨数据源访问可通过 DBLINK&#xff08;以下简称DBLINK&#xff09;实现&#xff0c;从而使得业务代码能够像访问本地数据库一样轻松访问远端数据库。原先&#xff0c;DBLINK主要服务于Oracle模式&#xff0c;但由于OceanBase 的MySQL模式租户同样存在访问远端数据库的需…...

再谈C语言——理解指针(一)

内存和地址 内存 在讲内存和地址之前&#xff0c;我们想有个⽣活中的案例&#xff1a; 假设有⼀栋宿舍楼&#xff0c;把你放在楼⾥&#xff0c;楼上有100个房间&#xff0c;但是房间没有编号&#xff0c;你的⼀个朋友来找你玩&#xff0c; 如果想找到你&#xff0c;就得挨个房…...

day21-二叉树part08

235. 二叉搜索树的最近公共祖先 相对于 二叉树的最近公共祖先 本题就简单一些了&#xff0c;因为 可以利用二叉搜索树的特性无需全部遍历。特点&#xff1a;当前节点在p&#xff0c;q节点之前则必为最近公共祖先 class Solution {public TreeNode lowestCommonAncestor(TreeNo…...

如何建淘客网站/网站制作推广

打开idea的Terminal,输入 npm install -g webpack webpack-cli...

哪里找高清图片素材/东莞网站建设优化推广

见字如面&#xff0c;我是军哥&#xff01;话说最近几天又来了一大波读者&#xff0c;有朋友说加我微信提示繁忙&#xff0c;所以军哥必须给解决一下&#xff01;我的朋友圈会发一些公号之外的感悟&#xff0c;比如读者问题问卷调查、趣味抽奖&#xff0c;说实话还挺好玩的&…...

做游戏直播什么游戏视频网站好/2023年5月份病毒感染情况

整理一下python的基本概念和知识, 主要用python3为语法标准. python介绍 一种面向对象的解释性计算机设计语言&#xff0c;具有丰富和强大的库。 python定位&#xff1a;“优雅”、“明确”、“简单”多种应用场景&#xff1a;可以写工具&#xff0c;后台服务&#xff0c;移动端…...

做网站的技术支持/网站排名优化软件哪家好

什么是RDD&#xff1a;RDD叫做分布式数据集&#xff0c;是Spark最基本的数据抽象&#xff0c;代码中是一个抽象类&#xff0c;它代表的是一个不可变、可分区、里面的元素可并行计算的集合。RDD里面封装的是计算逻辑。RDD的属性&#xff1a;1. 一个分区(Partition),即数据集的基…...

网站权重多少4/北京seo优化方案

该项目基于 [基于SSM开发的Java快递代拿系统] 项目全面升级&#xff0c;使用当前最为流行的 SpringBoot 框架&#xff0c;相关技术栈全面更新&#xff01;是您深入学习 SpringBoot 开发的最佳实践&#xff01;相关技术栈前端&#xff1a; Thymeleaf、Bootstrap、Ajax、JQuery开…...

搜索引擎费用/seo优化的技巧

DOM&#xff1a;文档对象模型 --树模型文档&#xff1a;标签文档&#xff0c;对象&#xff1a;文档中每个元素对象&#xff0c;模型&#xff1a;抽象化的东西 一&#xff1a;window&#xff1a; 属性&#xff08;值或者子对象&#xff09;&#xff1a;opener:打开当前窗口的源窗…...