垃圾回收算法

引用计数器法(Reference Counting)

可达性分析

标记清除算法(Mark-Sweep)

  • 这个算法的原理很简单,但是它却是其他算法的基础,后续的其他算法否是在这个算法的基础上,针对它的不足,进行改造。

标记阶段

  • 每一个可以从根对象访问到的对象都会被添加一个标识,于是这个对象就被标识为可到达对象——存活对象,将来垃圾回收的时候不会被回收。
在深入了解JVM最佳实践第二版中,是写的标记需要回收的对象,但是这里我认为标记的是可达的对象,因为可达性分析无法找到不可达的对象,所以没有被标记的就是我们要回收的对象。

清除阶段

  • 垃圾回收器,会对堆内存从头到尾进行线性遍历,如果发现有对象没有被标识为可到达对象,那么就将此对象占用的内存回收,并且将原来标记为可到达对象的标识清除,以便进行下一次垃圾回收操作

优缺点

优点

  • 实现简单,适用于存活对象比较多的情况(老年代)。

缺点

两边扫描效率偏低
回收之后内存碎片化,必须使用空闲列表的方式去分配内存
  • 效率问题:标记和清除过程的效率都不高(主要体现在清除阶段需要一个一个的遍历整个堆空间的对象,让后清除掉垃圾对象);而且需要两次遍历,第一次遍历标记存活对象,第二次遍历清除死亡对象
  • 空间问题:标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致,碎片过多会导致大对象无法分配到足够的连续内存,从而不得不提前触发GC,甚至Stop The World。

复制算法(Coping)

  • 为了解决标记清除算法的空间问题和效率问题,复制算法将内存分为两块,每次只使用其中一块内存,当这块内存使用完了,就将这块内存上的对象,全部复制到另一块上,然后把当前这一块内存一次性回收清理,这样每次回收都是对整个半区进行操作,既解决了效率问题也解决了内存碎片
  • 效率体现在一次回收整个内存区域的一半,而不是每次一块一块的回收;空间问题体现在,一次回收之后,只少有一半的内存是规整的,可以分配给打对象;并且由于内存是规整的,分配内存的时候也更加的高效,可以采取"指针碰撞"的方法进行分配;
  • 由于是复制过去的,所以复制的时候我们也可以对复制过来的对象内存分配进行优化,使其变得规整。
当有效内存空间耗尽时,JVM将暂停程序运行,开启复制算法GC线程。接下来GC线程会将活动区间内的存活对象,全部复制到空闲区间,且严格按照内存地址依次排列,与此同时,GC线程将更新存活对象的内存引用地址指向新的内存地址。

复制阶段

清除阶段

优缺点

优点

  • 解决了标记清除算法的效率问题和内存碎片问题,并且只需要扫描一次(直接复制存活对象),而且回收的时候一次回收一半的内存空间,非常高效。
  • 适用于对象比较多但是存活对象比较少的情况(新生代)

缺点

  • 浪费内存,复制算法要求整块内存只能使用一半,另外一半留作备用。后面有针对这个问题的优化。
  • 在存活对象比较多(对象存活率比较高)的时候,就要进行较多的复制操作,效率也会变低。
  • 移动对象需要调整对象的引用(Java 采用的是指针的方式进行对象定位的,所以要更新对象的引用,但是这种方式比起句柄更加高效)

标记整理算法(Mark-Compact)

  • 针对复制算法,在对想存活率比较高的情况下,效率会变低的问题进行优化
  • 标记整理算法和标记清除算法的标记阶段一样,但是后续阶段不一样,不是直接清除,而是将存活的对象移动到内存区域的一端,然后从边界开始清理,清理掉剩余的内存部分。
标记-整理算法不仅可以弥补标记-清除算法当中,内存区域分散的缺点,也消除了复制算法当中,内存减半的高额代价

优缺点

缺点

  • 标记-整理算法唯一的缺点就是效率也不高,不仅要标记所有存活对象,还要整理所有存活对象的引用地址。从效率上来说,标记-整理算法要低于复制算法

优点

  • 回收后的内存空间没有碎片。
  • 无内存折半
  • 应用:老年代回收

总结

垃圾回收算法内存是否规整内存分配方式优势不足适用场景
Mark-Swap(标记清除)空闲列表实现简单内存碎片,效率较低存活时间比较长
Copy(复制算法)指针碰撞效率较高、内存规整空间浪费存活时间比较短,存活对象比较少
Mark-Compact(标记压缩)指针碰撞内存规整,内存利用率高效率较低存活时间比较长

分代垃圾回收(Generational Collecting )

弱代理论

分代垃圾收集基于弱代理论。具体描述如下:

  • 大多说分配了内存的对象并不会存活太长时间,在处于年轻时代就会死掉。
  • 很少有对象会从老年代变成年轻代。
  • 新生代98%的对象都是"朝生夕死";所以并不需要按1:1比例来划分内存(解决了标记复制算法的一半的内存浪费)
弱代理论,是基于IBM公司的一项研究结果上提出的。所以在弱代理论的支持下,Hotspot虚拟机优改进了复制算法的不足——浪费一半的内存问题

意义

  • 首先就是分代回收可以对堆中对象采用不同的gc策略。在实际程序中,对象的生命周期有长有短。进行分代垃圾回收,能针对这个特点做很好的优化
  • 分代以后,gc时进行可达性分析的范围能大大降低。在分代回收中,新生代的规模比老年代小,回收频率也要高,显然新生代gc的时候不能去遍历老年代。

Hotspot虚拟机新生代内存布局及算法

上面的复制算法中,我们看到复制算法存在连个问题,第一个问题 是内存浪费的问题,在弱代理论的支持下,在一定程度上降低了内存的浪费,
第二个问题是复制算法在,对象存活率比较高的情况下,会降低效率——大量的复制。所以复制算法仅仅用在了新生代上。
  • 新生代内存分配一块较大的Eden空间和两块较小的Survivor空间
  • 每次使用Eden和其中一块Survivor空间
  • 回收时将Eden和Survivor空间中存活的对象一次性复制到另一块Survivor空间上
  • 最后清理掉Eden和使用过的Survivor空间。
Hotspot虚拟机默认Eden和Survivor的大小比例是8:1

分配担保机制(ndle Promotion)

  • 在弱代理论的支持下,我们将复制算法用在了新生代上,在存活率比较低的情况下,通过复制少量存活对象和调节复制算法的内存分配比例,很好的解决了复制算法存在的两个问题,但是又引入了一个新的问题。
  • 如果另一块Survivor空间没有足够内存来存放上一次新生代收集下来的存活对象,那么这些对象则直接通过担保机制进入老年代——这个机制就是内存担保机制。
  • 这是因为我们改变了复制算法的内存分配比例,默认在1:1 的情况下就不存在这个问题,复制过来的对象肯定在预留的一半内存放的下,但是当我们改变了这个比例之后,我们假设98%的对象都会在垃圾回收的时候死掉,但是这个一个概率问题、并且只是适用与一般情况,我们无法保证每次回收之后都只有不少于10% 的对象存活,所以我们需要分配担保——担保这些对象可以存的下(其实这就是为什么你给固定的堆内存,jvm为什么分配给老年代比年轻代多的原因之一 )

  • 在默认情况下,年轻代与老年代的比例是1:2 这里给的总共内存是30M,年轻代10M,老年代20M,你看到年轻代是9M,是因为10M 的内存之,只有90%是可以用的,也就是 一个Eden加一个 Survivor。

