学习目标

能够描述运行时数据区域

能够说出垃圾回收机制

能够说出JVM的类加载机制

能够说出双亲委托模型

能够使用JVM性能监控工具

能够说出JVM性能调优

JVM优化及面试热点分析

jvm的组成

类加载器(ClassLoader)
运行时数据区(Runtime Data Area)
执行引擎(Execution Engine)
本地库接口(Native Interface)

在这里插入图片描述

首先通过类加载器(ClassLoader)会把 Java 代码转换成字节码,
运行时数据区(Runtime Data Area)再把字节码加载到内存中,而字节码文件只是 JVM 的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),
将字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用其他语言的本地库接口(Native Interface)来实现整个程序的功能

java 内存管理机制

对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new的操作去写对应的内存管理操作,不容器出现内存泄漏和内存溢出问题,由虚拟机管理内存一切都看起来很美好。不过,也正是因为我们把内存控制的权利交给了虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎么样使用内存的,那么排查错误将会变得特别的困难。 所以,接下来我们要一层一层接下内存管理机制的面试来了解它究竟是怎样实现的。

运行时数据区域

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间。根据1.7 java虚拟机规范,jvm在运行时主要分为以下几个运行时内存区域:

在这里插入图片描述

程序计数器

线程私有。可看作是**当前线程所执行的字节码的行号指示器**,字节码解释器的工作是通过改变这个计数值来读取下一条要执行的字节码指令。多线程是通过线程轮流切换并分配处理器执行时间来实现的,任何一个时刻,一个内核只能执行一条线程中的指令。**为了线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器**。这就是一开始说的“线程私有”。如果线程正在执行的方法是Java方法,计数器记录的是虚拟机字节码的指令地址;如果是Native方法,计数器值为空。

程序计数器是唯一一个在Java虚拟机规范中没有规定OOM(OutOfMemoryError)情况的区域

Java虚拟机栈

线程私有,生命周期和线程相同。Java虚拟机栈描述的是Java方法的内存模型:每个方法在执行时都会创建一个栈帧,存储**局部变量表、操作数栈、动态链接、方法出口信息**,每一个方法从调用到结束,就对应这一个栈帧在虚拟机栈中的进栈和出栈过程。局部变量表保存了各种基本数据类型(int、double、char、byte等
)、对象引用(不是对象本身)和returnAddress类型(指向了一条字节码地址)。* 方法执行的过程:方法被调用前:创建栈帧方法执行:栈帧入栈方法执行后:栈帧出栈栈的空间大小设置:  -Xss 为jvm启动的每个线程分配的内存大小
  • 线程请求的栈深度大于虚拟机所允许的深度,抛出StackOverflowError;
  • 虚拟机栈扩展时无法申请到足够的内存,抛出OutOfMemoryError。

StackOverflowError

/*** 栈超出最大深度:StackOverflowError* VM args: -Xss128k**/
public class StackSOF {private int stackLength = 1;public void stackLeak(){stackLength++;stackLeak();}public static void main(String[] args) {StackSOF stackSOF = new StackSOF();try {stackSOF.stackLeak();} catch (Throwable e) {System.out.println("当前栈深度:" + stackSOF.stackLength);e.printStackTrace();}}
}
java.lang.StackOverflowError
当前栈深度:30170at cn.itcast.jvm.StackSOF.stackLeak(StackSOF.java:11)at cn.itcast.jvm.StackSOF.stackLeak(StackSOF.java:11)方法递归调用,造成深度过深,产生异常

OutOfMemoryError(代码谨慎使用,会引起电脑卡死 )

/*** 栈内存溢出: OOM* VM Args: -Xss2m**/
public class StackOOM {private void dontStop(){while (true){}}public void stackLeakByThread(){while(true){Thread t = new Thread(new Runnable() {public void run() {dontStop();}});t.start();}}public static void main(String[] args) {StackOOM stackOOM = new StackOOM();stackOOM.stackLeakByThread();}
}
Exception in thread "main"  java.lang.OutOfMemoryError:unable to create new native thread

单线程下栈的内存出现问题了,都是报StackOverflow的异常,只有在多线程的情况下,当新创建线程无法在分配到新的栈内存资源时,会报内存溢出。

本地方法栈

上述虚拟机栈为JVM执行Java方法服务,本地方法则为执行Native服务。其他和虚拟机栈类似,也会抛出StackOverflowError、OutOfMemoryError。

Java堆

常说的“栈内存”、“堆内存”,其中前者指的是虚拟机栈,后者说的就是Java堆了。**Java堆是被线程共享的**。在虚拟机启动时被创建。Java堆是Java虚拟机所管理的内存中最大的一块。Java堆的作用是存放对象实例,Java堆可以处于物理上不连续的内存空间中,只要求逻辑上连续即可。Java堆是垃圾收集器管理的主要区域,因此很多时候也被称作"GC堆",从内存回收的角度看,现在收集器都基本采用分代回收的算法 所以Java堆呢还可以细分为:新生代、老年代。  在细致一点的有:Eden空间、From Survivor空间、To Survivor空间。   堆的空间大小设置:   -Xms java堆启动时内存   -Xmx java堆可扩展的最大内存
内存泄漏:Memory Leak  一个无用的对象,应该被回收,却因为某种原因一直未被回收内存溢出:Memory Overflow  对象确实都应该活着,这个时候内存不够用了-Xms 设置堆的初始值    200m
-Xmx 设置堆的最大值    200m

案例:

/*** 堆内存溢出演示* VM Args: -Xms20m -Xmx20m **/
public class HeapOOM {public static void main(String[] args) throws InterruptedException {List<byte[]> list = new ArrayList<byte[]>();int i=0;while (true){list.add(new byte[1024]);}}
}
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid18828.hprof ...
Heap dump file created [20924845 bytes in 0.060 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceat cn.itcast.jvm.HeapOOM.main(HeapOOM.java:15)

方法区

也被称为永久代 1.7  
Perm  :  永久代 也被称为元数据空间 1.8
MetaSpace: 元数据空间是线程共享的区域。存储已被虚拟机加载的类信息 、 常量、 静态变量、即使编译器编译后的代码等数据。方法区无法满足内存分配需求时,抛出OutOfMemoryError。JVM规范被没要求这个区域需要实现垃圾收集,因为这个区域回收主要针对的是类和常量池的信息回收,回收结果往往难以令人满意。
运行时常量池:是方法区的一部分。Java语言不要求常量只能在编译期产生,换言之,在运行期间也能将新的常量放入。方法区空间大小设置: 
-XX:PermSize 方法区的初始值大小
-XX:MaxPermSize 方法区的最大值1.8之后设置: 
-XX:MetaspaceSize  方法区的初始值大小
-XX:MaxMetaspaceSize  方法区的最大值

OutOfMemoryError

/*** 方法区 OOM* VM Args: -XX:PermSize10m -XX:MaxPermSize10m   1.8移除永生代* VM Args:-XX:MetaspaceSize=10m -XX:MaxMetaspaceSize=10m   **/
public class PermOOM {public static void main(final String[] args) {while (true){Enhancer enhancer = new Enhancer();enhancer.setSuperclass(PermOOM.class);enhancer.setUseCache(false);enhancer.setCallback(new MethodInterceptor() {public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {return methodProxy.invoke(o,args);}});enhancer.create();}}
}
Exception in thread "main" java.lang.OutOfMemoryError: Metaspaceat java.lang.Class.forName0(Native Method)at java.lang.Class.forName(Class.java:348)at net.sf.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:386)at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:219)at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285)at cn.itcast.jvm.PermOOM.main(PermOOM.java:24)Process finished with exit code 1
Cglib动态代理可以动态创建代理类,这些代理类的Class会动态的加载入内存中,存入到方法区。所以当我们把方法区内存调小后便可能会产生方法区内存溢出,1.8之前的JDK我们可以称方法区为永久代 :PermSpace 1.8之后方法区改为MetaSpace 元空间。

