文章目录

    • 一、Java内存区域
      • 1.1 说一下 JVM 的主要组成部分及其作用?
      • 1.2 说一下 JVM 运行时数据区
      • 1.3 深拷贝和浅拷贝
      • 1.4 说一下堆栈的区别?
      • 1.5 队列和栈是什么?有什么区别?
    • 二、HotSpot虚拟机
      • 2.1 对象的创建
      • 2.2 为对象分配内存
      • 2.3 处理并发安全问题
      • 2.4 对象的访问定位
        • 2.4.1 句柄访问
        • 2.4.2 直接指针
      • 2.5 Java会存在内存泄漏吗?请简单描述
    • 三、垃圾收集器
      • 3.1 简述Java垃圾回收机制
      • 3.2 GC是什么?为什么要GC
      • 3.3 垃圾回收的优点和原理,并说出2种回收机制
      • 3.4 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
      • 3.5 Java 中都有哪些引用类型?
      • 3.6 怎么判断对象是否可以被回收?
      • 3.7 在Java中,对象什么时候可以被垃圾回收
      • 3.8 说一下 JVM 有哪些垃圾回收算法?
        • 3.8.1 标记-清除算法
        • 3.8.2 复制算法
        • 3.8.3 标记-整理算法
        • 3.8.4 分代收集算法
      • 3.9 说一下 JVM 有哪些垃圾回收器?
      • 3.10 详细介绍一下 CMS 垃圾回收器?
        • 3.10.1 三色标记算法
      • 3.11 新生代垃圾回收器和老年代垃圾回收器都有哪些?有什么区别?
      • 3.12 介绍一下10种垃圾回收器
        • 3.12.1 Serial收集器
        • 3.12.2 Serial Old收集器
        • 3.12.3 ParNew收集器
        • 3.12.4 Parallel Old
        • 3.12.5 Parallel Scavenge
        • 3.12.6 CMS
        • 3.12.7 G1(Garbage First,物理上不分代,逻辑上分代)
        • 3.12.8 ZGC
        • 3.12.9 Shenandoah
        • 3.12.10 java 11 新的Epsilon垃圾收集器
      • 3.13 简述分代垃圾回收器是怎么工作的?
      • 3.14 堆内存逻辑分区(分代)模型及对象分配逻辑
        • 3.14.1 GC相关的概念
        • 3.14.2 一个对象的生命之旅(对象分配过程)
        • 3.14.3 什么情况下,对象会分配在栈上
        • 3.14.4 对象什么时候进入老年代
        • 3.14.5 对象的分配总结图
        • 3.14.6 JVM参数查看
    • 四、虚拟机类加载机制
      • 4.1 描述一下JVM加载Class文件的原理机制
      • 4.2 什么是类加载器,类加载器有哪些?
      • 4.3 说一下类装载的执行过程?
      • 4.4 什么是双亲委派模型?
    • 五、JVM调优
      • 5.1 说一下 JVM 调优的工具?
      • 5.2 Java虚拟机参数类型
      • 5.3 常用的 JVM 调优的参数都有哪些?

一、Java内存区域

1.1 说一下 JVM 的主要组成部分及其作用?


  JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载)、Execution engine(执行引擎);两个组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。

  • Class loader(类装载):根据给定的全限定名类名(如:java.lang.Object)来装载class文件到Runtime data area中的method area。
  • Execution engine(执行引擎):执行classes中的指令。
  • Native Interface(本地接口):与native libraries交互,是其它编程语言交互的接口。
  • Runtime data area(运行时数据区域):这就是我们常说的JVM的内存。

  作用:首先通过编译器把 Java 代码转换成字节码,类加载器(ClassLoader)再把字节码加载到内存中,将其放在运行时数据区(Runtime data area)的方法区内,而字节码文件只是 JVM 的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),将字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用其他语言的本地库接口(Native Interface)来实现整个程序的功能
  Java程序运行机制步骤
   1>首先利用IDE集成开发工具编写Java源代码,源文件的后缀为.java;
   2>再利用编译器将源代码编译成字节码文件,字节码文件的后缀名为.class;
   3>运行字节码的工作是由解释器(java命令)来完成的。

  从上图可以看,java文件通过编译器变成了.class文件,接下来类加载器又将这些.class文件加载到JVM中。
  其实可以一句话来解释:类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Class对象,用来封装类在方法区内的数据结构。

1.2 说一下 JVM 运行时数据区

  Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存区域划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有些区域随着虚拟机进程的启动而存在,有些区域则是依赖线程的启动和结束而建立和销毁。Java 虚拟机所管理的内存被划分为如下几个区域:

  不同虚拟机的运行时数据区可能略微有所不同,但都会遵从 Java 虚拟机规范, Java 虚拟机规范规定的区域分为以下 5 个部分:

  • 1、程序计数器(Program Counter Register)
     1>作用
      记录当前线程所执行到的字节码的行号。字节码解释器工作的时候就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。
     2>意义
      JVM的多线程是通过线程轮流切换并分配处理器来实现的,对于我们来说的并行事实上一个处理器也只会执行一条线程中的指令。所以,为了保证各线程指令的安全顺利执行,每条线程都有独立的私有的程序计数器
     3>存储内容
      当线程中执行的是一个Java方法时,程序计数器中记录的是正在执行的线程的虚拟机字节码指令的地址。
      当线程中执行的是一个本地方法时,程序计数器中的值为空。
     4>可能出现异常
      此内存区域是唯一一个在JVM上不会发生内存溢出异常(OutOfMemoryError)的区域。
  • 2、Java 虚拟机栈(Java Virtual Machine Stacks)
     1>作用
      描述Java方法执行的内存模型。每个方法在执行的同时都会开辟一段内存区域用于存放方法运行时所需的数据,成为栈帧,一个栈帧包含如:局部变量表、操作数栈、动态链接、方法出口等信息
     2>意义
      JVM是基于栈的,所以每个方法从调用到执行结束,就对应着一个栈帧在虚拟机栈中入栈和出栈的整个过程
     3>存储内容
      局部变量表(编译期可知的各种基本数据类型、引用类型和指向一条字节码指令的returnAddress类型)、操作数栈、动态链接、方法出口等信息。
      值得注意的是:局部变量表所需的内存空间在编译期间完成分配。在方法运行的阶段是不会改变局部变量表的大小的
     4>可能出现的异常
      如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。
      如果在动态扩展内存的时候无法申请到足够的内存,就会抛出OutOfMemoryError异常。
  • 3、本地方法栈(Native Method Stack)
     1>作用
      为JVM所调用到的Nativa即本地方法服务。
     2>可能出现的异常
      和虚拟机栈出现的异常很相像。
  • 4、Java 堆(Java Heap)
     1>作用
    所有线程共享一块内存区域,在虚拟机开启的时候创建。
     2>意义
      1、存储对象实例,更好地分配内存。
      2、垃圾回收(GC)。堆是垃圾收集器管理的主要区域。更好地回收内存。
     3>存储内容
      存放对象实例,几乎所有的对象实例都在这里进行分配。堆可以处于物理上不连续的内存空间,只要逻辑上是连续的就可以。
      值得注意的是:在JIT编译器等技术的发展下,所有对象都在堆上进行分配已变得不那么绝对。有些对象实例也可以分配在栈中。
     4>可能出现的异常
      实现堆可以是固定大小的,也可以通过设置配置文件设置该为可扩展的。 如果堆上没有内存进行分配,并无法进行扩展时,将会抛出OutOfMemoryError异常。
  • 5、方法区(Methed Area)
     1>作用
      用于存储运行时常量池、已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
     2>意义
      对运行时常量池、常量、静态变量等数据做出了规定。
     3>存储内容
      运行时常量池(具有动态性)、已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
     4>可能出现的异常
      当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。