分代垃圾回收算法

  • 分代垃圾回收算法其实并没有什么新的思想,只是根据对象存活周期的不同将内存划分为几块,这样就可以根据各个年代的特点采用最适当的收集算法;
  • 一般把Java堆分为新生代和老年代

新生代复制算法

  • 每次垃圾收集都有大批对象死去,只有少量存活——所以可采用复制算法,只要付出少量的复制成本就可以完成垃圾回收,但是依然得有分配担保机制的存在。

老年代整理或者清除

  • 对象存活率高,没有额外的空间可以分配担保,使用标记-清理或标记-整理算法;

对象在分代垃圾回收算法下的行为

对象年龄的增长

  • 虚拟机采用分代收集的思想来管理内存,内存回收时必须识别哪些对象放入新生代,哪些对象放入老年代。为了做到这点,虚拟机为每个对象定义了一个对象年龄计数器
  • 如果对象在Eden出生并经过一次Minor GC仍然存活,并且能被Survivor容纳,将被移动到Survivor区,并且对象年龄设置为1.对象每经过一次Minor GC后仍保持存活,年龄+1
    • 如果不能被Survivor容纳,根据分配担保机制,则直接升级到老年代,如果老年代不能容纳,则触发 full-gc
  • 当对象年龄到达一定程度(一般15岁),那么它会在下一次垃圾回收的时候会晋升到老年代,这个时候不论Survivor 区间是否足够。对象晋升的年龄限制 -XX:MaxTenuringThreshold设定

对象的晋升细节

对象年龄的动态判定

  • 为了更好的适应不同程度的内存状况,虚拟机并不是永远地要求对象的年龄必须到达MaxTenuringThreshold才能晋升进入老年代,当Survivor中相同年龄所有对象大小总和大于Survivor空间一半,年龄大于该年龄的对象直接进入老年代

空间的担保分配

  • 其实前面提到过,为什么要有空间分配担保机制,因为默认的复制算法存在50% 的内存浪费,为了解决这个问题虚拟机将内存空间不是按照对半空间进行划分的,在弱代理论的支持下,进行了8:1:1 的划分,至于为什么是8:1:1而不是 9:1 或者 8:2 是为了完成年龄的判定。
  • 在发生Minor GC之前,虚拟机会检查老年代最大可用的连续空间是否大于新生代所有空间总和,如果条件程离,那么Minor GC是安全的,如果不成立,则虚拟机会查看HandlePromotionFailure设置值是否允许担保失败。如果允许,那么会继续检查老年代最大可用连续空间是否大于历次晋升到老年代对象的平均大小,如果大于则进行Minor GC 否则可能进行一次Full GC
  • 新生代使用复制收集算法,但为了内存利用率,只使用其中一个Survivor空间作为轮换备份,因此当出现大量对象在Minor GC仍然存活的情况(最极端情况为内存回收后新生代所有对象都存活),就需要老年代进行担保,把Survivor无法容纳的对象存入老年代。但老年代需要足够空间,所以需要进行判断,当不足时 进行Full GC腾出老年代空间

minor gc 和 full gc

  • 不同的垃圾回收器关于这个两个概念不太一样,不一样主要体现在老年代上
  • 不论是怎样的gc,导致发生的原因就是堆空间不足,无法容纳要分配或者要移动的对象

minor gc

  • serial、parallel、cms、G1 因为年轻代内存空间不足引起的垃圾回收行为叫做minor gc
minor gc 执行的时机
  • 当JVM 无法为一个新生的对象分配内存的时候,就会触发minor gc ,所以分配率越高,内存越少,执行minor gc 就越频繁

major gc

  • 清理老年代,当eden 区内存不足的时候触发
触发时机

full gc

  • serial、parallel 因为老年代内存不足就叫full gc
  • cms 老年代垃圾并发回收失败之后,退化为串行gc 之后叫做full gc否则就是并发收集(观察日志看到full gc 相关信息)
  • g1 老年代中
触发时机
  • 老年代内存不足的时候

卡表(Card Table)

  • 一个比特位集合,每一个比特位表示老年代的某一区域中的对象是否持有新生代的引用。新生代GC时,根据卡表扫描老年代对象,而避免扫描所有老年代对象。下图,每一位表示老年代4KB的空间。

分区算法(Region)

  • 将堆划分成连续的不同小区间,每个小区间都独立使用、独立回收
  • 可控制每次回收的小区间个数,避免回收整个堆,减少GC停顿时间。

分代垃圾回收在虚拟机上的实现

  • JVM进行垃圾回收是一个非常复杂的过程,如何进行垃圾标记、什么时候进行垃圾、如何进行垃圾回收等等都非常复杂,当前主流测JVM在垃圾回收时都会进行STW(stop the world),即使宣称非常快的CMS垃圾回收期早期也会STW标记垃圾状态。

枚举 GC ROORTS

  • 枚举出这个GC Roots我们需要考虑到这个分析过程所产生结果的准确性及枚举效率

STW

  • 可达性分析的过程,需要在一个能保证一致性的快照中进行,这里的一致性是指在整个可达性分析的过程中这个系统像是被冻结了,引用和对象的关系不在发生变化,如果不能满足该条件,就不能保证分析结果的正确性,导致有引用的对象被垃圾回收。这一点也是GC进行时必须停顿所有执行线程的一个重要原因
  • 其实这个就像是,你妈妈在打扫房间的时候,你还在向地上扔垃圾一样,这种情况下,房间就永远打扫不完了。
  • 多线程下的漏报和误报是导致STW的根本原因(还有一个原因就是考虑到效率)

关于STW

  • GC 停顿会拖慢应用程序,在外界看来,它就像冻住了一样。在 GC 停顿期间发给服务器的请求会更晚收到响应,根据停顿时间的不同(传统的 GC 停顿有可能达到几十秒),客户端有可能会出现超时。如果客户端进行重试,服务器端就会有更多待处理的请求,这个时候需要使用断路器。
  • 长时间的 GC 停顿也可能造成服务的健康检测失效,并导致服务被重启。而在一个服务重启期间,其他服务需要承担更多的负载,它们所经历的停顿会更长,这就像是一个恶性循环。
  • 不可预测的 GC 停顿给系统带来的影响远远超过了应用程序本身。客户端出现回压,请求队列溢出,监控控制台满是各种超时异常,运维人员忙得团团转。对于一个可以应对各种情况的系统来说,需要在 CPU 时间、队列长度、可接受的响应时间方面具备缓冲能力。