GC垃圾回收机制

说起垃圾收集(Garbage Clollection , GC),大家肯定都不陌生,目前内存的动态分配与内存回收技术已经非常成熟,那么我们为什么还要去了解GC和内存分配呢?原因很简单:当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时。 我们就需要对这些自动化的技术实施必要的监控和条件。在我们的java运行时内存当中,程序计数器、Java虚拟机栈、本地方法栈 3个区域都是随线程生而生,随线程灭而灭,因此这个区域的内存分配和回收都具备了确定性,所以在这几个区域不需要太多的考虑垃圾回收问题,因为方法结束了,内存自然就回收了。但Java堆不一样,它是所有线程共享的区域,我们只有在程序处于运行期间时才能知道会创建哪些对象,这个区域的内存分配和内存回收都是动态的,所以垃圾收集器主要关注的就是这部分的内存。关于回收的知识点,我们会从以下几方面去讲解:
1. 什么样的对象需要回收
2. 垃圾收集的算法(如何回收)
3. 垃圾收集器(谁来回收)
4. 内存分配与回收策略(回收细节) 

对象已死吗

在Java堆中存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还存活着,哪些已经死去(即不可能在被任何途径使用的对象)

如何判断对象是否死亡,主要有两种算法: 引用计数法可达性分析算法

主流的商业虚拟机基本使用的是 可达性分析算法

可达性分析算法

基本思路:通过系列的称为 GC Roots 的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径成为引用连,
当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可达的,会被判断为可回收的对象。如图: 对象5,6,7 虽然互相有关联,但是他们到GC Roots是不可达的,所以它们会被判定为可回收的对象。

在这里插入图片描述

可作为GC Roots节点的对象

虚拟机栈中 (栈帧中的本地变量表) 引用的对象  
(通俗的讲: 正在执行的方法,中的变量所引用的对象)方法区中类静态属性引用的对象
(被加载的类,中的静态属性或常量所引用的对象)方法区中常量的引用对象本地方法栈中引用的对象   native

垃圾收集算法

标记-清除算法

标记—清除算法是最基础的收集算法,过程分为标记和清除两个阶段,首先标记出需要回收的对象,之后由虚拟机统一回收已标记的对象。这种算法的主要不足有两个:
1、效率问题,标记和清除的效率都不高
2、空间问题,对象被回收之后会产生大量不连续的内存碎片,当需要分配较大对象时,由于找不到合适的空闲内存而不得不再次触发垃圾回收动作

在这里插入图片描述

复制算法

为了解决效率问题,复制算法出现了。算法的基本思路是:**将内存划分为大小相等的两部分,每次只使用其中一半,当第一块内存用完了,就把存活的对象复制到另一块内存上,然后清除剩余可回收的对象,这样就解决了内存碎片问题。我们只需要移动堆顶指针,按顺序分配内存即可,简单高效。**但是算法的缺点也很明显:
1、它浪费了一半的内存,这太要命了。
2、如果对象的存活率很高,我们可以极端一点,假设是100%存活,那么我们需要将所有对象都复制一遍,并将所有引用地址重置一遍。复制这一工作所花费的时间,在对象存活率达到一定程度时,将会变的不可忽视。

在这里插入图片描述

这种收集算法经常被采用到新生代,因为新生代中的对象 绝大部分都是 朝生夕死,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor。当回收时,将Eden和Survivor中还存活着的对象一次性的复制到另外一块Survivor空间上,最后清理Eden和刚才用过的Survivor空间,HotSpot默认的空间比例是 8:1 ,如图:

在这里插入图片描述

分配担保: 我们没办法保证每次回收都只有不多于10%的对象存活,当Survivor空间不够时,需要依赖其他内存(这里指老年代)进行分配担保。

标记-整理算法

根据老年代的特点,有人提出了另一种改进后的“标记—清除”算法:标记—整理算法。
标记:它的第一个阶段与标记/清除算法是一模一样的,均是遍历GC Roots,然后将存活的对象标记。
整理:移动所有存活的对象,且按照内存地址次序依次排列,然后将末端内存地址以后的内存全部回收。因此,第二阶段才称为整理阶段。

在这里插入图片描述

可以看到,标记的存活对象将会被整理,按照内存地址依次排列,而未被标记的内存会被清理掉。如此一来,当我们需要给新对象分配内存时,JVM只需要持有一个内存的起始地址即可,这比维护一个空闲列表显然少了许多开销。

不难看出,标记/整理算法不仅可以弥补标记/清除算法当中,内存区域分散的缺点,也消除了复制算法当中,内存减半的高额代价,可谓是一举两得。

分代收集算法

现代商业虚拟机垃圾收集大多采用分代收集算法。主要思路是根据对象存活生命周期的不同将内存划分为几块。一般是把Java堆分为新生代和老年代,然后根据各个年代的特点采用最合适的收集算法。新生代中,对象的存活率比较低,所以选用复制算法,老年代中对象存活率高且没有额外空间对它进行分配担保,所以使用“标记-清除”或“标记-整理”算法进行回收

在这里插入图片描述

分代垃圾回收策略

1.对象是在Eden区进行分配,如果Eden区没有足够空间时触发一次 Minor GC
JVM提供 -XX:+PrintGCDetails这个收集器日志参数2.占用内存较大的对象,对于虚拟机内存分配是一个坏消息,虚拟机提供了一个 -XX:PretenureSizeThreshold
让大于这个设置的对象直接存入老年代。3.长期存入的对象会存入老年代。虚拟机给每个对象定义了一个Age年龄计数器,对象在Eden中出生并经过第一次Minor GC后仍然存活,对象年龄+1,此后每熬过一次Minor GC则对象年龄+1,当年龄增加到一定程度默认15岁,就会晋升到老年代。 、可通过参数设置晋升年龄 -XX:MaxTenuringThreshold Minor GC 和 Full GC的区别新生代GC(Minor GC):指发生在新生代的垃圾收集动作,Minor GC非常频繁,一般回收速度也很快老年代GC(Full GC/Major GC):指发生在老年代的GC,出现Full GC 一般会伴随一次 Minor GC,Full GC的速度要慢很多,一般要比Minor GC慢10倍

垃圾收集器 HotSpot JDK1.8(自己阅读)

如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。下图是HotSpot虚拟机所包含的所有垃圾收集器:

在这里插入图片描述

从JDK3(1.3)开始,HotSpot团队一直努力朝着高效收集、减少停顿(STW: Stop The World)的方向努力,也贡献了从串行到CMS乃至最新的G1在内的一系列优秀的垃圾收集器。上图展示了JDK的垃圾回收大家庭,以及相互之间的组合关系。