1.3 深拷贝和浅拷贝

  浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址,
  深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存,
  使用深拷贝的情况下,释放内存的时候不会因为出现浅拷贝时释放同一个内存的错误。
  浅复制:仅仅是指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会相应的改变。
  深复制:在计算机中开辟一块新的内存地址用于存放复制的对象。

1.4 说一下堆栈的区别?

  • 1、物理地址
      堆的物理地址分配对对象是不连续的,因此性能慢些
      栈使用的是数据结构中的栈,先进后出的原则,物理地址分配是连续的,所以性能快
  • 2、内存分别
      堆因为是不连续的,所以分配的内存是在运行期确认的,因此大小不固定一般堆大小远远大于栈
      栈是连续的,所以分配的内存大小要在编译期就确认,大小是固定的
  • 3、存放的内容
      堆存放的是对象的实例和数组。因此该区更关注的是数据的存储。
      栈存放:局部变量,操作数栈,返回结果。该区更关注的是程序方法的执行。
      PS:静态变量放在方法区,静态的对象还是放在堆。
  • 4、程序的可见度
      堆对于整个应用程序都是共享、可见的
      栈只对于线程是可见的。所以也是线程私有,他的生命周期和线程相同

1.5 队列和栈是什么?有什么区别?

  队列和栈都是被用来预存储数据的。
  操作的名称不同。队列的插入称为入队,队列的删除称为出队。栈的插入称为进栈,栈的删除称为出栈。
  可操作的方式不同。队列是在队尾入队,队头出队,即两边都可操作。而栈的进栈和出栈都是在栈顶进行的,无法对栈底直接进行操作。
  操作的方法不同。队列是先进先出(FIFO),即队列的修改是依先进先出的原则进行的。新来的成员总是加入队尾(不能从中间插入),每次离开的成员总是队列头上(不允许中途离队)。而栈为后进先出(LIFO),即每次删除(出栈)的总是当前栈中最新的元素,即最后插入(进栈)的元素,而最先插入的被放在栈的底部,要到最后才能删除。

二、HotSpot虚拟机

2.1 对象的创建

  Java 中提供的几种对象创建方式:

方式解释
使用new关键字调用了构造函数
使用Class的newInstance方法调用了构造函数
使用Constructor类的newInstance方法调用了构造函数
使用clone方法没有调用构造函数
使用反序列化没有调用构造函数

  下面是对象创建的主要流程:

  虚拟机遇到一条new指令时,先检查常量池是否已经加载相应的类,如果没有,必须先执行相应的类加载。类加载通过后,接下来分配内存。若Java堆中内存是绝对规整的,使用“指针碰撞“方式分配内存;如果不是规整的,就从空闲列表中分配,叫做”空闲列表“方式。划分内存时还需要考虑一个问题-并发,也有两种方式: CAS同步处理,或者本地线程分配缓冲(Thread Local Allocation Buffer, TLAB)。然后内存空间初始化操作,接着是做一些必要的对象设置(元信息、哈希码…),最后执行方法。

2.2 为对象分配内存

  类加载完成后,接着会在Java堆中划分一块内存分配给对象。内存分配根据Java堆是否规整,有两种方式:

  • 指针碰撞:如果Java堆的内存是规整,即所有用过的内存放在一边,而空闲的的放在另一边。分配内存时将位于中间的指针指示器向空闲的内存移动一段与对象大小相等的距离,这样便完成分配内存工作。
  • 空闲列表:如果Java堆的内存不是规整的,则需要由虚拟机维护一个列表来记录那些内存是可用的,这样在分配的时候可以从列表中查询到足够大的内存分配给对象,并在分配后更新列表记录。
      选择哪种分配方式是由 Java 堆是否规整来决定的,而 Java 堆是否规整又由所采用的垃圾收集器是否带有压缩整理功能决定。

2.3 处理并发安全问题

  对象的创建在虚拟机中是一个非常频繁的行为,哪怕只是修改一个指针所指向的位置,在并发情况下也是不安全的,可能出现正在给对象 A 分配内存,指针还没来得及修改,对象 B 又同时使用了原来的指针来分配内存的情况。解决这个问题有两种方案:

  • 对分配内存空间的动作进行同步处理(采用 CAS + 失败重试来保障更新操作的原子性);
  • 把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在 Java 堆中预先分配一小块内存,称为本地线程分配缓冲(Thread Local Allocation Buffer, TLAB)。哪个线程要分配内存,就在哪个线程的 TLAB 上分配。只有 TLAB 用完并分配新的 TLAB 时,才需要同步锁。通过-XX:+/-UserTLAB参数来设定虚拟机是否使用TLAB。

2.4 对象的访问定位

  Java程序需要通过 JVM 栈上的引用访问堆中的具体对象。对象的访问方式取决于 JVM 虚拟机的实现。目前主流的访问方式有 句柄 和 直接指针 两种方式。

指针: 指向对象,代表一个对象在内存中的起始地址。
句柄: 可以理解为指向指针的指针,维护着对象的指针。句柄不直接指向对象,而是指向对象的指针(句柄不发生变化,指向固定内存地址),再由对象的指针指向对象的真实内存地址。

2.4.1 句柄访问

  Java堆中划分出一块内存来作为句柄池,引用中存储对象的句柄地址,而句柄中包含了对象实例数据与对象类型数据各自的具体地址信息,具体构造如下图所示:

  优势:引用中存储的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而引用本身不需要修改。