多线程下的漏报和误报

  • 如果没有STW 提供的一致性快照环境——对象和引用的关系不再发生变化,将会出现误报和漏报
  • 我们知道可达性分析标记的是对象的引用(详情可见上一章),如果被标记则说明被标记引用的对象是有用的,不能被回收,否则则是垃圾,应该被回收。
  • 标记的漏报和误报针对的是标记出来的引用而言,所以误报就是将本该被回收的对象标记了下来,漏报就是将不该被回收的对象没有标记。
误报
  • 在标记的时候,由于需要标记的对象比较多,需要一定的时间,假设这个时候已经标记了一半了,还在标记剩余的一半,这个时候有一个线程将自己的一个引用置为null了,并且这个引用是在已经标记完成的那一半中的,这个时候就会出现误报——本该是垃圾被回收的,现在标记成了存活。

漏报
  • 其实就是标记已经结束了,这个时候其他线程创建了对象,但是这个对象的引用没有被标记,然后在垃圾回收的时候,这个对象就被回收掉了。

准确式GC

  • Java虚拟机是利用可达性算法判断对象是否需要回收的,由于在GC进行时,必须暂停所有的Java执行线程(Sun称之为“Stop The World”),所以,虚拟机必须尽量的优化GC过程的效率,减少暂停的时间。
  • GC ROOTS 主要存在全局性引用和执行上下文,现在很多应用程序的方法区都很大动辄几百兆,当执行系统停顿下来后,我们不需要一个不漏地检查完所有执行上下文和全局的引用位置,因为在这种情况下枚举完整个GC ROOTS 势必浪费很多时间,并且在枚举的过程中还要求STW

准确式GC的定义

  • HotSpot采用了准确式GC以提升GC roots的枚举速度。所谓准确式GC,就是让JVM知道内存中某位置数据的类型什么。比如当前内存位置中的数据究竟是一个整型变量还是一个引用类型。这样JVM可以很快确定所有引用类型的位置,从而更有针对性的进行GC roots枚举。
  • 在HotSpot的实现中,是使用一组称为OOPMap的数据结构来达到这个目的的,当类加载完成后,HotSpot就将对象内存布局之中什么偏移量上数值是一个什么样的类型的数据这些信息存放到 OopMap中;在 HotSpot 的 JIT 编译过程中,同样会插入相关指令来标明哪些位置存放的是对象引用等
  • 这样,GC在扫描的时候,就可以根据OOPMap上记录的信息准确定位到哪个区域中有对象的引用,这样大大减少了通过逐个遍历来找出对象引用的时间消耗,从而快速的完成 GC Roots 的枚举。

安全点

  • 在Oopmap的帮助下,HotSpot虚拟机可以准确快速的完成GCROORTS的枚举,但是一个很现实的问题随之而来,随着程序的运行与垃圾回收和内存分配,引用关系在发生变化,要想准确的知道引用和对象类型就必须为每一条指令都生成一个OopMap,如果为每条指令都插入oopmap,那么将会产生大量的内存损耗。

  • 为了准确安全地回收内存,JVM是在SafePoint点时才进行回收,所谓SafePoint就是Java线程执行到某个位置这时候JVM能够安全、可控的回收对象,这样就不会导致上所说的回收正在使用的对象。

  • JVM使用的是主动性主动到达安全点,那么应该在什么地方设置全局变量呢?显然不能随意设置全局变量,进入安全点有个默认策略那就是:“避免程序长时间运行而不进入Safe Point”

安全点的选取原则

  • 程序在执行时,并非在所有的地方都能停下来开始GC,只有到达这个“安全点“时才能停顿下来。安全点的选区既不能太少以至于让GC等待时间过长,也不能过于频繁以至于过分增大运行时的负荷。
  • 安全点“的选择基本上是以程序”是否具有让程序长时间执行的特征“为标准来选定的。因为每条执行指令执行的时间都非常地短暂,程序不太可能因为指令流长度太长这个原因而过长时间运行,而程序”长时间的运行“实际上就是指令序列的一个复用。例如方法调用、循环跳转、异常跳转等,所以具有这些功能的指令才会产生”安全点“

安全点的位置

从线程角度看,safepoint可以理解成是在代码执行过程中的一些特殊位置,当线程执行到这些位置的时候,说明虚拟机当前的状态是安全的,如果有需要,可以在这个位置暂停,
比如发生GC时,需要暂停所有活动线程,但是该线程在这个时刻,还没有执行到一个安全点,所以该线程应该继续执行,到达下一个安全点的时候暂停,然后才开始GC,该线程等待GC结束。
  • 循环的末尾
  • 方法返回前
  • 调用方法的call之后
  • 抛出异常的位置

安全区域

加入垃圾回收队列

直接回收

对象自救

  • 重写了finalize()方法的对象,如果finalize()没有被执行,在加入了垃圾队列后执行该方法将不会被回收

垃圾回收器(算法的实现)

  • serial收集器、parnew收集器、parallel scavenge收集器、serial old 收集器、parallel old收集器、cms收集器、g1收集器
新生代收集器:Serial、ParNew、Parallel Scavenge
老年代收集器:CMS、Serial Old、Parallel Old
整堆收集器: G1