HotSpot虚拟机:
Serial:最早的单线程串行垃圾回收器。
Serial Old:Serial 垃圾回收器的老年版本,同样也是单线程的,可以作为 CMS 垃圾回收器的备选预案。
ParNew:是 Serial 的多线程版本。
Parallel 和 ParNew 收集器类似是多线程的,但 Parallel 是吞吐量优先的收集器,可以牺牲等待时间换取系统的吞吐量。
Parallel Old 是 Parallel 老生代版本,Parallel 使用的是复制的内存回收算法,Parallel Old 使用的是标记-整理的内存回收算法。
CMS:一种以获得最短停顿时间为目标的收集器,非常适用 B/S 系统。
G1:一种兼顾吞吐量和停顿时间的 GC 实现,是 JDK 9 以后的默认 GC 选项。STW
STW:Stop The World  是指由于虚拟机在后台发起垃圾收集时,会暂停所有其他的用户工作线程,造成用户应用暂时性停止。从JDK1.3开始,HotSpot虚拟机开发团队一直为消除或者减少工作线程因为内存回收而导致停顿而努力着。用户线程的停顿时间不短缩短,但仍无法完全消除。

下面就几种典型的组合应用进行简单的介绍

串行收集器

在这里插入图片描述

串行收集器组合 Serial + Serial Old

串行收集器是最基本、发展时间最长、久经考验的垃圾收集器,也是client模式下的默认收集器配置。
串行收集器采用单线程stop-the-world的方式进行收集。当内存不足时,串行GC设置停顿标识,待所有线程都进入安全点(Safepoint)时,应用线程暂停,串行GC开始工作,采用单线程方式回收空间并整理内存。单线程也意味着复杂度更低、占用内存更少,但同时也意味着不能有效利用多核优势。事实上,串行收集器特别适合堆内存不高、单核甚至双核CPU的场合。开启选项:-XX:+UseSerialGC

并行收集器

在这里插入图片描述

并行收集器组合 Parallel Scavenge + Parallel Old

并行收集器是以关注吞吐量为目标的垃圾收集器,也是server模式下的默认收集器配置,对吞吐量的关注主要体现在年轻代Parallel Scavenge收集器上。并行收集器与串行收集器工作模式相似,都是stop-the-world方式,只是暂停时并行地进行垃圾收集。年轻代采用复制算法,老年代采用标记-整理,在回收的同时还会对内存进行压缩。关注吞吐量主要指年轻代的Parallel Scavenge收集器,通过两个目标参数-XX:MaxGCPauseMills和-XX:GCTimeRatio,调整新生代空间大小,来降低GC触发的频率。并行收集器适合对吞吐量要求远远高于延迟要求的场景,并且在满足最差延时的情况下,并行收集器将提供最佳的吞吐量。  开启选项:-XX:+UseParallelGC或-XX:+UseParallelOldGC(可互相激活)

并发清除收集器

在这里插入图片描述

并发标记清除收集器组合 ParNew + CMS (老年代) + Serial Old (担保)

并发标记清除(CMS)是以关注延迟为目标、十分
优秀的垃圾回收算法,开启后,年轻代使用STW式的并行收集,老年代回收采用CMS进行垃圾回收,对延迟的关注也主要体现在老年代CMS上。年轻代ParNew与并行收集器类似,而老年代CMS每个收集周期都要经历:初始标记、并发标记、重新标记、并发清除。其中,初始标记以STW的方式标记所有的根对象;并发标记则同应用线程一起并行,标记出根对象的可达路径;在进行垃圾回收前,CMS再以一个STW进行重新标记,标记那些由mutator线程(指引起数据变化的线程,即应用线程)修改而可能错过的可达对象;最后得到的不可达对象将在并发清除阶段进行回收。值得注意的是,初始标记和重新标记都已优化为多线程执行。CMS非常适合堆内存大、CPU核数多的服务器端应用,也是G1出现之前大型应用的首选收集器。但是CMS并不完美,它有以下缺点:  标记 清除    产生碎片 由于并发进行,CMS在收集与应用线程会同时会增加对堆内存的占用,也就是说,CMS必须要在老年代堆内存用尽之前完成垃圾回收,否则CMS回收失败时,将触发担保机制,串行老年代收集器将会以STW的方式进行一次GC,从而造成较大停顿时间;
标记清除算法无法整理空间碎片,老年代空间会随着应用时长被逐步耗尽,最后将不得不通过担保机制对堆内存进行压缩。CMS也提供了参数-XX:CMSFullGCsBeForeCompaction(默认0,即每次都进行内存整理)来指定多少次CMS收集之后,进行一次压缩的Full GC。开启选项:-XX:+UseConcMarkSweepGC

Garbage First (G1)

G1(Garbage First)垃圾收集器是当今垃圾回收技术最前沿的成果之一。早在JDK7就已加入JVM的收集器大家庭中,成为HotSpot重点发展的垃圾回收技术。同优秀的CMS垃圾回收器一样,G1也是关注最小时延的垃圾回收器,也同样适合大尺寸堆内存的垃圾收集,官方也推荐使用G1来代替选择CMS。G1最大的特点是引入分区的思路,弱化了分代的概念,合理利用垃圾收集各个周期的资源,解决了其他收集器甚至CMS的众多缺陷。

在这里插入图片描述

G1垃圾收集器也是以关注延迟为目标、服务器端应用的垃圾收集器,被HotSpot团队寄予取代CMS的使命,也是一个非常具有调优潜力的垃圾收集器。虽然G1也有类似CMS的收集动作:初始标记、并发标记、重新标记、清除、转移回收,并且也以一个串行收集器做担保机制,但单纯地以类似前三种的过程描述显得并不是很妥当。事实上,G1收集与以上三组收集器有很大不同:G1的设计原则是"首先收集尽可能多的垃圾(Garbage First)"。因此,G1并不会等内存耗尽(串行、并行)或者快耗尽(CMS)的时候开始垃圾收集,而是在内部采用了启发式算法,在老年代找出具有高收集收益的分区进行收集。同时G1可以根据用户设置的暂停时间目标自动调整年轻代和总堆大小,暂停目标越短年轻代空间越小、总空间就越大;
G1采用内存分区(Region)的思路,将内存划分为一个个相等大小的内存分区,回收时则以分区为单位进行回收,存活的对象复制到另一个空闲分区中。由于都是以相等大小的分区为单位进行操作,因此G1天然就是一种压缩方案(局部压缩);
G1虽然也是分代收集器,但整个内存分区不存在物理上的年轻代与老年代的区别,也不需要完全独立的survivor(to space)堆做复制准备。G1只有逻辑上的分代概念,或者说每个分区都可能随G1的运行在不同代之间前后切换;
G1的收集都是STW的,但年轻代和老年代的收集界限比较模糊,采用了混合(mixed)收集的方式。即每次收集既可能只收集年轻代分区(年轻代收集),也可能在收集年轻代的同时,包含部分老年代分区(混合收集),这样即使堆内存很大时,也可以限制收集范围,从而降低停顿。开启选项:-XX:+UseG1GC

JVM类加载机制

概述

  • 负责将 Class 加载到 JVM 中
  • 审查每个类由谁加载(父优先的等级加载机制)
  • 将 Class 字节码重新解析成 JVM 统一要求的对象格式

类加载的时机

什么情况下需要开始类加载呢?

1.在遇到 new、putstatic、getstatic、invokestatic 字节码指令时,如果类尚未初始化,则需要先触发初始化。new User(); User.aa User.staticFun()2.对类进行反射调用时,如果类还没有初始化,则需要先触发初始化。User.class.newInstance();3.初始化一个类时,如果其父类还没有初始化,则需要先初始化父类。User extends PersonUser == >   初始化Person 4.虚拟机启动时,用于需要指定一个包含 main() 方法的主类,虚拟机会先初始化这个主类。