2.4.2 直接指针

  如果使用直接指针访问,引用 中存储的直接就是对象地址,那么Java堆对象内部的布局中就必须考虑如何放置访问类型数据的相关信息。

  优势:速度更快,节省了一次指针定位的时间开销。由于对象的访问在Java中非常频繁,因此这类开销积少成多后也是非常可观的执行成本。HotSpot 中采用的就是这种方式。

2.5 Java会存在内存泄漏吗?请简单描述

  内存泄漏是指不再被使用的对象或者变量一直被占据在内存中。理论上来说,Java是有GC垃圾回收机制的,也就是说,不再被使用的对象,会被GC自动回收掉,自动从内存中清除。
  但是,即使这样,Java也还是存在着内存泄漏的情况,java导致内存泄露的原因很明确:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景。

三、垃圾收集器

3.1 简述Java垃圾回收机制

  在java中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。在JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫面那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。

3.2 GC是什么?为什么要GC

  GC 是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java 提供的 GC 功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java 语言没有提供释放已分配内存的显示操作方法。

3.3 垃圾回收的优点和原理,并说出2种回收机制

  java语言最显著的特点就是引入了垃圾回收机制,它使java程序员在编写程序时不再考虑内存管理的问题。
  由于有这个垃圾回收机制,java中的对象不再有“作用域”的概念,只有引用的对象才有“作用域”。
  垃圾回收机制有效的防止了内存泄露,可以有效的使用可使用的内存。
  垃圾回收器通常作为一个单独的低级别的线程运行,在不可预知的情况下对内存堆中已经死亡的或很长时间没有用过的对象进行清除和回收。
  程序员不能实时的对某个对象或所有对象调用垃圾回收器进行垃圾回收。
  垃圾回收有分代复制垃圾回收、标记垃圾回收、增量垃圾回收。

3.4 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?

  对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。
  通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。
  可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。

3.5 Java 中都有哪些引用类型?

  • 强引用:发生 gc 的时候不会被回收。
  • 软引用:有用但不是必须的对象,在发生内存溢出之前会被回收。
  • 弱引用:有用但不是必须的对象,在下一次GC时会被回收。
  • 虚引用(幽灵引用/幻影引用):无法通过虚引用获得对象,用 PhantomReference 实现虚引用,虚引用的用途是在 gc 时返回一个通知。

3.6 怎么判断对象是否可以被回收?

  垃圾收集器在做垃圾回收的时候,首先需要判定的就是哪些内存是需要被回收的,哪些对象是「存活」的,是不可以被回收的;哪些对象已经「死掉」了,需要被回收。
  一般有两种方法来判断:
   1>引用计数器法:为每个对象创建一个引用计数,有对象引用时计数器 +1,引用被释放时计数 -1,当计数器为 0 时就可以被回收。它有一个缺点不能解决循环引用的问题;同时,这种方式一方面无法区分软、虛、弱、强引用类别。
   2>可达性分析算法:这个算法的基本思路是通过一系列的称为“GC Root”的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连(即从GC Roots到这个对象不可达)时,则证明该对象是不可用的。
    Java中,可作为GC Roots的对象包括下面几种:
     1>虚拟机栈(栈帧中的本地变量表)中引用的对象;
     2>方法区中静态属性引用的对象;
     3>方法区中常量引用的对象;
     4>本地方法栈中的JNI(即Native方法)引用的对象。

3.7 在Java中,对象什么时候可以被垃圾回收

  当对象对当前使用这个对象的应用程序变得不可触及的时候,这个对象就可以被回收了。
  垃圾回收不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃圾回收(Full GC)。如果你仔细查看垃圾收集器的输出信息,就会发现永久代也是被回收的。这就是为什么正确的永久代大小对避免Full GC是非常重要的原因。

3.8 说一下 JVM 有哪些垃圾回收算法?

  • 标记-清除算法:标记无用对象,然后进行清除回收。缺点:效率不高,无法清除垃圾碎片。
  • 复制算法:按照容量划分二个大小相等的内存区域,当一块用完的时候将活着的对象复制到另一块上,然后再把已使用的内存空间一次清理掉。缺点:内存使用率不高,只有原来的一半。
  • 标记-整理算法:标记无用对象,让所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存。
  • 分代算法:根据对象存活周期的不同将内存划分为几块,一般是新生代和老年代,新生代基本采用复制算法,老年代采用标记整理算法。

3.8.1 标记-清除算法

  标记无用对象,然后进行清除回收。
  标记-清除算法(Mark-Sweep)是一种常见的基础垃圾收集算法,它将垃圾收集分为两个阶段:
   1>标记阶段:标记出可以回收的对象。
   2>清除阶段:回收被标记的对象所占用的空间。
  标记-清除算法之所以是基础的,是因为后面讲到的垃圾收集算法都是在此算法的基础上进行改进的。
  优点:实现简单,不需要对象进行移动。
  缺点:标记、清除过程效率低,产生大量不连续的内存碎片,提高了垃圾回收的频率。
  标记-清除算法的执行的过程如下图所示:

3.8.2 复制算法

  为了解决标记-清除算法的效率不高的问题,产生了复制算法。它把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾收集时,遍历当前使用的区域,把存活对象复制到另外一个区域中,最后将当前使用的区域的可回收的对象进行回收。
  优点:按顺序分配内存即可,实现简单、运行高效,不用考虑内存碎片。
  缺点:可用的内存大小缩小为原来的一半,对象存活率高时会频繁进行复制
  复制算法的执行过程如下图所示:

3.8.3 标记-整理算法

  在新生代中可以使用复制算法,但是在老年代就不能选择复制算法了,因为老年代的对象存活率会较高,这样会有较多的复制操作,导致效率变低。标记-清除算法可以应用在老年代中,但是它效率不高,在内存回收后容易产生大量内存碎片。因此就出现了一种标记-整理算法(Mark-Compact)算法,与标记-整理算法不同的是,在标记可回收的对象后将所有存活的对象压缩到内存的一端,使他们紧凑的排列在一起,然后对端边界以外的内存进行回收。回收后,已用和未用的内存都各自一边。
  优点:解决了标记-清理算法存在的内存碎片问题。
  缺点:仍需要进行局部对象移动,一定程度上降低了效率
  标记-整理算法的执行过程如下图所示:

3.8.4 分代收集算法

  当前商业虚拟机都采用分代收集的垃圾收集算法。分代收集算法,顾名思义是根据对象的存活周期将内存划分为几块。一般包括年轻代、老年代 和 永久代,如图所示:

3.9 说一下 JVM 有哪些垃圾回收器?

  如果说垃圾收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。下图展示了7种作用于不同分代的收集器,其中用于回收新生代的收集器包括Serial、PraNew、Parallel Scavenge,回收老年代的收集器包括Serial Old、Parallel Old、CMS,还有用于回收整个Java堆的G1收集器。不同收集器之间的连线表示它们可以搭配使用。

  • Serial收集器(复制算法): 新生代单线程收集器,标记和清理都是单线程,优点是简单高效;
  • ParNew收集器 (复制算法): 新生代收并行集器,实际上是Serial收集器的多线程版本,在多核CPU环境下有着比Serial更好的表现;
  • Parallel Scavenge收集器 (复制算法): 新生代并行收集器,追求高吞吐量,高效利用 CPU。吞吐量 = 用户线程时间/(用户线程时间+GC线程时间),高吞吐量可以高效率的利用CPU时间,尽快完成程序的运算任务,适合后台应用等对交互相应要求不高的场景;
  • Serial Old收集器 (标记-整理算法): 老年代单线程收集器,Serial收集器的老年代版本;
    Parallel Old收集器 (标记-整理算法): 老年代并行收集器,吞吐量优先,Parallel Scavenge收集器的老年代版本;
  • CMS(Concurrent Mark Sweep)收集器(标记-清除算法): 老年代并行收集器,以获取最短回收停顿时间为目标的收集器,具有高并发、低停顿的特点,追求最短GC回收停顿时间。
  • G1(Garbage First)收集器 (标记-整理算法): Java堆并行收集器,G1收集器是JDK1.7提供的一个新收集器,G1收集器基于“标记-整理”算法实现,也就是说不会产生内存碎片。此外,G1收集器不同于之前的收集器的一个重要特点是:G1回收的范围是整个Java堆(包括新生代,老年代),而前六种收集器回收的范围仅限于新生代或老年代。

3.10 详细介绍一下 CMS 垃圾回收器?

  CMS 是英文 Concurrent Mark-Sweep 的简称,是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。在启动 JVM 的参数加上“-XX:+UseConcMarkSweepGC”来指定使用 CMS 垃圾回收器。
  CMS 使用的是标记-清除的算法实现的,所以在 gc 的时候回产生大量的内存碎片,当剩余内存不能满足程序运行要求时,系统将会出现 Concurrent Mode Failure,临时 CMS 会采用 Serial Old 回收器进行垃圾清除,此时的性能将会被降低。

3.10.1 三色标记算法

  将对象分成三种类型:
   1、黑色:跟对象,或该对象与它的子对象都被扫描过(对象被标记了,且它的所有field也被标记完了)
   2、灰色:对象本身被扫描,但还没扫描完该对象中的子对象(它的field还没有被标记或标记完)
   3、白色,未被扫描对象,扫描完所有对象之后,最终为白色的为不可达对象,即垃圾对象(对象没有被标记到)
  三色标记会产生两种问题:错标和漏标:

  • 1、错标

      在该情况中,D不是垃圾,但也会被清除掉。
      CMS的解决方案是Incremental Update,对应到上面的例子中,就是把A重新标记成灰色。
  • 2、漏标
      Incremental Update会产生漏标,如下图所示,解决方法是重新标记一遍。

3.11 新生代垃圾回收器和老年代垃圾回收器都有哪些?有什么区别?

  新生代回收器:Serial、ParNew、Parallel Scavenge
  老年代回收器:Serial Old、Parallel Old、CMS
  整堆回收器:G1
  新生代垃圾回收器一般采用的是复制算法,复制算法的优点是效率高,缺点是内存利用率低;老年代回收器一般采用的是标记-整理的算法进行垃圾回收。

3.12 介绍一下10种垃圾回收器

  先看图:

3.12.1 Serial收集器

  Serial(串行)垃圾收集器是最基本、发展历史最悠久的收集器;
  JDK1.3.1前是HotSpot新生代收集的唯一选择;
  Serial收集器到JDK1.7为止,它依然是JAVA虚拟机运行在Client模式下的默认新生代收集器。它也有着优于其他收集器的地方:简单而高效(与其他收集器的单线程比),对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。在用户的桌面应用场景中,分配给虚拟机管理的内存一般来说不会很大,收集几十兆甚至一两百兆的新生代(仅仅是新生代使用的内存,桌面应用基本上不会再大了),停顿时间完全可以控制在几十毫秒最多一百多毫秒以内,只要不是频繁发生,这点停顿是可以接受的。所以,Serial收集器对于运行在来说是一个很好的选择。
  Serial收集器 运行示意图如下:

  stw : stop-the-word 停所有工作线程;
  该回收器使用复制算法,,随着内存越来越大,执行效率太慢了,单线程就没法使用了 后面就有了多线程的版本- ParNew收集器。

3.12.2 Serial Old收集器

  Serial Old 和Serial 相比就是应用在老年代的垃圾收集器,也是单线程,但是算法不是copy,而是Mark-Compact 标记整理算法,也是stw:暂停所有线程进行垃圾回收;
  所以 Serial 和Serial Old 组合使用,可用内存一般不大(几十M至一两百M)的服务器环境中,不适合当前的大内存了 。

3.12.3 ParNew收集器

  ParNew垃圾收集器是Serial收集器的改进多线程版本(因为内存的不断增大),除了多线程外,其余的行为、特点和Serial收集器一样,实现算法跟Serial完全一样(copy算法),也是stw下执行;
  但是如果CPU数量为1个或者少于4个时,该种收集器的性能并不会比Serial要好。因为除去上下文切换,以及占用用户线程CPU时间片,导致用户线程被拖慢
  在Server模式下,ParNew收集器是一个非常重要的收集器,因为除Serial外,目前只有它能与CMS收集器配合工作;CMS是HotSpot在JDK1.5推出的第一款真正意义上的并发(Concurrent)收集器,第一次实现了让垃圾收集线程与用户线程(基本上)同时工作;
   1 ) CMS作为老年代收集器,但却无法与JDK1.4已经存在的新生代收集器Parallel Scavenge配合工作;
   2) 因为Parallel Scavenge(以及G1)都没有使用传统的GC收集器代码框架,而另外独立实现;而其余几种收集器则共用了部分的框架代码;
  设置参数:
   “-XX:+UseConcMarkSweepGC”:指定使用CMS后,会默认使用ParNew作为新生代收集器;
   “-XX:+UseParNewGC”:强制指定使用ParNew;
   “-XX:ParallelGCThreads”:指定垃圾收集的线程数量,ParNew默认开启的收集线程与CPU的数量。