相关概念

  • 并行收集(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍处于等待状态。
  • 并发收集(concurrent):指用户线程与垃圾收集线程同时工作(不一定是并行的可能会交替执行)。用户程序在继续运行,而垃圾收集程序运行在另一个CPU上。
  • 吞吐量:即CPU用于运行用户代码的时间与CPU总消耗时间的比值(吞吐量 = 运行用户代码时间 / ( 运行用户代码时间 + 垃圾收集时间 ))。例如:虚拟机共运行100分钟,垃圾收集器花掉1分钟,那么吞吐量就是99%

垃圾回收器

  • 如果说收集算法是内存回收的方法论,那么垃圾收集器就是方法论的实现
  • 虚拟机规范并没对垃圾回收器的实现做任何规定,因此不同的厂商的实现、不同版本之间的垃圾回收器可能存在很大差别。
  • 不同的垃圾回收器有不同的针对场景,没有一个放之四海而皆准的的收集器的存在,所以我们要根据应用的特点选一个最合适的组合(其实也不一定是组合)。
  • 垃圾收集器的发展,都是朝着增大吞吐量和减少停顿时间的方向发展。

Serial

  • 它是一个单线程垃圾回收器,也会要求STW
  • 这里的单线程的意义
    • 只会使用一个线程去完成GC(后面会减少使用多个线程区进行垃圾回收的垃圾回收器)
    • 在它工作时,必须暂停其他所有的工作线程
  • 该收集器也存在的原因是因为简单而高效(与其他收集器的单线程比),对于限定单个CPU的环境来说,没有线程交互的开销,专心做GC,自然可以获得最高的单线程效率。
  • Serial收集器对于运行在client模式下的应用是一个很好的选择(到目前为止,它依然是虚拟机运行在client模式下的默认新生代收集器)
  • 在用户的桌面应用场景中,可用内存一般不大(几十M至一两百M),可以在较短时间内完成垃圾收集(几十MS至一百多MS),只要不频繁发生,这是可以接受的

ParNew

  • ParNew收集器其实就是Serial收集器的多线程版本,除了使用多线程进行垃圾收集外,其余行为(控制参数、收集算法、回收策略等等)和Serial收集器完全一样。
  • 它是许多运行在Server模式下的虚拟机的首要选择,主要是因为除了Serial收集器外,目前只有它能与CMS收集器配合工作。这就是为什么有了Parallel Scavenge,还要有 ParNew 的原因
CMS收集器是一个被认为具有划时代意义的并发的老年代垃圾收集器,因此如果有一个垃圾收集器能和它一起搭配使用让其更加完美,那这个收集器必然也是一个不可或缺的部分了。
ParNew不能与CMS收集器配合因为Parallel Scavenge(以及G1)都没有使用传统的GC收集器代码框架,而另外独立实现;而其余几种收集器则共用了部分的框架代码;

Parallel Scavenge

  • Parallel Scavenge收集器是一个新生代收集器,它也是使用复制算法的收集器,又是并行的多线程收集器。
  • Parallel Scavenge收集器关注点是吞吐量(如何高效率的利用CPU)。CMS等垃圾收集器的关注点更多的是用户线程的停顿时间(提高用户体验)。
  • 所谓吞吐量就是CPU中用于运行用户代码的时间与CPU总消耗时间的比值。(吞吐量:CPU用于用户代码的时间/CPU总消耗时间的比值,即=运行用户代码的时间/(运行用户代码时间+垃圾收集时间)。比如,虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。)
  • Parallel Scavenge收集器提供了很多参数供用户找到最合适的停顿时间或最大吞吐量,如果对于收集器运作不太了解的话,不进行手工优化,可以选择把内存管理优化交给虚拟机去完成,用户只要提供一个优化目标,让虚拟机自己去朝这个目标进行优化。

适用场景

  • 高吞吐量为目标,即减少垃圾收集时间,让用户代码获得更长的运行时间;
  • 当应用程序运行在具有多个CPU上,对暂停时间没有特别高的要求时,即程序主要在后台进行计算,而不需要与用户进行太多交互;
  • 例如,那些执行批量处理、订单处理(对账等)、工资支付、科学计算的应用程序;

参数设置

  • -XX:MaxGCPauseMillis 控制最大垃圾收集停顿时间
  • 设置垃圾收集时间占总时间的比率 -XX:GCTimeRatio
  • GC自适应的调节策略 -XX:+UseAdptiveSizePolicy

适用推荐

开启这个参数后,就不用手工指定一些细节参数,如:

  • 新生代的大小(-Xmn)、Eden与Survivor区的比例(-XX:SurvivorRation)、晋升老年代的对象年龄(-XX:PretenureSizeThreshold)等;
  • JVM会根据当前系统运行情况收集性能监控信息,动态调整这些参数,以提供最合适的停顿时间或最大的吞吐量,这种调节方式称为GC自适应的调节策略(GC Ergonomics);
(1)、只需设置好内存数据大小(如"-Xmx"设置最大堆);
(2)、然后使用"-XX:MaxGCPauseMillis"或"-XX:GCTimeRatio"给JVM设置一个优化目标;
(3)、那些具体细节参数的调节就由JVM自适应完成;;

Serial Old

  • Serial收集器的老年代版本,它同样是一个单线程收集器。
  • 它主要有两大用途:一种用途是在JDK1.5以及以前的版本中与Parallel Scavenge收集器搭配使用,另一种用途是作为CMS收集器的后备方案
  • 采用"标记-整理-压缩"算法(Mark-Sweep-Compact);

应用场景

  1. 主要用于Client模式;
  2. 而在Server模式有两大用途:
    • 在JDK1.5及之前,与Parallel Scavenge收集器搭配使用(JDK1.6有Parallel Old收集器可搭配Parallel Scavenge收集器);
    • 作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用;

Parallel Old收集器

  • Parallel Scavenge收集器的老年代版本。
  • 使用多线程和“标记-整理”算法。在注重吞吐量以及CPU资源的场合,都可以优先考虑 Parallel Scavenge收集器和Parallel Old收集器。
    在JDK1.6才有的。

应用场景

  • JDK1.6及之后用来代替老年代的Serial Old收集器;
  • 特别是在Server模式,多CPU的情况下;这样在注重吞吐量以及CPU资源敏感的场景,就有了Parallel Scavenge(新生代)加Parallel Old(老年代)收集器的"给力"应用组合;

CMS

  • 跨时代的产品,特别长的STW,现在只有初始标记的STW
  • 适用于在线服务场景的情况
  • 在cms 之后的垃圾回收器主要在并发标记阶段发力,缩短这个阶段的运行时间
  • 扩展阅读,三色标记算法
  • cms 存在的问题比较多,所以不是虚拟机的默认垃圾回收器,需要手动指定
  • 在1.7 或者 1.8 的时候G1 还不是很完善

标记阶段

初始标记
  • 直接标记GC Roots 直接可达的存活对象
并发标记
  • 从初始标记存活的对象,进行并发标记,这个阶段是最费时间的(这个时候程序正在运行,就有对象和引用的变化就是前面说的漏报和误报,这个主要是漏报,就是垃圾变成非垃圾)
重新标记
  • 由于并发标记运行阶段的对象和引用关系的变化,所以重新标记阶段就是对并发标记阶段的变化进行处理
  • 这个阶段是需要一个比较准确的标记结果的,所以是STW 的
并发清理
  • 并发清理阶段产生的垃圾叫做浮动垃圾

缺点

  • 1.cms堆cpu特别敏感,cms运行线程和应用程序并发执行需要多核cpu,如果cpu核数多的话可以发挥它并发执行的优势,但是cms默认配置启动的时候垃圾线程数为 (cpu数量+3)/4,它的性能很容易受cpu核数影响,当cpu的数目少的时候比如说为为2核,如果这个时候cpu运算压力比较大,还要分一半给cms运作,这可能会很大程度的影响到计算机性能。
  • cms无法处理浮动垃圾,可能导致Concurrent Mode Failure(并发模式故障)而触发full GC
  • .由于cms是采用"标记-清除“算法,因此就会存在垃圾碎片的问题,为了解决这个问题cms提供了
浮动垃圾:由于cms支持运行的时候用户线程也在运行,程序运行的时候会产生新的垃圾,这里产生的垃圾就是浮动垃圾,cms无法当次处理,得等下次才可以。
  • -XX:+UseCMSCompactAtFullCollection选项,这个选项相当于一个开关【默认开启】,用于CMS顶不住要进行full GC时开启内存碎片合并,内存整理的过程是无法并发的,且开启这个选项会影响性能(比如停顿时间变长)

G1

  • G1 成为 Java 9 的默认垃圾回收器
  • G1的特别之处在于它强化了分区,弱化了分代的概念,是区域化、增量式的收集器,它不属于新生代也不属于老年代收集器。

G1 的特性

  • 并行性:G1在回收期间,可以由多个GC线程同时工作,有效利用多核计算能力。
  • 并发性:G1拥有与应用程序交替执行的能力,因此一般来说,不会在整个回收期间完全阻塞应用程序。
  • 分代GC:与之前回收器不同,其他回收器,它们要么工作在年轻代要么工作在老年代。G1可以同时兼顾年轻代与老年代。
  • 空间整理:G1在回收过程中,会进行适当的对象移动,不像CMS,只是简单的标记清除,在若干次GC后CMS必须进行一次碎片整理,G1在每次回收时都会有效的复制对象,减少空间碎片

G1 垃圾回收的阶段

初始标记

  • 标记从根节点直接可达的对象。这个阶段会伴随一次新生代GC,它是会产生全局停顿的,应用程序在这个阶段必须停止执行。

根区域扫描

  • 由于初始标记必然会伴随一次新生代GC,所以在初始化标记后,eden被清空,并且存活对象被移到survivor区。在这个阶段,将扫描由survivor区直接可达的老年代区域,并标记这些直接可达的对象。
  • 这个过程是可以和应用程序并发执行的。但是根区域扫描不能和新生代GC同时发生(因为根区域扫描依赖survivor区的对象,而新生代GC会修改这个区域),故如果恰巧此时需要新生代GC,GC就需要等待根区域扫描结束后才能进行,如果发生这种情况,这次新生代GC的时间就会延长

并发标记

  • 和CMS类似,并发标记将会扫描并查找整个堆的存活对象,并做好标记。这是一个并发过程,并且这个过程可以被一次新生代GC打断。

重新标记

  • 和CMS一样,重新标记也是会使应用程序停顿,由于在并发标记过程中,应用程序依然运行,因此标记结果可能需要修正,所以在此阶段对上一次标记进行补充。
  • 在G1中,这个过程使用SATB(Snapshot-At-The-Begining)算法完成,即G1会在标记之初为存活对象创建一个快照,这个快照有助于加速重新标记的速度。
全称是Snapshot-At-The-Beginning,由字面理解,是GC开始时活着的对象的一个快照。它是通过RootTracing得到的,作用是维持并发GC的正确性。
  • G1 Remark阶段 Stop The World 与 CMS了的remark有一个本质上的区别,那就是这个暂停只需要扫描有 write barrier 所追中对象为根的对象, 而 CMS 的remark 需要重新扫描整个根集合,因而CMS remark有可能会非常慢

独占清理

  • 这个阶段会引起停顿。它将计算各个区域的存活对象和GC回收比例并进行排序,识别可供混合回收的区域。在这个阶段,还会更新记忆集。该阶段给出了需要被混合回收的区域并进行了标记,在混合回收阶段,需要这些信息。

并发清理阶段

  • 识别并清理完全空闲的区域。它是并发的清理,不会引起停顿

ZGC

Shenandoah

  • Shenandoah GC 是最新的 JVM 垃圾回收器,由 Red Hat 的一个团队负责开发。垃圾回收器的并发性是指在应用程序运行的同时进行垃圾回收,而这就是 Shenandoah 的目标——最小化垃圾回收对用户代码造成的停顿。Shenandoah 的另一个设计目标是可以处理大堆和小堆。

经典GC

  • 经典 GC(也叫作 STW,Stop-The-World)会在没有可用内存时暂停应用程序线程,回收垃圾,并压缩存活的对象,然后让应用程序继续执行。这种停顿有可能长达几十秒,而且会随着堆的增大而延长。

Shenandoah GC

  • Shenandoah GC 也会造成 STW 停顿,但通常都很短暂,因为它是在应用程序运行的同时执行大量的 GC。这种停顿不会随着堆的增大而延长。
  • Shenandoah GC 没有分代的概念,所以它需要在每次回收周期里对存活对象进行标记(分代 GC 不需要这个操作)。不过反过来,Shenandoah 也避免了分代 GC 的一些额外的工作负载
  • Shenandoah GC 的并发性是以降低应用程序的吞吐量为代价。
  • Shenandoah是一款concurrent及parallel的垃圾收集器
  • 跟ZGC一样也是面向low-pause-time的垃圾收集器,不过ZGC是基于colored pointers来实现,而Shenandoah GC是基于brooks pointers来实现
  • 与G1 GC相比,G1的evacuation是parallel的但不是concurrent,而Shenandoah的evacuation是concurrent,因而能更好地减少pause time
吞吐量的降低是可预测的,而且很容易做出应对计划。例如,如果你发现应用程序的运行速度慢了 10%,那就增加 10% 的服务器。而 GC 停顿发生得非常迅速,你无法针对它们进行“自动伸缩”,你能做的是为它们分配额外的资源,这些资源在大部分时间是闲置的,造成了金钱的浪费。

垃圾回收器总结

目标垃圾回收器说明
串性垃圾回收器Serial适用于客户端或者client 模式运行的虚拟机
高吞吐垃圾回收器Parallel注重吞吐量的垃圾回收器
低延迟垃圾回收器CMS注重低延迟的垃圾回收器

PS+PO => 加内存换垃圾回收器 => PN+CMS+SerialOld (因为Parallel 的STW 的停留时间是在是太长了),但是当升级失败之后,SerialOld 就很恐怖了,在大内存的情况下,单线程可能要回收几个小时甚至几天。

G1 几十个G 的堆内存
ZGC 上T 的内存

  • 在单线程的环境下,Serial 最强
  • 在吞吐量优先的情况下Parrallel 最强
  • 其他垃圾回收器都是针对响应时间的

垃圾回收器的指定与默认组合

  • 首先 java -version 看一下你的jvm 是不是以server 模式运行,大多数都是的,所以下面的都是基于server 模式运行的jvm 而言的
(base) kingcall:~ XXX$ java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
  • 基本代码
public class EdenAllocation {public static void main(String[] args) {edenAllocation();}public static void edenAllocation(){byte[] a1, a2, a3, a4;a1 = new byte[2 * _MB];a2 = new byte[2 * _MB];a3 = new byte[2 * _MB];a4 = new byte[4 * _MB];}
}
  • 下面涉及各个垃圾回收器的日志,格式基本上差不多,主要是更具日志里面的信息识别垃圾回收器 ,如果不认识就得记住,不过可以从名字上看个七七八八

默认组合

[GC (Allocation Failure) [PSYoungGen: 8192K->640K(9216K)] 12288K->4744K(19456K), 0.0012260 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] 
HeapPSYoungGen      total 9216K, used 804K [0x00000007bf600000, 0x00000007c0000000, 0x00000007c0000000)eden space 8192K, 2% used [0x00000007bf600000,0x00000007bf6290e8,0x00000007bfe00000)from space 1024K, 62% used [0x00000007bfe00000,0x00000007bfea0000,0x00000007bff00000)to   space 1024K, 0% used [0x00000007bff00000,0x00000007bff00000,0x00000007c0000000)ParOldGen       total 10240K, used 4104K [0x00000007bec00000, 0x00000007bf600000, 0x00000007bf600000)object space 10240K, 40% used [0x00000007bec00000,0x00000007bf002010,0x00000007bf600000)Metaspace       used 3055K, capacity 4496K, committed 4864K, reserved 1056768Kclass space    used 334K, capacity 388K, committed 512K, reserved 1048576K
  • 可以看出默认情况下使用的实吞吐量优先的垃圾回收器
  • ParOldGen ——> Parallel Old; PSYoungGen——> Parallel Scavenge

指定UseSerialGC

  • -XX:+UseSerialGC 真正的参数应该是这样的,但是注意的实这个仅仅指定了年轻代的垃圾回收,可以看出当我们指定了年轻代的垃圾回收之后,老年代就给我们了一个默认组合,其实这个也是非常常见且合理的组合,因为年轻代指定了单线程的垃圾回收器,证明我们的应用场景是这样的,所以老年代也给了一个这样的垃圾回收器。
[GC (Allocation Failure) [DefNew: 8192K->514K(9216K), 0.0037798 secs] 8192K->6658K(19456K), 0.0037984 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [DefNew: 4693K->4693K(9216K), 0.0000069 secs][Tenured: 6144K->6144K(10240K), 0.0027005 secs] 10838K->10676K(19456K), [Metaspace: 3020K->3020K(1056768K)], 0.0027397 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] 
[Full GC (Allocation Failure) [Tenured: 6144K->6144K(10240K), 0.0011879 secs] 10676K->10658K(19456K), [Metaspace: 3020K->3020K(1056768K)], 0.0011981 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
Heapdef new generation   total 9216K, used 4973K [0x00000007bec00000, 0x00000007bf600000, 0x00000007bf600000)eden space 8192K,  60% used [0x00000007bec00000, 0x00000007bf0db4a8, 0x00000007bf400000)from space 1024K,   0% used [0x00000007bf500000, 0x00000007bf500000, 0x00000007bf600000)to   space 1024K,   0% used [0x00000007bf400000, 0x00000007bf400000, 0x00000007bf500000)tenured generation   total 10240K, used 6144K [0x00000007bf600000, 0x00000007c0000000, 0x00000007c0000000)the space 10240K,  60% used [0x00000007bf600000, 0x00000007bfc00030, 0x00000007bfc00200, 0x00000007c0000000)Metaspace       used 3080K, capacity 4496K, committed 4864K, reserved 1056768Kclass space    used 337K, capacity 388K, committed 512K, reserved 1048576K
  • DefNew(default new generation)–>UseSerialGC,Tenured–> Serial Old

指定 UseSerialGC

  • -XX:+UseParNewGC 指定用ParNew 垃圾收集器,但是这个时候因为没有指定老年代的垃圾回收器,所以默认给了Serial old 垃圾回收器回收老年代,但是这个时候出现了一个警告
Java HotSpot(TM) 64-Bit Server VM warning: Using the ParNew young collector with the Serial old collector is deprecated and will likely be removed in a future release
  • 因为我们年轻代选的的是一个多线程的垃圾回收器,所以这个时候我我们应该给老年代也选择一个多线程的,否则我们就不应该给年轻代选择多线程的垃圾回收器,并且还有一个原因,就是这个垃圾回收器之所以还存在就是为了搭配CMS,否则我们就使用ParallelGC 了。
Java HotSpot(TM) 64-Bit Server VM warning: Using the ParNew young collector with the Serial old collector is deprecated and will likely be removed in a future release
[GC (Allocation Failure) [ParNew: 7966K->536K(9216K), 0.0054598 secs] 7966K->6680K(19456K), 0.0054949 secs] [Times: user=0.02 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [ParNew: 4714K->4714K(9216K), 0.0000597 secs][Tenured: 6144K->6144K(10240K), 0.0024158 secs] 10858K->10670K(19456K), [Metaspace: 2950K->2950K(1056768K)], 0.0025505 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[Full GC (Allocation Failure) [Tenured: 6144K->6144K(10240K), 0.0023953 secs] 10670K->10652K(19456K), [Metaspace: 2950K->2950K(1056768K)], 0.0024328 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
Heappar new generation   total 9216K, used 5216K [0x00000007bec00000, 0x00000007bf600000, 0x00000007bf600000)eden space 8192K,  63% used [0x00000007bec00000, 0x00000007bf118058, 0x00000007bf400000)from space 1024K,   0% used [0x00000007bf500000, 0x00000007bf500000, 0x00000007bf600000)to   space 1024K,   0% used [0x00000007bf400000, 0x00000007bf400000, 0x00000007bf500000)tenured generation   total 10240K, used 6144K [0x00000007bf600000, 0x00000007c0000000, 0x00000007c0000000)the space 10240K,  60% used [0x00000007bf600000, 0x00000007bfc00030, 0x00000007bfc00200, 0x00000007c0000000)Metaspace       used 3000K, capacity 4496K, committed 4864K, reserved 1056768Kclass space    used 331K, capacity 388K, committed 512K, reserved 1048576K

指定 UseParallelGC

  • -XX:+UseParallelGC 指定使用吞吐量有限的垃圾收集器,其实就是默认的组合,老年代也给了对应的Parallel Old 垃圾回收器
[GC (Allocation Failure) --[PSYoungGen: 8192K->8192K(9216K)] 12288K->16392K(19456K), 0.0025128 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] 
[Full GC (Ergonomics) [PSYoungGen: 8192K->2563K(9216K)] [ParOldGen: 8200K->8193K(10240K)] 16392K->10757K(19456K), [Metaspace: 3048K->3048K(1056768K)], 0.0038758 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) --[PSYoungGen: 2563K->2563K(9216K)] 10757K->10757K(19456K), 0.0010899 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (Allocation Failure) [PSYoungGen: 2563K->2545K(9216K)] [ParOldGen: 8193K->8193K(10240K)] 10757K->10738K(19456K), [Metaspace: 3048K->3048K(1056768K)], 0.0032565 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 
HeapPSYoungGen      total 9216K, used 2875K [0x00000007bf600000, 0x00000007c0000000, 0x00000007c0000000)eden space 8192K, 35% used [0x00000007bf600000,0x00000007bf8cecc0,0x00000007bfe00000)from space 1024K, 0% used [0x00000007bff00000,0x00000007bff00000,0x00000007c0000000)to   space 1024K, 0% used [0x00000007bfe00000,0x00000007bfe00000,0x00000007bff00000)ParOldGen       total 10240K, used 8193K [0x00000007bec00000, 0x00000007bf600000, 0x00000007bf600000)object space 10240K, 80% used [0x00000007bec00000,0x00000007bf400608,0x00000007bf600000)Metaspace       used 3100K, capacity 4496K, committed 4864K, reserved 1056768Kclass space    used 339K, capacity 388K, committed 512K, reserved 1048576K

指定 UseParallelOldGC

  • -XX:+UseParallelOldGC 指定使用老年代使用 Parallel Old 垃圾收集器,年轻代给了对应的Parallel Scavenge 垃圾收集器。
[GC (Allocation Failure) [PSYoungGen: 6248K->608K(9216K)] 6248K->4712K(19456K), 0.0023993 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) --[PSYoungGen: 6991K->6991K(9216K)] 11095K->13151K(19456K), 0.0013657 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (Ergonomics) [PSYoungGen: 6991K->4607K(9216K)] [ParOldGen: 6160K->6145K(10240K)] 13151K->10753K(19456K), [Metaspace: 3048K->3048K(1056768K)], 0.0041210 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] 
[Full GC (Allocation Failure) [PSYoungGen: 4607K->4589K(9216K)] [ParOldGen: 6145K->6145K(10240K)] 10753K->10735K(19456K), [Metaspace: 3048K->3048K(1056768K)], 0.0036353 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] 
HeapPSYoungGen      total 9216K, used 5011K [0x00000007bf600000, 0x00000007c0000000, 0x00000007c0000000)eden space 8192K, 61% used [0x00000007bf600000,0x00000007bfae4d58,0x00000007bfe00000)from space 1024K, 0% used [0x00000007bfe00000,0x00000007bfe00000,0x00000007bff00000)to   space 1024K, 0% used [0x00000007bff00000,0x00000007bff00000,0x00000007c0000000)ParOldGen       total 10240K, used 6145K [0x00000007bec00000, 0x00000007bf600000, 0x00000007bf600000)object space 10240K, 60% used [0x00000007bec00000,0x00000007bf200690,0x00000007bf600000)Metaspace       used 3099K, capacity 4496K, committed 4864K, reserved 1056768Kclass space    used 339K, capacity 388K, committed 512K, reserved 1048576K

关于自定义组合垃圾收集器

异常错误提示

Conflicting collector combinations in option list; please refer to the release notes for the combinations allowed
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

总结

垃圾回收器的默认组合表

垃圾回收器的选择到底影响了什么

  • 内存的分配方式

日志

日志格式解读

日志配置

日志文件设置

  • -Xloggc:…/logs/gc.log
可以给GC日志的文件后缀加上时间戳,当JVM重启以后,会生成新的日志文件,新的日志也不会覆盖老的日志,只需要在日志文件名中添加%t的后缀即可
%t会给文件名添加时间戳后缀,格式是YYYY-MM-DD_HH-MM-SS。这样就非常简单了克服了UseGCLogFileRotation存在的所有的问题!
  • -XX:+UseGCLogFileRotation
  • -XX:NumberOfGCLogFiles=5
  • -XX:GCLogFileSize=20M
JVM的一个日志文件达到了20M以后,就会写入另一个新的文件,最多会有5个日志文件,他们的名字分别是:gc.log.0、gc.log.1、gc.log.2、gc.log.3、gc.log.4.

日志内容设置

  • -XX:+PrintGCDetails
  • -XX:+PrintGCTimeStamps //打印距jvm启动时间间距差值时间
  • -XX:+PrintGCDateStamps //打印当前系统时间
  • -XX:+PrintGCCause
  • -XX:+PrintGCApplicationConcurrentTime // 在日志中输出每次垃圾回收前,应用未中断的执行时间
  • -XX:+PrintGCApplicationStoppedTime // 在日志中输出垃圾回收期间应用STW的暂停时间
  • -XX:+PrintHeapAtGC // 在日志里输出堆中各代的内存大小分布
  • -XX:+PrintTLAB // 在日志里输出打印TLAB相关信息
  • -XX:+PrintReferenceGC //日志里输出Reference相关内容
  • -XX:+PrintTenuringDistribution // 在日志中输出对象年龄分布

其他

滚动日志文件到底要不要

日志文件丢失

  • 如果你配置的日志文件个数是5个,一段时间过后就会产生出来5个日志文件,假如最老的是gc.log.0,最近的是gc.log.4,当gc.log.4到达20M以后,日志会重新写入到gc.log.0,gc.log.0之前的内容会被清空掉!

日志文件混乱

  • 假如现在还是有5个日志文件:gc.log.0到gc.log.4,现在JVM重启了,此时GC的日志会重新从gc.log.0开始写入,但是gc.log.1、gc.log.2、gc.log.3、gc.log.4这里面的日志却还是之前旧的日志!新旧日志就掺杂在了一起!要解决这个问题,在重启服务器之前你需要把老的日志全部迁移到其他地方。

问题

  • 为什么要让长期存活的对象进入老年代
  • 如果

常见JVM 命令

java -XX:+PrintFlagsFinal -version
java -XX:+PrintCommandLineFlags -version

打印所有参数初始化默认值
-XX:+PrintFlagsInitial
打印所有参数赋值后的值
-XX:+PrintFlagsFinal
打印前两参数的差值
-XX:+PrintCommandLineFlags

    • 开头的叫做标准参数
  • X 开头非标准参数,每个JVM的实现不同
  • XX 开头不稳定参数,
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. POJ - 2456

    Aggressive cows - POJ 2456 - Virtual Judge 分析&#xff1a; 二分条件&#xff1a;某个点之后的区间具有什么特殊性质&#xff0c;能够将这个点二分出来。 枚举最小值&#xff0c;判断是否符合条件。 代码&#xff1a; #include <iostream> #include <cstring&…...

    2024/4/20 11:24:26
  2. android 适配 yolov5s

    1&#xff0c;按照下面链接进行配置环境&#xff0c;​​​​​​​在Android上运行YOLOv5目标检测 - 迷途小书童的Note迷途小书童的NoteYoutubehttps://xugaoxiang.com/2021/02/02/android-ncnn-yolov5/#%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E8%87%AA%E5%B7%B1%E7%9A%84%E6%…...

    2024/4/20 1:27:06
  3. 服务器网站搭建入门教程

    之前简单谈了一下服务器&#xff0c;感觉不去实践&#xff0c;总差点东西&#xff0c;那么这次就来从零开始学习如何玩服务器&#xff0c;由于本人也是新手&#xff0c;会逐步完善的&#xff0c;如果有什么错误&#xff0c;还请大佬们斧正。为了更好的入门&#xff0c;就利用宝…...

    2024/4/26 1:41:16
  4. web攻击技术——扫描

    目录 一、扫描器 二、web漏洞扫描三阶段 三、web安全漏洞扫描技术 &#xff08;1&#xff09;ping扫射 &#xff08;2&#xff09;操作系统探测 &#xff08;3&#xff09;firewalking &#xff08;4&#xff09;端口扫描 ①原理释义&#xff1a; ②端口状态说明&…...

    2024/5/2 18:10:34
  5. accelerometer 模块传感器

    Accelerometer模块管理设备加速度传感器&#xff0c;用于获取设备加速度信息&#xff0c;包括x&#xff08;屏幕水平方向&#xff09;、y&#xff08;垂直屏幕水平方向&#xff09;、z&#xff08;垂直屏幕平面方向&#xff09;三个方向的加速度信息。通过plus.accelerometer获…...

    2024/4/18 8:48:07
  6. 1076 Wifi密码

    下面是微博上流传的一张照片&#xff1a;“各位亲爱的同学们&#xff0c;鉴于大家有时需要使用 wifi&#xff0c;又怕耽误亲们的学习&#xff0c;现将 wifi 密码设置为下列数学题答案&#xff1a;A-1&#xff1b;B-2&#xff1b;C-3&#xff1b;D-4&#xff1b;请同学们自己作答…...

    2024/4/27 10:42:35
  7. Python爬虫编程思想(121):抓取移动App数据--设置手机的代理

    与Charles一样,mitmproxy需要运行在PC上,mitmproxy的默认端口是8080,启动mitmproxy的同时会开启一个HTTP/HTTPS代理服务。手机与PC必须在同一个网段(都需要连接Wi-Fi),然后手机的代理设置为PC的IP地址,端口号设为8080。这样手机App在访问互联网时,会先通过代理,也就是…...

    2024/4/14 1:15:34
  8. 刑,研究生写脚本抢HPV九价疫苗:被采取强制措施,后果严重

    近日&#xff0c;江西省南昌市公安局网安部门报道了一起涉嫌破坏计算机信息系统罪的案件。嫌疑人刘某被采取刑事强制措施&#xff0c;案件还在进一步办理中。 贴心男友为爱写代码 适用于16-26岁女性的HPV九价疫苗让许多年轻女性十分焦虑&#xff0c;经常出现“一苗难求”的现象…...

    2024/4/23 11:02:25
  9. Js基础_Web API

    文章目录一、Web APIs和JS基础关联性1 JS的组成2.JS基础阶段3.Web APIs阶段二、使用步骤1.引入库2.读入数据总结一、Web APIs和JS基础关联性 1 JS的组成 2.JS基础阶段 学习的ECMAScript标准规定的基本语法要求掌握JS基础语法 3.Web APIs阶段 Web APIs 是W3C组织的标准需要掌…...

    2024/4/23 11:03:20
  10. win10/11 子linux系统ubuntu18.04 exec format error 问题解决

    win10/11 子linux系统ubuntu18.04 exec format error 问题解决 问题可能来源&#xff0c;子系统不支持原生linux文件头 解决方式如下&#xff1a; 添加xxx形式文件头支持sudo apt updatesudo apt install qemu-user-staticsudo update-binfmts --install i386 /usr/bin/qemu-…...

    2024/4/18 20:40:10
  11. 在 Java 中定义⼀个不做事且没有参数的构造⽅法有什么用?

    Java 程序在执⾏⼦类的构造⽅法之前&#xff0c;如果没有⽤ super() 来调⽤⽗类特定的构造⽅法&#xff0c;则会调⽤⽗类中“没有参数的构造⽅法”。 因此&#xff0c;如果⽗类中只定义了有参数的构造⽅法&#xff0c;⽽在⼦类的构造⽅法中⼜没有⽤super() 来调⽤⽗类中特定的构…...

    2024/4/19 17:30:29
  12. C语言 单链表 实现存储删除任意类型数据(高扩展性)

    企业开发中&#xff0c;C语言链表不仅仅存储基本数据类型&#xff0c;应对任意的void data均可实现增删改查。在前面的一篇文章中&#xff0c;已经分享了单向链表、双向链表、有头节点和无头节点等链表对基本数据的处理。以下主要分析对复杂类型数据的处理&#xff0c;是以无有…...

    2024/4/14 13:53:34
  13. Java面向对象6--抽象类

    1.abstract 抽象类用于&#xff0c;子类继承父类&#xff0c;父类的方法没有实际意义的时候&#xff0c;但方法必须写方法执行语句&#xff0c;这时就可以使用抽象类。 方法没有具体的执行语句&#xff0c;所以可以用abstract修饰&#xff0c;变为抽象方法&#xff0c;因为没…...

    2024/4/18 22:36:39
  14. MySQL 笔记3

    目录 联合查询 连接查询 交叉连接 内连接 外连接 自然连接 子查询 标量子查询 列子查询 行子查询 表子查询 exist子查询 联合查询 基本概念:联合查询是可合并多个相似的选择查询的结果.等同于将一个表追加到另一个表,从而实现将两个表的查询组合到一起,使用谓词为un…...

    2024/5/2 4:50:21
  15. JNI学习要点记录

    JNI学习要点记录 - 简书...

    2024/5/2 4:25:33
  16. 《炬丰科技-半导体工艺》湿处理过程中硅介质上污染物的沉积

    书籍&#xff1a;《炬丰科技-半导体工艺》 文章&#xff1a;湿处理过程中硅介质上污染物的沉积 编号&#xff1a;JFKJ-21-616 作者&#xff1a;炬丰科技 摘要 光伏制造湿法工艺步骤的评估表明杂质可能沉积在硅介质上。在取出晶片时&#xff0c;液体层保留在硅表面上。 当液…...

    2024/5/2 2:03:07
  17. 从python来看数据结构基础

    从python来看数据结构基础 数组 概念 数组是有限个相同类型的变量所组成的有序集合。在内存中顺序存储&#xff0c;可以实现逻辑上的顺序表。 python中主要使用列表(list)和元组(tuple)两种集合&#xff0c;本质上都是对数组的封装。 基本操作 #初始化列表 my_list [3,1…...

    2024/5/2 4:16:47
  18. 哪个骨传导耳机好用?最好的骨传导蓝牙耳机品牌

    骨传导顾名思义就是利用耳骨来将声波传入内耳&#xff0c;来实现无需把耳机放在耳蜗里也可以有非常好的听声体验。这样一来对于保持听力是非常健康的。并且可以因使用环境不同选择带不带耳塞&#xff0c;带耳塞更能体验到沉浸感。不带耳塞&#xff0c;在音乐正常播放的情况下与…...

    2024/5/2 1:24:07
  19. h5 div自动排列

    https://www.ruanyifeng.com/blog/2015/07/flex-grammar.html...

    2024/5/2 2:30:22
  20. 【Swift】LeetCode 数组串联

    由于各大平台的算法题的解法很少有Swift的版本&#xff0c;小编这边将会出个专辑为手撕LeetCode算法题。 给你一个长度为 n 的整数数组 nums 。请你构建一个长度为 2n 的答案数组 ans &#xff0c;数组下标 从 0 开始计数 &#xff0c;对于所有 0 < i < n 的 i &#xf…...

    2024/5/2 3:33:27

最新文章

  1. iOS 创建开源库时如何使用图片和xib资源

    参考文章 参考文章 使用xib的正确姿势 #define MAIN_BUNDLE [NSBundle bundleForClass:[self class]] //获取bundle [[MAIN_BUNDLE loadNibNamed:itemResuableStr owner:self options:nil] lastObject]; //加载xib [tempCollectionView registerNib:[UINib nibWithNibName…...

    2024/5/3 15:41:12
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/3/20 10:50:27
  3. Go语言map、slice、channel底层实现(go面试)

    slice 切片是一个引用类型&#xff0c;其底层实现是一个结构体&#xff0c;包含以下字段&#xff1a; ptr&#xff1a;一个指向底层数组的指针&#xff0c;指针指向数组的第一个元素。 len&#xff1a;切片当前包含的元素数量。 cap&#xff1a;切片的容量&#xff0c;即底层…...

    2024/4/29 18:34:36
  4. 策略模式图

    策略模式 小小的图解 主要的三个角色 Strategy—抽象策略角色ConcreateStrategy—具体策略角色Context—上下文角色 封装了对具体策略的调用可以使用set的依赖注入也可以使用构造方法 核心是上下文角色 只要调用上下文角色就行&#xff0c;实现解耦 策略 工厂 将上下文角…...

    2024/5/1 13:35:23
  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