加载类的过程

**类从被加载到虚拟机内存中开始,直到卸载出内存为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载这7个阶段。其中,验证、准备和解析这三个部分统称为连接(linking)。 **

在这里插入图片描述

加载

基本概念:该过程完成查找并加载类的class文件。该class文件可以来自本地磁盘或者网络等。Java规范中并没有规定 Class 对象的存放位置,对于Hot Spot 虚拟机来说,Class 对象虽然是对象,但却是存放在方法区中。

验证

基本概念:确保类型的正确性,比如class文件的格式是否正确、语义是否符合语法规定、字节码是否可以被JVM安全执行等
1. 验证魔数  0xcafebabe  证明是.class
2. 验证虚拟机版本   
3. 语法是否符合规定验证总体上分为4个阶段: 文件格式验证、元数据验证、字节码验证、符号引用验证。

准备

基本概念:为类的静态变量分配内存,并赋初值。基本类型的变量赋值为初始值,比如int类型的赋值为0,引用类型赋值为null。static String str = "小明";
static int i = 255static String str = null
static int i = 0“准备”阶段是正式为类变量(仅仅是类变量,即 static 修饰的变量)分配内存并设置类变量初始值(除了 final 变量初始值是数据类型的零值,并不是类构造器<clinit> 方法中的初始值)的阶段,这些变量所使用的内存都将在方法区中进行。

解析

基本概念:将符号引用转为直接引用。比如方法中调用了其他方法,方法名可以理解为符号引用,而直接引用就是使用指针直接引用方法。
”解析“阶段是虚拟机将常量池内的符号引用替换为直接引用的过程,class Person {private Student student = new Student();}主要针对 类或接口、字段、类方法、接口方法、方法类型、方法句柄 和 调用限定符 7类符号引用进行。

初始化