3.12.4 Parallel Old

  JDK1.8默认用的是Parallel Scavenge(新生代)+ Parallel Old(老年代)
  这个是Serial Old的多线程版本,应用在老年代的收集器,也是标记-整理算法,并且是stw的执行收集。但是如果CPU数量少的话性能一样不好。但是现在无论是PC还是server CPU数量都不再是性能瓶颈限制了,所以目前它跟Parallel Scavenge的配合是吞吐量优先场景的优先收集器选择。

3.12.5 Parallel Scavenge

  一种新生代垃圾收集器,与 ParNew相比不可以与cms一起组合使用,PS也是复制算法,它与前两种收集器最大的区别是,它关注的是吞吐量而不是延迟。也被称为是吞吐量优先的收集器。其中,吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)。
  主要使用场景:主要适合在后台运算而不是太多交互的任务,高吞吐量则可以最高效率的利用CPU时间,尽快的完成程序的运算任务。当然,如果想要降低停顿时间,相应的也会影响吞吐量。

3.12.6 CMS

  CMS,Concurrent Mark Sweep,这是第一款真正的并发收集器,就是在线程执行过程中也可以进行垃圾收集的收集器,在一些对响应时间有很高要求的应用或网站中,用户程序不能有长时间的停顿,CMS 可以用于此场景。 分为四个过程 :
   1、初始标记 ,标记跟对象
   2、并发标记,最耗时间的阶段,寻找与标记要回收的对象。并发标记一般会产生一些问题,如:1>漏标,某些未标记的对象在后续运行过程中变成了垃圾对象,这种会产生浮动垃圾;2>错标,某些标记的对象,后来又有引用了。此处采用的是三色标记算法。
   3、重新标记,用于处理错标的遗憾。
   4、并发清理。
  CMS执行流程图:

  CMS会产生碎片化的内存空间。CMS采用了多种方式尽可能降低GC的暂停时间,减少用户程序停顿。停顿时间降低的同时牺牲了CPU吞吐量 。因为并发情况占用大量cpu资源,这是在停顿时间和性能间做出的取舍,可以简单理解为"空间(性能)"换时间,CMS 是一个承前启后的收集器,下面是不分代收集器。

3.12.7 G1(Garbage First,物理上不分代,逻辑上分代)

  在JDK7就已加入JVM的收集器大家庭中,成为HotSpot重点发展的垃圾回收技术。同优秀的CMS垃圾回收器一样,G1也是关注最小时延的垃圾回收器,也同样适合大尺寸堆内存的垃圾收集,官方也推荐使用G1来代替选择CMS。G1最大的特点是引入分区的思路,弱化了分代的概念,合理利用垃圾收集各个周期的资源,解决了其他收集器甚至CMS的众多缺陷。
  G1收集器,是比前面的更优秀,真正有突破的一款垃圾收集器。其实在G1中还是保留了分代的概念,但是实际上已经在新生代和老年代中没有物理隔离了。在G1中,内存空间被分割成一个个的Region区,所谓新生代和老年代,都是由一个个region组成的。同时G1也不需要跟别的收集器一起配合使用,自己就可以搞定所有内存区域。整体上来讲不是一个分代收集器,是一个通吃收集器。这也是JVM内存管理和垃圾收集的一个发展趋势。从后面zgc中我们可以更清晰的看到这个变化。
  G1采用了标记-整理算法,避免了CMS中的内存碎片问题,另外它能达到可控的垃圾时间。是一款优秀的收集器。即便如此,从2004年第一篇论文发表到真正商用推出,也是到了jdk1.7。实现上并不是那么容易的。
  G1的工作过程:
   1、初始标记:这个过程跟CMS第一个过程差不多,只是标记一下GC Root关联的对象。
   2、并发标记:这个过程时间比较久,分析GC Root到所有对象的可达性分析。如果从GC Root节点开始遍历所有对象会比较耗时,实际上JVM也不是这么做的。JVM是使用Remembered Set保存了对象引用的调用信息,在可达性分析的时候只需要同时遍历remembered set就好了,不需要从根节点开始挨个遍历。
   3、最终标记:由于并发标记阶段,用户线程仍然在工作,会对标记产生一些偏差,这时候需要通过remembered set log来记录这些改变,在这个阶段将改变合并到remembered set中。完成最终标记。
   4、筛选清除:通过标记整理的算法,根据用户配置的回收时间,和维护的优先级列表,优先收集价值最大的region。收集阶段是基于标记-整理和复制算法实现 。

3.12.8 ZGC

  zgc是jdk11中要发布的最新垃圾收集器。完全没有分代的概念,先说下它的优点吧,官方给出的是无碎片,时间可控,超大堆。 Z Garbage Collector,即ZGC,是一个可伸缩的、低延迟的垃圾收集器,主要为了满足如下目标进行设计:

  • 停顿时间不会超过10ms
  • 停顿时间不会随着堆的增大而增大(不管多大的堆都能保持在10ms以下)
  • 可支持几百M,甚至几T的堆大小(最大支持4T)

  ZGC为什么可以这么优秀,主要是因为以下几个特性:
   1、Concurrent
    ZGC只有短暂的STW,大部分的过程都是和应用线程并发执行,比如最耗时的并发标记和并发移动过程。
   2、Region-based
    ZGC中没有新生代和老年代的概念,只有一块一块的内存区域page,以page单位进行对象的分配和回收。
   3、Compacting
    每次进行GC时,都会对page进行压缩操作,所以完全避免了CMS算法中的碎片化问题。
   4、NUMA-aware
    现在多CPU插槽的服务器都是Numa架构,比如两颗CPU插槽(24核),64G内存的服务器,那其中一颗CPU上的12个核,访问从属于它的32G本地内存,要比访问另外32G远端内存要快得多。
ZGC默认支持NUMA架构,在创建对象时,根据当前线程在哪个CPU执行,优先在靠近这个CPU的内存进行分配,这样可以显著的提高性能,在SPEC JBB 2005 基准测试里获得40%的提升。
   5、Using colored pointers
    和以往的标记算法比较不同,CMS和G1会在对象的对象头进行标记,而ZGC是标记对象的指针。

其中低42位对象的地址,42-45位用来做指标标记。
   6、Using load barriers
    因为在标记和移动过程中,GC线程和应用线程是并发执行的,所以存在这种情况:对象A内部的引用所指的对象B在标记或者移动状态,为了保证应用线程拿到的B对象是对的,那么在读取B的指针时会经过一个 “load barriers” 读屏障,这个屏障可以保证在执行GC时,数据读取的正确性。

3.12.9 Shenandoah

  Shenandoah是一款concurrent及parallel的垃圾收集器;跟ZGC一样也是面向low-pause-time的垃圾收集器,不过ZGC是基于colored pointers来实现,而Shenandoah GC是基于brooks pointers来实现。
  其实低停顿的GC,业界早就出现,只不过Java比较晚。
  Azul的Zing中C4 GC 土豪选择,oracle中的HotSpot ZGC JDK11的选择。
Epsilon

3.12.10 java 11 新的Epsilon垃圾收集器

  Epsilon(A No-Op Garbage Collector)垃圾回收器控制内存分配,但是不执行任何垃圾回收工作。一旦java的堆被耗尽,jvm就直接关闭。设计的目的是提供一个完全消极的GC实现,分配有限的内存分配,最大限度降低消费内存占用量和内存吞吐时的延迟时间。一个好的实现是隔离代码变化,不影响其他GC,最小限度的改变其他的JVM代码。
  各个收集器的组合流程图:

  常用的垃圾回收器组合有三种:Serial和Serial Old、CMS和ParNew、Parallel Scavenge和Parallel Old。
  Serial使用较少,因为随着内存越来越大,执行效率太慢。

3.13 简述分代垃圾回收器是怎么工作的?

  分代回收器有两个分区:老生代和新生代,新生代默认的空间占比总空间的 1/3,老生代的默认占比是 2/3。
  新生代使用的是复制算法,新生代里有 3 个分区:Eden、To Survivor、From Survivor,它们的默认占比是 8:1:1,它的执行流程如下:
   1>把 Eden + From Survivor 存活的对象放入 To Survivor 区;
   1>清空 Eden 和 From Survivor 分区;
   1>From Survivor 和 To Survivor 分区交换,From Survivor 变 To Survivor,To Survivor 变 From Survivor。
  每次在 From Survivor 到 To Survivor 移动时都存活的对象,年龄就 +1,当年龄到达 15(默认配置是 15)时,升级为老生代。大对象也会直接进入老生代。
  老生代当空间占用到达某个值之后就会触发全局垃圾收回,一般使用标记整理的执行算法。以上这些循环往复就构成了整个分代垃圾回收的整体执行流程。

3.14 堆内存逻辑分区(分代)模型及对象分配逻辑

  堆内存主要分为两大块: 新生代和老年代:

  • 1、新生代/年轻代 new/young
      新生代又分为三块:1.Eden;2.Survivor-S1;3.Survivor-S2。
      S1和S2一般一起聊,也有人把他俩叫做S0和S1,或者from和to,都一个意思,就是两块survivor区。
  • 2、老年代 Old

  参考一下分代的简单图示,现在JDK1.8的NewRatio=2,即老年代/新生代=2:

3.14.1 GC相关的概念

  • MinorGC/YGC,新生代空间耗尽时触发
  • MajorGC/FullGC/FGC,老年代无法继续分配空间时触发,新生代和老年代同时进行回收,比较慢,重量级。
  • 一般垃圾回收的过程:
      1、YGC回收之后,Eden中大多数的对象会被回收,活着的进入s0
      2、再次YGC,活着的对象eden + s0 -> s1
      3、再次YGC,eden + s1 -> s0
      4、年龄足够 -> 老年代 (15 CMS 6)
      5、s区装不下 -> 老年代
      6、老年代满了FGC Full GC
  • JVM调优指什么?GC Tuning (Generation)
      尽量减少FGC
      减少STW时间
      MinorGC = YGC
      MajorGC = FGC

3.14.2 一个对象的生命之旅(对象分配过程)

  一个对象产生时,首先尝试在栈上分配,如果符合条件 分配在栈了,当方法结束时栈弹出,对象就终结了;
  如果没在栈上分配,就判断对象,如果特别大直接进入Old区,否则的话就分配至Eden区(TLAB也属于Eden区);
  如果进入Eden区:
  经过一次GC后.Eden区中的存活对象进入S1;
  每次GC,会把S1的存活对象扔进S2,S2的存活对象扔进S1,每换个区对象的年龄+1;
  多次垃圾回收后,对象的年龄到了,就进入Old区.

3.14.3 什么情况下,对象会分配在栈上

  直接分配在Eden区的话,会存在多线程的竞争,效率较低。为了提高效率,减少多线程的竞争,会优先考虑分配在栈上和TLAB上。

  • 1、栈上分配
      线程私有小对象
      没有逃逸,只在某段代码(比如在某个方法内部)中使用
      支持标量替换(简单地说,就是用标量替换聚合量。这样做的好处是如果创建的对象并未用到其中的全部变量,则可以节省一定的内存。标量是指不可分割的量,如java中基本数据类型和reference类型,相对的一个数据可以继续分解,称为聚合量;如果把一个对象拆散,将其成员变量恢复到基本类型来访问就叫做标量替换),这个对象可以用几个简单的变量替换

无需调整
多线程没有竞争
方法结束,栈弹出,对象直接拜拜了,不用GC回收

  • 2、线程本地分配TLAB(Thread Local Allocation Buffer)
      如果栈空间不够了,会优先分配在TLAB
      占用Eden,默认是Eden的1%
      小对象

无需调整
多线程没有竞争,或者竞争很少

3.14.4 对象什么时候进入老年代

  其实都跟年龄有关:

  • 1、age超过-XX:MaxTenuringThreshold指定次数(TGC)
      对象头,markword里面,GC age标识位占用4位,所以对象的年龄最大为15
      Parallel Scavenge 阈值 15
      CMS 6
      G1 15
  • 2、动态年龄(不重要)
      假设有次的YGC是Eden&S1->S2,如果S2中的存活对象超过了S2空间的一半,就把S2中年龄最大的对象放入老年代
  • 3、分配担保(不重要)
      YGC期间 survivor区空间不够了 空间担保直接进入老年代

3.14.5 对象的分配总结图

3.14.6 JVM参数查看

  JVM的参数分为三种:

  • 标准参数,-开头的参数, 所有版本JDK都支持,直接输入java 查看
  • 非标准参数, -X开头的参数,输入java -X 查看
  • 不稳定参数 -XX:(+/-), 每个版本可能不同, java -XX:+PrintFlagsFinal 查看,特别多,几百个

四、虚拟机类加载机制

4.1 描述一下JVM加载Class文件的原理机制

  Java中的所有类,都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类,而它的工作就是把class文件从硬盘读取到内存中。在写程序的时候,我们几乎不需要关心类的加载,因为这些都是隐式装载的,除非我们有特殊的用法,像是反射,就需要显式的加载所需要的类。
  类装载方式,有两种 :
   1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中,
   2.显式装载, 通过class.forname()等方法,显式加载需要的类
  Java类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是基类)完全加载到jvm中,至于其他类,则在需要的时候才加载。这当然就是为了节省内存开销。