基本概念:初始化,则是为标记为常量值的字段赋值的过程。换句话说,只对static修饰的变量或语句块进行初始化。如果初始化一个类的时候,其父类尚未初始化,则优先初始化其父类。如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行。class Person {static String str = "小明"static int i = 1static {// 在初始化的时候执行一次}
}new Person()
Person.class
main

类加载器

概念

“将class文件加载进JVM的方法区,并在方法区中创建一个java.lang.Class对象作为外界访问这个类的接口。”实现这一动作的代码模块称为类加载器。

类和类加载器:
对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在虚拟机中的唯一性。 通俗点说: 比较两个类是否“相等”,只有在这两个类是由同一个类加载器加载的前提下才用意义,否则,即使这两个类来源于同一个Class文件,被同一个虚拟机加载,只要加载它们的类加载器不同,那这两个类就必定不相等。这里的“相等”  包括: Class对象的 equals() 方法、isInstance()方法,也包括 instanceof关键字
/*** 使用自定义类加载器加载Class对象* 系统默认类加载器加载Class 对象* 属于两个不同的类**/
public class ClassLoaderTest1 {public static void main(String[] args)  throws Exception{// 自定义 类加载器ClassLoader myLoader = new ClassLoader() {@Overridepublic Class<?> loadClass(String name) throws ClassNotFoundException {try {String fileName = name.substring(name.lastIndexOf(".")+1) + ".class";InputStream in = getClass().getResourceAsStream(fileName);if(in == null){return super.loadClass(name);}byte[] b = new byte[in.available()];in.read(b);return defineClass(name,b,0,b.length);} catch (IOException e) {e.printStackTrace();}return super.loadClass(name);}};//使用自定义类加载器加载出来的Class对象Class c1 = myLoader.loadClass("cn.itcast.jvm.ClassLoaderTest1");//使用系统默认的类加载器加载出来的Class对象Class c2 = ClassLoaderTest1.class;//结果为falseSystem.out.println(c1==c2);}
}

类加载器的分类

在这里插入图片描述

启动类加载器(BootStrap ClassLoader,又称根加载器)

每次执行 java 命令时都会使用该加载器为虚拟机加载核心类。
该加载器是由 native code 实现,而不是 Java 代码,加载类的路径为 <JAVA_HOME>/jre/lib。
特别的 <JAVA_HOME>/jre/lib/rt.jar 中包含了 sun.misc.Launcher 类,
而 sun.misc.Launcher$ExtClassLoader 和 sun.misc.Launcher$AppClassLoader 都是 sun.misc.Launcher的内部类,所以拓展类加载器和系统类加载器都是由启动类加载器加载的。

扩展类加载器(Extension ClassLoader)

用于加载拓展库中的类。拓展库路径为<JAVA_HOME>/jre/lib/ext/。
实现类为 sun.misc.Launcher$ExtClassLoader。

应用程序类加载器(App ClassLoader)

负责加载用户classpath下的class文件,又叫系统加载器,其父类是Extension。
它是应用最广泛的类加载器。它从环境变量classpath或者系统属性java.class.path所指定的目录中记载类,是用户自定义加载器的默认父加载器。
实现类为 sun.misc.Launcher$AppClassLoader

自定义类加载器

用户自定义类加载器,继承自System ClassLoader

双亲委派模型

基本概念

如果一个类加载器收到了加载类的请求,它首先将请求交由父类加载器加载;若父类加载器加载失败,当前类加载器才会自己加载类。bootstrap : java.lang.Object.classappClassLoader : java.lang.Object.class

在这里插入图片描述

作用

像java.lang.Object这些存放在rt.jar中的类,无论使用哪个类加载器加载,最终都会委java.lang.Object.class  
派给最顶端的启动类加载器加载,从而使得不同加载器加载的Object类都是同一个。 Object.class       Object.class

双亲委派模型的代码在java.lang.ClassLoader类中的loadClass函数中实现:

protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException{synchronized (getClassLoadingLock(name)) {// 检查类是否被加载Class<?> c = findLoadedClass(name);if (c == null) {long t0 = System.nanoTime();try {//若未加载,则调用父类加载器的loadClass方法if (parent != null) {c = parent.loadClass(name, false);} else {// 没有父类则调用 BootstrapClassLoaderc = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// 若该方法抛出ClassNotFoundException异常,表示父类加载器无法加载}if (c == null) {// 则当前类加载器调用findClass加载类long t1 = System.nanoTime();c = findClass(name);// this is the defining class loader; record the statssun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;}}

过程小结

1.首先检查类是否被加载;
2.若未加载,则调用父类加载器的loadClass方法;
3.若该方法抛出ClassNotFoundException异常,表示父类加载器无法加载,则当前类加载器调用findClass加载类;
4.若父类加载器可以加载,则直接返回Clas象。
  1. 内存溢出问题排查

jconsole 监控到项目中内存出现问题

jmap 将堆内存快照进行打印

jprofiler 分析内存快照,定位到占用内存比较大的对象

调整堆内存的大小 -Xms -Xmx

JVM性能监控与故障处理工具

有没有解决过生产环境的问题?

内存溢出问题的排查

CPU使用率百分百的排查

概述

	假如我们需要排查定位一些系统问题, 知识、经验是关键基础,数据是依据,那么工具就是运用知识处理数据的手段。这里面指的数据包括:运行日志、异常堆栈、GC日志、线程快照、堆转储快照等等。 经常使用适当的虚拟机监控和分析的工具可以加快我们分析数据、定位解决问题的速度。我们可能都知道,在JDK的安装目录中有 "java.exe"、"javac.exe"这两个命令行工具,但可能很多人都不了解bin目录中其它命令行的作用。每当JDK版本更新后,这个目录下总是默默的多出了一些命令行。接下来,我们就要去了解这些工具,主要去了解监视虚拟机和故障处理的一些工具。

JDK的命令行工具

jps:虚拟机进程状况工具

可以列出当前系统正在运行的虚拟机进程命令格式:
jps [options] [hostid]

在这里插入图片描述

jmap:java内存映像工具


用于生成堆转储快照,一般称为heapdump 或 dump文件,如果不使用jmap命令 也很暴力的通过:
-XX:+HeapDumpOnOutOfMemoryError参数,可以让虚拟机出现OOM异常之后自动生成dump文件。如:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:/test.hprof在发生OOM时打印快照, 并且指定快照的路径命令格式:
jmap [option] vmid//将904虚拟机的内存映像存储到当前文件夹的ddd.hprof文件中
jmap -dump:format=b,file=ddd.hprof 2509

JProfiler:虚拟机堆转储快照分析工具

与jmap搭配使用,用于分析dump文档,内置了http服务器,可以在浏览器中进行分析   

Java堆内存OOM是经常会见到的异常,“java.lang.OutOfMemoryError” 跟着会提示 “Java heap space”,要解决这个区域的异常,一般的手段是先通过内存映像分析工具对Dump出来的堆转储快照进行分析

(分析工具 采用Idea + JProfiler神器 安装方法:https://blog.csdn.net/wytocsdn/article/details/79258247)

在这里插入图片描述

通过dump文件进行分析,重点确认内存中的对象是否是必要的,也就是先要分析是内存泄漏还是内存溢出的问题,如果是内存泄漏 可通过工具进一步查询泄漏对象到CG Roots的引用连, 找到无法回收的原因。
如果不存在泄露,可以检查虚拟机的堆参数(-Xmx 与 -Xms),看看是否可以调大一些。

jstack:java堆栈跟踪工具

用于生成虚拟机当前时刻的线程快照,线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合。用于分析线程死锁、死循环、请求外部资源时间过长等常见原因
显示指定JVM的线程快照
jstack pid 
jstack pid > xxx.txt
项目准备:
在linux系统模拟生产环境
通过 nohup java -jar 项目jar.jar > 日志文件 &  启动项目
让我们的springboot项目在后台运行,并且将运行日志输出到指定目录
启动项目命令:nohup java \
-Djava.rmi.server.hostname=192.168.200.151 \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=1099 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Xms200m -Xmx200m \
-jar jvmDemo.jar >myDemo.log 2>&1 &上面命令含义:后台运行java项目  、 开启允许远程连接监控 允许的端口1099  未设置登录认证开启堆内存溢出时转存快照,   快照的地址    
生产环境排查 CPU飙高,解决方案:
1.使用 top命令查看CPU情况   
2.得到内存高的进程ID
3.top -p pid -H     27524.查看最高的线程PID 因为是十进制的 需要进行16进制的转换printf "%x" pid
5.jstack pid > pid.log
6.   /线程ID 模糊查询
7. 线程的状态是Runnable 代表线程正在运行
8. 根据下面详细的方法调用信息,定位到具体方法//使用Springboot快速创建一个项目 提供一个增删改查的方法
public String findAll(boolean t){while (t){//--}return "循环完毕";
}生产环境排查 死锁:
通过jstack命令  可以直接识别死锁//死锁代码
public String findAll2(){Object o1 = new Object();Object o2 = new Object();new Thread(()->{synchronized (o1){try {Thread.sleep(1000);synchronized (o2){System.out.println("线程1执行");}} catch (InterruptedException e) {e.printStackTrace();}}}).start();new Thread(()->{synchronized (o2){try {Thread.sleep(1000);synchronized (o1){System.out.println("线程2执行");}} catch (InterruptedException e) {e.printStackTrace();}}}).start();return "死锁方法调用完毕";}// 线程快照 提示我们发生死锁
Found one Java-level deadlock:
=============================
"Thread-3":waiting to lock monitor 0x000000000172ae38 (object 0x00000000ee89cbb0, a java.lang.Object),which is held by "Thread-2"
"Thread-2":waiting to lock monitor 0x00007ff26c0062c8 (object 0x00000000ee89cbc0, a java.lang.Object),which is held by "Thread-3"
// 死锁的详细信息
Java stack information for the threads listed above:
===================================================
"Thread-3":at com.example.demo.UserService.lambda$findAll2$1(UserService.java:44)- waiting to lock <0x00000000ee89cbb0> (a java.lang.Object)- locked <0x00000000ee89cbc0> (a java.lang.Object)at com.example.demo.UserService$$Lambda$460/67019755.run(Unknown Source)at java.lang.Thread.run(Thread.java:748)
"Thread-2":at com.example.demo.UserService.lambda$findAll2$0(UserService.java:32)- waiting to lock <0x00000000ee89cbc0> (a java.lang.Object)- locked <0x00000000ee89cbb0> (a java.lang.Object)at com.example.demo.UserService$$Lambda$459/221862972.run(Unknown Source)at java.lang.Thread.run(Thread.java:748)内存溢出排查
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:/test.hprof

JDK的可视化工具

JDK除了提供大量的命令行工具外,还有两个功能强大的可视化工具:JConsole 和 VisualVM ,这两个工具是JDK的正式成员,功能非常强大!

jconsole:Java监视与管理控制台

通过jdk/bin目录下的 jconsole.exe启动JConsole,将会自动的搜索出本机的所有java虚拟机进程

在这里插入图片描述

在本地进程中会列出本地 正在运行的java虚拟机列表,也可以远程连接其他服务器的java服务器,现在我们选择
JConsoleTest1的进程,并且将堆的大小固定在100MB, 每个隔一小段时间向集合中装入128KB的数据,并注意JConsole监控中个数据指标的变化。
/*** VM Args: -Xms100m -Xmx100m -XX:+UseSerialGC**/
public class JConsoleTest1 {static class OOMObject{public byte[] placeholder = new byte[128*1024];}public static void fillHeap(int num) throws InterruptedException {List<OOMObject> list = new ArrayList<OOMObject>();for (int i = 0; i < num; i++) {Thread.sleep(100);list.add(new OOMObject());}System.gc();Thread.sleep(5000);}public static void main(String[] args) throws InterruptedException {fillHeap(500);fillHeap(1000);}
}

在这里插入图片描述

在这里插入图片描述

JVM调优小结

JVM参数调优实际上没有具体的答案,要根据不同的实战场景进行对应的设置,还需要不断的调试和磨合,设置的不好,JVM不断执行Full GC,导致整个系统变得很慢,网站停滞时间能达10秒以上,这种情况如果没隔几分钟就来一次,自己都受不了。这种停滞在测试的时候看不出来,只有网站pv达到数十万/天的时候问题就暴露出来了。
所以对于JVM调优的话术,我们可以这么说,结合我们公司之前的经验,对于JVM调优我们可以从下面方向进行分析:
互联网项目   64 Linux Centos6.5  8GB1:如果服务器硬件性能足够,建议采用64位操作系统,Linux下64位的jdk比32位jdk要慢一些,但是吃得内存更多,吞吐量更大。2:XMX和XMS设置一样大,MaxPermSize和MinPermSize设置一样大,这样可以减轻伸缩堆大小带来的压力。3:  -Xmn年轻代的大小,      并行:吞吐量       并发:低延迟  -XX:NewRadio年轻代和年老代的比值,Sun建议 年轻代与年老代的比例:3/84:  垃圾回收器的选择:响应时间优先的应用:并发收集器 ParNew + CMS(老年代)     或者 G1 + Serial Old (STW)吞吐量优先的应用:并行收集器  Parallel Scavenge + Parallel Old使用并发收集器,肯定就是追求最小的响应时间,所以应该减少年轻代,加大年老代,这样可以利用年老代的并发CMS收集器来减少响应时间。使用并发收集器,一般是最求吞吐量优先的应用,会加大年轻代,缩小年老代。这样可以在年轻代回收掉大部分短期对象,减少中期对象,而老年代只存少部分长时间存活的对象。(年老代的并发收集器使用标记,清除算法,所以不会对堆进行压缩.当收集器回收时,他会把相邻的空间进行合并,这样可以分配给较大的对象.但是,当堆空间较小时,运行一段时间以后,就会出现"内存碎片",如果并发收集器找不到足够的空间,那么并发收集器将会停止,然后使用传统的标记,清除方式进行回收.如果出现"碎片",可能需要进行如下配置:
-XX:+UseCMSCompactAtFullCollection:使用并发收集器时,开启对年老代的压缩.
-XX:CMSFullGCsBeforeCompaction=0:上面配置开启的情况下,这里设置多少次Full GC后,对年老代进行压缩
)5:调试的时候设置一些打印参数如:	-XX:+PrintClassHistogram -XX:+HeapOnOutOfMerroryError-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Xloggc:log/gc.log这样可以让jvm虚拟机打印出类加载的情况,堆转储的快照,GC的详细回收日志 等等日志信息6:当系统发生停顿的时候可能是GC的问题也可能是程序的问题,还有内存飙高,系统响应慢的时候,多利用jvm的监控工具实时注意jvm虚拟机的情况。 如可以通过jmap转储堆内存情况,通过jstack可以打印出线程的快照,在通过JProfiler或者JVisoulVM的分析工具进行分析。  -- 这里可以加入JVM调优案例7:仔细了解自己的应用,如果用了缓存,那么年老代应该大一些8:垃圾回收时promotion failed是个很头痛的问题,一般可能是两种原因产生
第一个原因是救助空间不够,救助空间里的对象还不应该被移动到年老代,但年轻代又有很多对象需要放入救助空间;第二个原因是年老代没有足够的空间接纳来自年轻代的对象;这两种情况都会转向Full GC,网站停顿时间较长。
第一个原因我的最终解决办法是去掉救助空间,
设置-XX:SurvivorRatio=65536 -XX:MaxTenuringThreshold=0即可第二个原因我的解决办法是设置CMSInitiatingOccupancyFraction为某个值(假设70),这样年老代空间到70%时就开始执行CMS,年老代有足够的空间接纳来自年轻代的对象。
服务器: centos 6.4    linux64位操作系统   8G内存:   70~80 B/S   低延迟    并发垃圾收集   CMS 每日百万PV,无压力:   $JAVA_ARGS .= " -Dresin.home=$SERVER_ROOT 
-server  
-Xms6000M    //堆初始值内存  
-Xmx6000M    //堆的最大内存     8G   70%
-Xmn500M     //新生代内存    CMS 老年代    3 / 8
-XX:PermSize=500M    //永久代初始值 M 
-XX:MaxPermSize=500M //永久代最大值 
-XX:SurvivorRatio=65536 //新生代救助区和Eden区比值这么设置实际上是去掉救助区
-XX:MaxTenuringThreshold=0  //新生代对象晋升老年的代年龄,设置0
-Xnoclassgc  //不开启class收集
-XX:+DisableExplicitGC  //禁止 System.gc()显示调用,防止手残党
-XX:+UseParNewGC       //年轻代垃圾收集器  ParNewGC
-XX:+UseConcMarkSweepGC   //年老代垃圾收集器 CMS
// ParNew + CMS (老年代)   +   Serial Old (担保)   STW
// CMS 无法收集时 会使用串行收集器  
// 标记 清除  会产生内存碎片  
-XX:+UseCMSCompactAtFullCollection  //开启内存压缩功能   
-XX:CMSFullGCsBeforeCompaction=0  // 几次FullGC后出发碎片清理
-XX:+CMSClassUnloadingEnabled   //开启永久代回收
-XX:-CMSParallelRemarkEnabled 
-XX:CMSInitiatingOccupancyFraction=80  //老年代占用多少时 进行老年代回收
// 调优参数的打印
-XX:+PrintClassHistogram  //打印class加载信息   
-XX:+PrintGCDetails  //打印GC详细信息 
-XX:+PrintGCTimeStamps  //打印GC时间戳信息
-XX:+PrintHeapAtGC   //打印GC 堆的信息
-Xloggc:log/gc.log "; // GC的日志的地址综合浏览量(PV):即Page View, 即页面浏览量或点击量,用户每次刷新即被计算一次。
并发连接数 = PV / 统计时间 * 页面衍生连接次数 * http响应时间 * 因数 / web服务器数量
页面衍生连接次数: 一个HTML页面可能会请求好几次http连接,如外部的css, js,图片等,可以估算一下,或者用10,可根据实际情况改变
http响应时间: 可以使用1秒或更少,可根据实际情况改变
因数: 一般使用5即可,可根据实际情况计算后推出
web服务器数量: web服务器数量(1000000PV / 86400秒 * 5个派生连接数 * 2秒内响应 * 5倍峰值) / 1台Web服务器  约 600左右并发~1000

JVM相关面试题汇总

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

类加载器(ClassLoader)
运行时数据区(Runtime Data Area)
执行引擎(Execution Engine)
本地库接口(Native Interface)
组件的作用: 首先通过类加载器(ClassLoader)会把 Java 代码转换成字节码,运行时数据区(Runtime Data Area)再把字节码加载到内存中,而字节码文件只是 JVM 的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),将字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用其他语言的本地库接口(Native Interface)来实现整个程序的功能

说一下 JVM 运行时数据区?详细介绍下每个区域的作用?

程序计数器(Program Counter Register):当前线程所执行的字节码的行号指示器
Java 虚拟机栈(Java Virtual Machine Stacks):用于存储局部变量表、操作数栈、动态链接、方法出口等信息;
本地方法栈(Native Method Stack):与虚拟机栈的作用是一样的,只不过虚拟机栈是服务 Java 方法的,而本地方法栈是为虚拟机调用 Native 方法服务的;
Java 堆(Java Heap):Java 虚拟机中内存最大的一块,是被所有线程共享的,几乎所有的对象实例都在这里分配内存;
方法区(Methed Area):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。

java中都有哪些类加载器

启动类加载器(Bootstrap ClassLoader)
扩展类加载器(Extension ClassLoader)
应用程序类加载器(Application ClassLoader)自定义类加载器:通过继承ClassLoader抽象类,实现loadClass方法

哪些情况会触发类加载机制

1.在遇到 new、putstatic、getstatic、invokestatic 字节码指令时,如果类尚未初始化,则需要先触发初始化。    
2.对类进行反射调用时,如果类还没有初始化,则需要先触发初始化。
3.初始化一个类时,如果其父类还没有初始化,则需要先初始化父类。
4.虚拟机启动时,用于需要指定一个包含 main() 方法的主类,虚拟机会先初始化这个主类。

什么是双亲委派模型?

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

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

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

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

一般有两种方法来判断:引用计数器:为每个对象创建一个引用计数,有对象引用时计数器 +1,引用被释放时计数 -1,当计数器为 0 时就可以被回收。它有一个缺点不能解决循环引用的问题;可达性分析:从 GC Roots 开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是可以被回收的。

哪些变量可以作为GC Roots

虚拟机栈中 (栈帧中的本地变量表) 引用的对象 
方法区中类静态属性引用的对象
方法区中常量的引用对象
本地方法栈中引用的对象

Java 中都有哪些引用类型?

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

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

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

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

Serial:最早的单线程串行垃圾回收器。
Serial Old:Serial 垃圾回收器的老年版本,同样也是单线程的,可以作为 CMS 垃圾回收器的备选预案。
ParNew:是 Serial 的多线程版本。
Parallel 和 ParNew 收集器类似是多线程的,但 Parallel 是吞吐量优先的收集器,可以牺牲等待时间换取系统的吞吐量。
Parallel Old 是 Parallel 老生代版本,Parallel 使用的是复制的内存回收算法,Parallel Old 使用的是标记-整理的内存回收算法。
CMS:一种以获得最短停顿时间为目标的收集器,非常适用 B/S 系统。
G1:一种兼顾吞吐量和停顿时间的 GC 实现,是 JDK 9 以后的默认 GC 选项。

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

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

Minor GC与Full GC分别在什么时候发生?

新生代内存不够用时候发生Minor GC也叫 Young GC,
老年代内存不够用时候发生Major GC也可以称为 Full GC 

有没有在生产环境下进行过JVM调优,说说过程?

基于 jmap + jprofiler 内存溢出问题排查, 使用 -Xmx -Xms设置调整堆大小基于 jstack + jconsole cpu飙高问题排查, 通过对栈快照定位代码问题基于 JVM 参数调优

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

-Xms2g:初始化推大小为 2g;
-Xmx2g:堆最大内存为 2g;
-Xmn500M 设置年轻代为500m;
-XX:PermSize=500M ;  1.8之后采用 MetaspaceSize
-XX:MaxPermSize=500M ;  1.8之后采用 MaxMetaspaceSize
-XX:NewRatio=4:设置年轻的和老年代的内存比例为 1:4;
-XX:SurvivorRatio=8:设置新生代 Eden 和 Survivor 比例为 8:2;
-XX:+UseConcMarkSweepGC:指定使用 CMS + Serial Old 垃圾回收器组合;
-XX:+PrintGC:开启打印 gc 信息;
-XX:+PrintGCDetails:打印 gc 详细信息。
-XX:MaxDirectMemorySize : 设置直接内存的大小

GC 选项。


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

分代回收器有两个分区:老生代和新生代,新生代默认的空间占比总空间的 1/3,老生代的默认占比是 2/3。

新生代使用的是复制算法,新生代里有 3 个分区:Eden、To Survivor、From Survivor,它们的默认占比是 8:1:1,它的执行流程如下:

所有新创建对象,都会在Eden区分配,当Eden装不下新对象时触发新生代的垃圾回收,
把 Eden + From Survivor 存活的对象复制到 To Survivor 区;
清空 Eden 和 From Survivor 分区;
From Survivor 和 To Survivor 分区交换,From Survivor 变 To Survivor,To Survivor 变 From Survivor。
每次在 From Survivor 到 To Survivor 移动时都存活的对象,年龄就 +1,当年龄到达 15(默认配置是 15)时,升级为老生代。大对象也会直接进入老生代。

老生代当空间占用到达某个值之后就会触发全局垃圾收回,一般使用标记整理的执行算法。以上这些循环往复就构成了整个分代垃圾回收的整体执行流程。


**Minor GC与Full GC分别在什么时候发生?**

新生代内存不够用时候发生Minor GC也叫 Young GC,
老年代内存不够用时候发生Major GC也可以称为 Full GC

**有没有在生产环境下进行过JVM调优,说说过程?**

基于 jmap + jprofiler 内存溢出问题排查, 使用 -Xmx -Xms设置调整堆大小

基于 jstack + jconsole cpu飙高问题排查, 通过对栈快照定位代码问题

基于 JVM 参数调优


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

-Xms2g:初始化推大小为 2g;
-Xmx2g:堆最大内存为 2g;
-Xmn500M 设置年轻代为500m;
-XX:PermSize=500M ; 1.8之后采用 MetaspaceSize
-XX:MaxPermSize=500M ; 1.8之后采用 MaxMetaspaceSize
-XX:NewRatio=4:设置年轻的和老年代的内存比例为 1:4;
-XX:SurvivorRatio=8:设置新生代 Eden 和 Survivor 比例为 8:2;
-XX:+UseConcMarkSweepGC:指定使用 CMS + Serial Old 垃圾回收器组合;
-XX:+PrintGC:开启打印 gc 信息;
-XX:+PrintGCDetails:打印 gc 详细信息。
-XX:MaxDirectMemorySize : 设置直接内存的大小


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

相关文章

  1. mac动画特效制作软件——Express Animate for mac

    Express Animate for mac是一种动画特效制作软件&#xff0c;使您能够对形状&#xff0c;文本和导入的图像进行动画处理。您还可以使用关键帧运动动画&#xff0c;蒙版&#xff0c;虚拟对象等来增强后期制作中的电影项目。 Express Animate for mac下载安装教程...

    2024/4/24 14:25:06
  2. postgreSQL——事务处理4

    2021SCSDUSC 目录 概述 事务操作函数 启动事务 总结 概述 上一周分析了postgreSQL事务中底层事务的数据结构&#xff0c;这一周打算分析一下和事务状态相关的事务操作函数。之前分析过改变事务块状态的函数&#xff08;BeginaTransactionBlock,EndTransactionBlock,UserA…...

    2024/4/21 17:10:04
  3. 2021-2027全球与中国麻醉气体清除系统市场现状及未来发展趋势

    【报告篇幅】&#xff1a;106 【报告图表数】&#xff1a;153 【报告出版时间】&#xff1a;2021年1月 报告摘要 2019年&#xff0c;全球麻醉气体清除系统市场规模达到了xx亿元&#xff0c;预计2026年将达到xx亿元&#xff0c;年复合增长率(CAGR)为xx%。 本报告研究全球与中国…...

    2024/5/2 16:48:25
  4. 回文数的形成。任取一个十进制整数,将其倒过来后与原来的整数相加,得到一个新的整数后,重复以上步骤,最终可得到一个回文数,请编程验证。

    回文数的形成。任取一个十进制整数&#xff0c;将其倒过来后与原来的整数相加&#xff0c;得到一个新的整数后&#xff0c;重复以上步骤&#xff0c;最终可得到一个回文数&#xff0c;请编程验证。 **输入格式要求&#xff1a;"%ld" 提示信息&#xff1a;"pleas…...

    2024/5/2 18:37:13
  5. 2.最后一个单词的长度59

    给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1&#xff1a; 输入&#xff1a;s “Hello World” 输出&#xff1a;5 示例 2&a…...

    2024/4/21 17:10:01
  6. 设置IDEA中全文搜索的File mask属性

    最近IDEA更换了2021.2版本&#xff0c;但使用过程中发现&#xff0c;查询时File masks选择框里是空的。百度了一下&#xff0c;找到了如何去配置&#xff0c;在此做下记录。 找到find.xml文件. 我的文件位置是在&#xff1a;C:\Users\user\AppData\Roaming\JetBrains\Intelli…...

    2024/4/21 17:10:02
  7. window新增右键快捷菜单项【regedit配置】

    本文以pycharm的使用为例&#xff0c;往往涉及三种打开文件方式&#xff1a; 1、右击file&#xff0c;打开快捷菜单&#xff0c;出现“Edit with PyCharm Community Edition”&#xff0c;可编辑单个文件。 2、右击directory&#xff0c;打开快捷菜单&#xff0c;出现“Open Fo…...

    2024/5/2 17:54:49
  8. Java开发可视化界面

    想之前Java有过很深的接触,但后来因为学了Python,因而好久没有学习Java这么语言,但今又有机会再次接触Java,所以一时令我想起了当初所学之Java,所以今天我特意给大家分享一个Java可视化开发的代码,这是一些小球从空中落下的动画,有助于Java初学者学习Java可视化界面的帮…...

    2024/5/2 14:50:03
  9. Go Template学习笔记

    快速开始 func handler(w http.ResponseWriter,r *http.Request){t : template.New("new template") //创建一个模板t,err : t.ParseFile("tpl/welcome.html",nil) //解析模板文件if err ! nil{panic(err.Error())}user : GetUser() //获取用户信息t.Execu…...

    2024/5/2 16:15:49
  10. 将多个文件合并为一个文件

    import pandas as pd import osFolder_Path rE:\Study\third\work\biaozhubiaoqian\align\train-align # 要拼接的文件夹及其完整路径&#xff0c;注意不要包含中文 SaveFile_Path rE:\Study\third\work\biaozhubiaoqian\align # 拼接后要保存的文件路径 SaveFile_Name ra…...

    2024/5/2 8:09:25
  11. 09*命名空间

    命名空间 命名空间可以解决两类问题&#xff1a;用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突给很长的标识符名称创建别名 定义命名空间 默认情况下&#xff0c;所有的常量、类和函数名都放在全局控件下&#xff0c;和PHP支持的命名空间之前一…...

    2024/4/20 14:05:04
  12. GodenDB分组排序

    select rownumber : case when groupName1 x.gn1 and groupName2 x.gn2 then (rownumber 1) else 1 end as 序号&#xff0c; groupName1 x.gn1, groupName2 x.gn2, x.* from tableName x, (select rownumber : 0, groupName1 "", groupName2 "&…...

    2024/4/20 14:05:03
  13. QT在线安装镜像

    在线安装 从链接&#xff1a;https://pan.baidu.com/s/12UTxEdFuzYbLHM6bvTn6Wg 提取码&#xff1a;afm3 下载在线安装器。 可以在安装器中配置使用科大源下载 Qt&#xff1a; &#xff08;推荐&#xff09;新版本的安装器&#xff08;4.0.1-1 后&#xff09;支持 --mirr…...

    2024/4/27 19:05:41
  14. es6 数组函数

    forEach遍历&#xff0c;map通过函数返回新数组&#xff08;数组长度不会少&#xff09;&#xff0c;filter过滤返回新数组&#xff08;数组长度会变少&#xff09;&#xff0c;some有一个为true,就返回true,every全部为true,才返回true reduce 返回求和或者求平均数 some、eve…...

    2024/4/20 14:05:01
  15. centos 一次 404 not found 排错经过

    本次项目原因&#xff1a; 目前公司有三套环境&#xff1a; 1、正式环境 2、测试环境 3、集成环境 新配小程序业务在正式/测试环境运行都正常&#xff0c;但配到本地集成环境服务器时报404 not found。 开始耗费脑细胞&#xff1a; 首先访问本地域名发现404是由php框架展…...

    2024/4/21 17:09:56
  16. 高级定时器输入捕获实验

    高级定时器输入捕获实验 高级定时器的输入捕获功能大致与通用定时器的输入捕获功能相同&#xff0c;在配置方面需要注意一下几个方面&#xff1a; 1.需要配置TIMx_RCR寄存器&#xff0c;产生更新中断需要溢出N1次&#xff0c;N为TIMx_RCR的值。 2.需要额外配置中断服务函数&a…...

    2024/4/24 22:58:22
  17. 项目启动报错:Can‘t create/write to file ‘./dev_20211015/act_id_user.frm~‘ (Errcode: 28 -

    项目启动报错&#xff1a;Can’t create/write to file ‘./dev_20211015/act_id_user.frm~’ (Errcode: 28 - 现场&#xff1a;在启动Springboot项目时&#xff0c;编译过程完好&#xff0c;但是在项目跑到一半时出现此类报错。 解决方案&#xff1a;使用<df -h>命令检…...

    2024/5/2 15:43:33
  18. Java 中操作字符串都有哪些类

    java中操作字符串的类有string&#xff0c;stringbuffer&#xff0c;stringbuilder。 string和stringbuffer&#xff0c;stringbuilder的区别在于 string声明的是一个不可变的对象&#xff0c;每一次操作都会生成新的对象&#xff0c;然后将指针指向新的对象&#xff1b;而str…...

    2024/5/2 15:58:24
  19. 无法解析 MVC 视图 ‘/user‘

    无法解析是因为找不到拼接的前后缀&#xff0c;所以无法跳转。忘记导入模板引擎依赖 在pom.xml添加这个依赖 <dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf-spring5</artifactId> </dependency> <dependency&g…...

    2024/4/29 19:32:38
  20. Mac临时文件存储助手——Yoink for Mac

    在 Mac 系统中拖放文件感觉很不方便的话&#xff0c;强烈推荐你试试 Yoink 这个小程序。Yoink(临时文件存储助手) for Mac是一款适用于苹果电脑Mac os平台的临时文件存储助手&#xff0c;可以帮助用户更好的管理屏幕上的文件。 Yoink for Mac下载安装教程...

    2024/4/21 17:09:50

最新文章

  1. [Python基础知识]05函数和模块

    一、函数的定义 格式&#xff1a;def 函数名&#xff08;参数列表&#xff09;: 注&#xff1a; 函数代码块以 def 关键词开头&#xff0c;后接函数标识符名称和圆括号()。即使该函数不需要接收任何参数&#xff0c;也必须保留一对空的圆括号 函数形参不需要声明其类型&#x…...

    2024/5/2 18:37:30
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/3/20 10:50:27
  3. 第十三届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组 题解

    VP比赛链接 : 数据加载中... - 蓝桥云课 1 . 九进制 转 十进制 直接模拟就好了 #include <iostream> using namespace std; int main() {// 请在此输入您的代码int x 22*92*81*9;cout << x << endl ;return 0; } 2 . 顺子日期 枚举出每个情况即可 : …...

    2024/4/30 1:59:34
  4. Linux——gdb

    gdb调试 (1)debug版本: 在编译阶段会加入某些调试信息; 调试信息是在编译的过程中加入到中间文件.o文件的; gcc -c main.c -g:生成包含调试信息的中间文件 gcc -o main main.o 一步执行:gcc -o main main.c -g (1) (2)release版本: 发行版本,没有调试信息; gcc默认生成relea…...

    2024/5/2 2:33:15
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/2 16:16:39
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/2 9:28:15
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/2 15:04:34
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/2 9:07:46
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  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