4.2 什么是类加载器,类加载器有哪些?

  实现通过类的权限定名获取该类的二进制字节流的代码块叫做类加载器。
  主要有一下四种类加载器:
   启动类加载器(Bootstrap ClassLoader)用来加载java核心类库,无法被java程序直接引用。
   扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
   系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader()来获取它。
   用户自定义类加载器,通过继承 java.lang.ClassLoader类的方式实现。

4.3 说一下类装载的执行过程?

  类装载分为以下 5 个步骤:
   加载:根据查找路径找到相应的 class 文件然后导入;
   验证:检查加载的 class 文件的正确性;
   准备:给类中的静态变量分配内存空间;
   解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解为一个标示,而在直接引用直接指向内存中的地址;
   初始化:对静态变量和静态代码块执行初始化工作。

4.4 什么是双亲委派模型?

  在介绍双亲委派模型之前先说下类加载器。对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立在 JVM 中的唯一性,每一个类加载器,都有一个独立的类名称空间。类加载器就是根据指定全限定名称将 class 文件加载到 JVM 内存,然后再转化为 class 对象。

  双亲委派模型:如果一个类加载器收到了类加载的请求,它首先不会自己去加载这个类,而是把这个请求委派给父类加载器去完成,每一层的类加载器都是如此,这样所有的加载请求都会被传送到顶层的启动类加载器中,只有当父加载无法完成加载请求(它的搜索范围中没找到所需的类)时,子加载器才会尝试去加载类。
  当一个类收到了类加载请求时,不会自己先去加载这个类,而是将其委派给父类,由父类去加载,如果此时父类不能加载,反馈给子类,由子类去完成类的加载。

五、JVM调优

5.1 说一下 JVM 调优的工具?

  JDK 自带了很多监控工具,都位于 JDK 的 bin 目录下,其中最常用的是 jconsole 和 jvisualvm 这两款视图监控工具。
  jconsole:用于对 JVM 中的内存、线程和类等进行监控;
  jvisualvm:JDK 自带的全能分析工具,可以分析:内存快照、线程快照、程序死锁、监控内存的变化、gc 变化等。

5.2 Java虚拟机参数类型

  有三种,如图:

5.3 常用的 JVM 调优的参数都有哪些?

  -Xms2g:初始化推大小为 2g;
  -Xmx2g:堆最大内存为 2g;
  -XX:NewRatio=4:设置年轻的和老年代的内存比例为 1:4;
  -XX:SurvivorRatio=8:设置新生代 Eden 和 Survivor 比例为 8:2;
  –XX:+UseParNewGC:指定使用 ParNew + Serial Old 垃圾回收器组合;
  -XX:+UseParallelOldGC:指定使用 ParNew + ParNew Old 垃圾回收器组合;
  -XX:+UseConcMarkSweepGC:指定使用 CMS + Serial Old 垃圾回收器组合;
  -XX:+PrintGC:开启打印 gc 信息;
  -XX:+PrintGCDetails:打印 gc 详细信息。

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

相关文章

  1. PE结构

    PE结构的各部分 DOS首部 DOS首部并不是一个文件的开始,但它指向PE真正的文件头 IMAGE_DOS_HEADER STRUCT { 0h WORD //Magic DOS signature MZ DOS可执行文件标记 (开始标志4D 5A) 2h WORD //Bytes on last page of file 4h WORD //Pages in…...

    2024/3/23 13:15:12
  2. 图的最短路径-STL版

    输入 第一行输入t,表示有t个测试实例 第二行输入顶点数n和n个顶点信息 第三行起,每行输入邻接矩阵的一行,以此类推输入n行 第i个结点与其它结点如果相连则为距离,无连接则为0,数据之间用空格隔开。 第四行输入v0&#…...

    2024/4/23 1:49:45
  3. 阿里技术专家23天纯手撸笔记,演绎最新“Kafka部署实战”,开源,限时白嫖

    导言 我们知道,当下流行的MQ非常多,不过很多公司在技术选型上还是选择使用Kafka。与其他主流MQ进行对比,我们会发现Kafka最大的优点就是吞吐量高。实际上Kafka是高吞吐低延迟的高并发、高性能的消息中间件,配置良好的Kafka集群甚…...

    2024/4/23 10:29:40
  4. 记录一次增加硬件导致网卡报Failed to start LSB Bring updown networking.解决过程

    记录一次增加硬件导致网卡报Failed to start LSB: Bring up/down networking.解决过程 增加配置导致ens33网卡和docker0 无法正常启动 [rootserver1 ~]# ifconfig lo: flags73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0inet6 ::1 prefixlen…...

    2024/4/24 19:22:50
  5. Pytorch nn.RNN模块的输入维度

    输入数据的维度 最近复习RNN记录一下 一般CNN的输入形状为&#xff1a; <[batch_size(一次性运算的个数), channels(通道数), height(行数,或者说图片的高), width(列数,或者说图片的宽)]> 一般RNN的输入形状为&#xff1a; <[seq_len(序列的长度,或者说时间的步…...

    2024/4/24 19:22:47
  6. 【Codeforces 739B】Alyona and a tree | dsu on a tree、 倍增、二分、树上差分、一题多解

    题目链接&#xff1a;https://codeforces.com/contest/739/problem/B 题目大意&#xff1a; 给出一棵树&#xff0c;如果v是u的孩子节点&#xff0c;并且dis(u,v) < a[v]&#xff0c;那么称为u可以控制到v 输出每个节点可以控制的节点的数量 题目思路&#xff1a; 读完…...

    2024/4/24 19:22:53
  7. mysql的读写分离

    一、mysql主从复制读写分离 1、mysql主从复制的作用和特点 1】mysql主从复制的作用 保证mysql数据的可靠性和稳定性 避免单点故障 2】mysql主从复制特点 可靠性强 稳定性强 避免数据丢失 3】mysql主从复制的原理 主数据库开启二进制日志 允许日志复制 备份mysql监听主mysql日志…...

    2024/4/24 19:22:45
  8. 程序测试:断点调试

    下面简单介绍一下Eclipse开发环境&#xff0c;并通过一个小例子简单介绍一下Eclipse下调试Java程序的一些方法。 Eclipse是一款非常优秀的开源IDE&#xff08;集成开发环境&#xff09;&#xff0c;基于Java的可扩展开发平台。除了可作为 Java 的集成开发环境外&#xff0c;还…...

    2024/4/24 19:22:44
  9. 后端开发面试题(十)消息中间件篇

    文章目录1、为什么使用MQ&#xff1f;MQ的优点2、消息队列有什么优缺点&#xff1f;RabbitMQ有什么优缺点&#xff1f;3、你们公司生产环境用的是什么消息中间件&#xff1f;4、Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点&#xff1f;5、MQ 有哪些常见问题&#xff1f;…...

    2024/4/24 19:22:50
  10. 中国石油大学《工程力学》在线考试题

    1A 在铸铁压缩试验中&#xff0c;破坏后的铸铁试样断口平滑呈韧性&#xff0c;与轴线近似成45。破坏前&#xff0c;该断口所在斜截面的应力有何特点&#xff1f; 答&#xff1a;剪应力最大 1B 在铸铁扭转试验中&#xff0c;铸铁断口的形态是什么样的&#xff1f; 答&#xf…...

    2024/4/24 19:22:45
  11. 【Vue学习(一),Vue和MVVM介绍、Vue常用标签】

    初识Vue 什么是Vue 以下引自Vue官方文档 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。 与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。 Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与…...

    2024/4/24 19:22:44
  12. 后端开发面试题(十一)ZooKeeper篇

    文章目录1、ZooKeeper 是什么&#xff1f;2、ZooKeeper 提供了什么&#xff1f;3、Zookeeper 文件系统4、Zookeeper 怎么保证主从节点的状态同步&#xff1f;5、四种类型的数据节点 Znode6、Zookeeper Watcher 机制 – 数据变更通知7、客户端注册 Watcher 实现8、服务端处理 Wa…...

    2024/4/27 23:17:16
  13. 【学习总结】块级作用域:var缺陷以及为什么要引入let和const?

    正是由于 JavaScript 存在变量提升这种特性&#xff0c;从而导致了很多与直觉不符的代码&#xff0c;这也是 JavaScript 的一个重要设计缺陷。 “探病因”——分析为什么在 JavaScript 中会存在变量提升&#xff0c;以及变量提升所带来的问题&#xff1b; “开药方”——介绍如…...

    2024/4/9 9:05:10
  14. 08运算符重载

    08运算符重载 运算符重载 本质上是函数重载 成员函数重载 成员函数声明的格式 : 函数类型 operator 运算符(参数表); 成员函数定义的格式 : 函数类型 类名::operator 运算符(参数表){} class Complex{ private:int real_;int imag_; public:Complex(int r0, int i0):real_…...

    2024/3/29 4:08:14
  15. Unity Shder Graphs 水效果

    Unity Shder Graphs 水效果...

    2024/4/25 12:01:18
  16. Java 将PDF 转为Word、图片、SVG、XPS、Html、PDF/A(亲测有效)

    本文将介绍通过Java编程来实现PDF文档转换的方法。包括&#xff1a; PDF转为Word PDF转为图片 PDF转为Html PDF转为SVG 4.1 将PDF每一页转为单个的SVG 4.2 将一个包含多页的PDF文档转为一个SVG PDF转为XPS PDF转为PDF/A 使用工具&#xff1a;Free Spire.PDF for Java&am…...

    2024/3/22 22:15:41
  17. Java 随机获取多个不重复的数字

    最近在做一些算法测试时&#xff0c;为了方便测试&#xff0c;自己写了一个获取多个随机数字的小Demo public class GetArrays {/*** 获取随机数组* param arrLength 随机数组长度* return 随机数组,可重复*/public static int[] getArrays(int arrLength){int arr[] new in…...

    2024/4/25 17:10:31
  18. 解决使用标签<%@ taglib prefix=”c” uri=”http://java.sun.com/jsp/jstl/core” %>报错问题

    解决使用标签<% taglib prefix”c” uri”http://java.sun.com/jsp/jstl/core” %>报错问题 &#xff01;&#xff01;&#xff01;首先你需要下载过Tomcat包&#xff01;&#xff01;&#xff01; <% taglib prefix"c" uri"http://java.sun.com/jsp…...

    2024/4/10 10:14:05
  19. 用VGG19模型跑CIFAR10的过程与总结

    CIFAR10的源代码 遇到的问题 结果 1.源代码 废话不多说&#xff0c;直接上源代码。源代码是网上一位大神写的&#xff0c;原文源代码链接。 import torch import torch.nn as nn import torch.nn.functional as F import torchvision import torchvision.datasets as dset…...

    2024/4/22 16:07:06
  20. 解决SSH客户端中文乱码问题

    1、在linux上输入 locale -a 查询系统支持的字符集&#xff0c;找到相应的字符集 2、在ssh客户端上输入export LANGzh_CN.gbk设定字符集&#xff08;zh_CN.gbk根据自己的情况而定&#xff09;即可 再查看即可看见中文显示正常了。 永久修改 上述修改只是临时修改&#xff0c…...

    2024/4/29 5:01:08

最新文章

  1. 高可用系列四:loadbalancer 负载均衡

    负载均衡可以单独使用&#xff0c;也常常与注册中心结合起来使用&#xff0c;其需要解决的问题是流量分发&#xff0c;这是就需要定义分发策略&#xff0c;当然也包括了故障切换的能力。 故障切换 故障切换是负载均衡的基本能力&#xff0c;和注册中心结合时比较简单&#xf…...

    2024/5/3 9:27:31
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 2024 年高效开发的 React 生态系统

    要使用 React 制作应用程序&#xff0c;需要熟悉正确的库来添加您需要的功能。例如&#xff0c;要添加某个功能&#xff08;例如身份验证或样式&#xff09;&#xff0c;您需要找到一个好的第三方库来处理它。 在这份综合指南中&#xff0c;我将向您展示我建议您在 2024 年使用…...

    2024/5/1 13:50:40
  4. 第六章:使用 kubectl 创建 Deployment

    使用 kubectl 创建 Deployment 目标 学习应用的部署。使用 kubectl 在 Kubernetes 上部署第一个应用。Kubernetes 部署 一旦运行了 Kubernetes 集群, 就可以在其上部署容器化应用。为此,你需要创建 Kubernetes Deployment。 Deployment 指挥 Kubernetes 如何创建和更新应用…...

    2024/4/29 16:09:33
  5. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/5/2 11:19:01
  6. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/5/2 16:04:58
  7. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/5/2 23:55:17
  8. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/5/2 9:47:31
  9. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/5/2 9:47:31
  10. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/5/2 6:03:07
  11. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/5/2 9:47:30
  12. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/5/2 23:47:43
  13. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/5/2 5:31:39
  14. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/5/3 1:55:15
  15. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/5/2 9:47:28
  16. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/5/2 9:47:27
  17. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/5/3 1:55:09
  18. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/5/2 8:37:00
  19. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/5/2 9:47:26
  20. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/5/2 9:47:25
  21. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/5/2 23:47:16
  22. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/5/2 18:46:52
  23. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/5/3 7:43:42
  24. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/5/3 1:54:59
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57