JVM

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

JVM结构

​ JVM又被分为三大子系统,类加载子系统,运行时数据区,执行引擎。

  • 类装载器ClassLoader: 用来装载.class文件
  • 运行时数据区: 方法区、堆、Java栈、程序计数器、本地方法栈
  • 执行引擎: 执行字节码,或者执行本地方法

JVM类加载机制

JVM把描述类数据的字节码.Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制。

1、类的生命周期

类从被加载到虚拟机内存中开始,到卸载出内存为止,它的生命周期包括了:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸载(Unloading) 七个阶段,其中验证、准备、解析三个部分统称链接。
1
其中加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的。解析阶段可以在初始化之后再开始(运行时绑定或动态绑定或晚期绑定)。

  • 1.1、加载
    加载又叫装载,主要任务是:

    • 通过类全名来获取定义此类的二进制字节流;
    • 将字节流所代表的静态存储结构转换为方法区的运行时数据结构;
    • 在Java堆中生成一个代表此类的java.long.Class对象,作为方法区这些数据的访问入口。
  • 1.2、验证
    主要目的是确保class文件字节流包含的信息符合当前虚拟机的要求,主要包括四个验证过程:文件格式验证、元数据验证、字节码验证、符号引用验证。

  • 1.3、准备
    准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配

    • 只有类变量(static修饰)进行分配
    • 实例变量将会在对象实例化时随着变量一起分配在堆中
    • 此时分配的初始值“通常情况”是基本数据类型的零值:如定义 public static int value = 12;此时的初值是0。因为这时候尚未开始执行任何java方法,而把value赋值为12的putstatic指令是程序被编译后,存放于类构造器()方法之中,所以把value赋值为12的动作将在初始化阶段才会被执行。
    • 特殊的情况,如果类字段的字段属性表中存在ConstantValue属性,那在准备阶段变量value就会被初始化为ConstantValue属性所指定的值,建设上面类变量value定义为:public static final int value = 123;编译时javac将会为value生成ConstantValue属性,在准备阶段虚拟机就会根据ConstantValue的设置将value设置为123。
  • 1.4、解析
    解析阶段是把常量池内的符号引用替换为直接引用的过程。

    • 符号引用:符号引用以一组符号来描述所引用的目标,符号可以使任何形式的字面量。
    • 直接引用可以是直接指向目标对象的指针、相对偏移量或是一个能间接定位到目标的句柄。直接引用是与虚拟机内存布局实现相关的,如果有了直接引用,那引用的目标必定已经在内存中存在。
  • 1.5、初始化
    前面过程都是以虚拟机主导,而初始化阶段开始执行类中的 Java 代码。为类加载最后阶段,若该类具有超类,则对其进行初始化,执行静态初始化器和静态初始化成员变量(如前面只初始化了默认值的static变量将会在这个阶段赋值,成员变量也将被初始化)。

2、类是如何加载到JVM中

Java文件通过编译为class文件,然后通过类的加载器装载到jvm中。

从 Java 虚拟机角度讲,只存在两种类加载器:一种是启动类加载器(C++ 实现,是虚拟机的一部分);另一种是其他所有类的加载器(Java 实现,独立于虚拟机外部且全继承自 java.lang.ClassLoader)

类加载器的任务是根据一个类的全限定名来获取描述此类的二进制字节流到JVM中,然后转换为一个与目标类对应的java.lang.Class对象实例,在虚拟机提供了4种类加载器,启动(Bootstrap ClassLoader)类加载器、扩展(Extension ClassLoader)类加载器、应用程序(Application ClassLoader)类加载器、自定义(User ClassLoader)类加载器。

  • A.启动类加载器: 这个类加载器负责放在<JAVA_HOME>中jre/lib/rt.jar里所有的class,或者被-Xbootclasspath参数所指定的路径中的class,并且是虚拟机识别的类库。用户无法直接使用。

  • B.扩展类加载器: 这个类加载器由sun.misc.Launcher$AppClassLoader实现。它负责<JAVA_HOME>\lib\ext目录中的,或者被java.ext.dirs系统变量所指定的路径中的所有类库。用户可以直接使用。

  • C.应用程序类加载器: 这个类由sun.misc.Launcher$AppClassLoader实现。是ClassLoader中getSystemClassLoader()方法的返回值。它负责用户路径(ClassPath)所指定的类库。用户可以直接使用。如果用户没有自己定义类加载器,默认使用这个。

  • D.自定义加载器: 用户自己定义的类加载器。
    2

  • 2.1、双亲委派
    如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,依次向上。而当最顶层加载失败时,则会把请求交还给子加载器去完成,依次向下,最终Application ClassLoader也加载失败,则会报出异常ClassNotFoundException。

    • 防止内存浪费: 类加载器在成功加载某个类之后,会把得到的 java.lang.Class类的实例缓存起来。下次再请求加载该类的时候,类加载器会直接使用缓存的类的实例,而不会尝试再次加载。
    • 避免重复加载: 采用双亲委派模式的是好处是Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关系可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次。
    • 避免核心类篡改: 假设通过网络传递一个名为java.lang.Integer的类,通过双亲委托模式传递到启动类加载器,而启动类加载器在核心Java
      API发现这个名字的类,发现该类已被加载,并不会重新加载网络传递的过来的java.lang.Integer,而直接返回已加载过的Integer.class,这样便可以防止核心API库被随意篡改。
    • 破坏双亲委派模型或篡改核心类库: 由于以上的特点,通常我们不可以这样做。但是由于系统自带的三个类加载器都加载特定目录下的类,如果我们自定义一个自己的类加载器放在一个特殊的目录,那么系统的加载器就无法加载,也就是最终还是由我们自己的加载器加载。

JVM运行时数据区(内存模型)

类装载器装载编译后的字节码,并加载到运行时数据区。
在这里插入图片描述
JVM运行时会分配好方法区和堆,而JVM每遇到一个线程,就为其分配一个程序计数器、Java栈(虚拟机栈)、本地方法栈,当线程终止时,三者(程序计数器、Java栈、本地方法栈)所占用的内存空间也会释放掉。所以gc只发生在线程共享的区域(大部分发生在Heap上)。

1.各区域介绍

  • 1.1、方法区:

    • 方法区和永久代和元空间:永久代和元空间都是对方法区的实现,在jdk1.8中移除了永久代改为元空间。永久代与元空间的区别是元空间并不在虚拟机中,而是使用本地内存。
    • 主要用于存储类的信息(版本,字段,方法,接口等信息),成员常量,静态变量以及编译器编译后的代码等,逻辑上属于堆的一部分,但是为了与堆进行区分,通常又叫“非堆”。
    • 运行时常量池,方法区中非常重要的部分,用于存放静态编译产生的字面量和符号引用。运行时生成的常量也会存在这个常量池中,比如String的intern方法。 它是每一个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后,对应的运行时常量池就被创建出来。
    • 通常会抛出java.lang.OutOfMemoryError异常,永久代抛出PermGen space,元空间抛出堆异常Metadata space。
  • 1.2、堆:

    • 主要是存放对象实例和数组(当然,数组引用是存放在Java栈中的)。
    • 堆是JVM中最大的一块内存区域,几乎所有的对象实例都在这里分配内存(垃圾回收的重点),但由于堆是线程共享的,所以在分配内存时需要加锁,这导致new对象的开销很大。
      Sun Hotspot JVM为了提升对象内存分配的效率,内部会划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer, TLAB,可以位于物理上不连续的空间,但是逻辑上要连续。)。在TLAB上分配对象时不需要加锁,因此JVM在给线程的对象分配内存时会尽量的在TLAB上分配,在这种情况下JVM中分配对象内存的性能和C基本是一样高效的,但如果对象过大的话则仍然是直接使用堆空间分配。
    • 堆中又分为新生代(Young Generation)和老年代(Tenured Generation),分配的内存比例2:1,刚创建的对象存放在新生代,而老年代中存放生命周期长久的实例对象(新建的大对象会直接放到老年代,当老年代放不下会直接抛出OutOfMemoryError(OOM))。
    • 新生代中又被分为Eden区和两个Survivor区(From Space和To Space)。新的对象分配是首先放在Eden区,Survivor区作为Eden区和Old区的缓冲,在Survivor区的对象经历若干次GC仍然存活的,就会被转移到老年代。
    • 通常会抛出OutOfMemoryError
  • 1.3、程序计数器:

    • 程序计数器(Program Counter Register),也有称作为PC寄存器。
    • 在JVM中,多线程是通过线程轮流切换来获得CPU执行时间的,为了能够使得每个线程都在线程切换后能够恢复在切换之前的程序执行位置,每个线程都需要有自己独立的程序计数器,并且不能互相被干扰,否则就会影响到程序的正常执行次序。
    • 字节码解释器工作是就是通过改变这个计数器的值来选取下一条需要执行指令的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器完成
    • 如果线程正在执行一个 Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是 Native 方法,这个计数器的值则为 (Undefined)。
    • 由于程序计数器中存储的数据所占空间的大小不会随程序的执行而发生改变,因此此内存区域是唯一一个在 Java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域。
  • 1.4、虚拟机栈:

    • 虚拟机栈(Java Vitual Machine Stack)也称作Java栈。
    • 虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。 每一个方法从调用直至执行结束,就对应着一个栈帧从虚拟机栈中入栈到出栈的过程。
      • 局部变量表:用来存储方法中的局部变量(包括在方法中声明的非静态变量以及函数形参)。对于基本数据类型的变量,则直接存储它的值,对于引用类型的变量,则存的是指向对象的引用。
      • 操作数栈:将变量之间的运算入栈,然后存储计算结果,再出栈赋值给局部变量表。
      • 方法出口:假如代码中main()方法调用了test()方法,这时test()执行完成后,需要继续执行main()方法,方法出口记录了test()方法执行完成后的一个出口,也就是回到main()
    • StackOverflowError:线程请求的栈深度大于虚拟机所允许的深度。
    • OutOfMemoryError:如果虚拟机栈可以动态扩展,而扩展时无法申请到足够的内存。
  • 1.5、本地方法栈:
    本地方法栈则是为虚拟机使用到的Native方法服务。
    本地方法栈与Java栈的作用和原理非常相似。

2.JVM垃圾回收机制

GC的基本原理:将内存中不再被使用的对象进行回收,GC中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java在对对象的生命周期特征进行分析后,按照新生代、旧生代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停。

程序计数器、虚拟机栈、本地方法栈 3 个区域随线程生灭(因为是线程私有),栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。而Java堆区和方法区 则不一样,这部分内存的分配和回收是动态的,正是垃圾收集器所需关注的部分。

  • 2.1、对象已死?
    垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”。判断哪些对象“死去”常用有两种方式:

    • 引用计数法:早期策略。给对象添加一个引用计数器。 当任何其它变量被赋值为这个对象的引用时,计数加1;当一个对象实例的某个引用超过了生命周期或者被设置为一个新值时,对象实例的引用计数器减1。任何引用计数器为0的对象实例可以被当作垃圾收集。当一个对象实例被垃圾收集时,它引用的任何对象实例的引用计数器减1。
      • 无法检测出循环引用。如父对象有一个对子对象的引用,子对象反过来引用父对象。这样,他们的引用计数永远不可能为0。
    • 可达性分析算法:通过一系列的 ‘GC Roots’ 的对象作为起始点,从这些节点出发所走过的路径称为引用链。当一个对象到 GC Roots 没有任何引用链相连的时候说明对象不可用。
      在这里插入图片描述
    • 可作为GC Roots的对象包括下面几种:
      • a) 虚拟机栈中引用的对象(栈帧中的本地变量表);
      • b) 方法区中类静态属性引用的对象;
      • c) 方法区中常量引用的对象;
      • d) 本地方法栈中JNI(Native方法)引用的对象。
    • 不同的对象引用类型, GC会采用不同的方法进行回收:
      • 强引用:类似于 Object obj = new Object(); 只要强引用在就不回收。
      • 软引用:SoftReference 类实现软引用。在系统要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行二次回收。如果这次回收后还没有足够的内存,才会抛出内存溢出异常。
      • 弱引用:WeakReference 类实现弱引用。对象只能生存到下一次垃圾收集之前。在垃圾收集器工作时,无论内存是否足够都会回收掉只被弱引用关联的对象。
      • 虚引用:PhantomReference 类实现虚引用。无法通过虚引用获取一个对象的实例,为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。
    • 无论引用计数算法还是可达性分析算法都是基于强引用而言的。
    • 即使在可达性分析算法中不可达的对象,也并非是“非死不可”,这时候它们暂时处于“缓刑”阶段,要真正宣告一个对象死亡,至少要经历两次标记过程:
      • 第一次标记:如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链,那它将会被第一次标记;
      • 第二次标记:第一次标记后接着会进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法,在finalize()方法中没有重新与引用链建立关联关系的,将被进行第二次标记。
      • 第二次标记成功的对象将真的会被回收,如果对象在finalize()方法中重新与引用链建立了关联关系,那么将会逃离本次回收,继续存活。
  • 2.2、方法区如何判断是否需要回收?
    在堆中,尤其是在新生代中,一次垃圾回收一般可以回收 70% ~ 95% 的空间,而方法区的垃圾收集效率远低于此。

    • 方法区主要回收的内容有:废弃常量和无用的类。
    • 废弃常量:一般是判断有没有该常量的引用。也可通过引用的可达性来判断。
    • 无用的类:要以下三个条件都满足:
      • 该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例;
      • 加载该类的ClassLoader已经被回收;
      • 该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
  • 2.3、常用的垃圾回收算法
    现在已经可以判断哪些对象已经“死去”了,我们现在要对这些“死去”的对象进行回收,回收也有好几种算法:

    • 标记-清除(Mark-Sweep)算法: 分为标记阶段和清除阶段。标记阶段的任务是标记出所有需要被回收的对象,清除阶段就是回收被标记的对象所占用的空间。
      • 标记和清除过程的效率都不高。
      • 标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致:当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前出发另一次垃圾收集动作。
    • 复制(Copying)算法: 为了解决Mark-Sweep算法的缺陷。它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用的内存空间一次清理掉,这样一来就不容易出现内存碎片的问题。
      • 对内存空间的使用做出了高昂的代价,因为能够使用的内存缩减到原来的一半。
      • 如果存活对象很多,那么Copying算法的效率将会大大降低。
    • 标记-整理(Mark-Compact)算法: 基于以上两种算法优劣,提出了Mark-Compact算法。该算法标记阶段和Mark-Sweep一样,但是在完成标记之后,它不是直接清理可回收对象,而是将存活对象都向一端移动,然后清理掉端边界以外的内存。
    • 分代收集(Generational Collection)算法: 是目前大部分JVM的垃圾收集器采用的算法。它的核心思想是根据对象存活的生命周期将内存划分为若干个不同的区域。一般情况下将堆区划分为老年代(Tenured Generation)和新生代(Young Generation)
      • 老年代的特点是每次垃圾收集时只有少量对象需要被回收,而新生代的特点是每次垃圾回收时都有大量的对象需要被回收,那么就可以根据不同代的特点采取最适合的收集算法。
      • 新生代:采用复制算法。
        • 所有新生成的对象首先都是放在新生代的。新生代的目标就是尽可能快速的收集掉那些生命周期短的对象。
        • 新生代中98%的对象都是”朝生夕死”的,所以并不需要按照1 : 1的比例来划分内存空间,而是将内存(新生代内存)分为一块较大的Eden(伊甸园)空间和两块较小的Survivor(幸存者)空间(HotSpot默认Eden与Survivor的大小比例是8 : 1),每次使用Eden和其中一块Survivor(两个Survivor区域一个称为From区,另一个称为To区域)。
        • 大致流程为:1)当Eden区满的时候,会触发第一次Minor gc,把还活着的对象拷贝到Survivor From区;当Eden区再次触发Minor gc的时候,会扫描Eden区和From区域,对两个区域进行垃圾回收,经过这次回收后还存活的对象,则直接复制到To区域,并将Eden和From区域清空。2)当后续Eden又发生Minor gc的时候,会对Eden和To区域进行垃圾回收,存活的对象复制到From区域,并将Eden和To区域清空。3)部分对象会在From和To区域中复制来复制去,如此交换15次(由JVM参数MaxTenuringThreshold决定,这个参数默认是15),最终如果还是存活,就存入到老年代。
        • 当Survivor1区不足以存放 Eden和Survivor0的存活对象时,就将存活对象直接存放到老年代。若是老年代也满了就会触发一次Full GC,也就是新生代、老年代都进行回收。
        • 新生代发生的GC也叫做Minor GC、新生代GC,MinorGC发生频率比较高(不一定等Eden区满了才触发)。
      • 老年代:一般采用标记整理算法。
        • 在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。
        • 老年代中对象存活率较高、没有额外的空间分配对它进行担保。所以必须使用 标记 —— 清除 或者 标记 —— 整理 算法回收。
        • 内存比新生代也大很多(大概比例是1:2),当老年代内存满时触发Major GC或Full GC,Full GC发生频率比较低。Major GC的速度一般会比Minor GC慢10倍以上。
  • 2.4、常见的垃圾收集器
    上面所讲的垃圾收集算法只能算是方法论,落地实现的是垃圾收集器:

    • Serial收集器(复制算法): 新生代单线程收集器,标记和清理都是单线程,意味着它只会使用一个 CPU 或一条收集线程去完成收集工作,并且在进行垃圾回收时必须暂停其它所有的工作线程直到收集结束。
      • 需要STW(Stop The World),停顿时间长。
      • 简单高效,对于单个CPU环境而言,Serial收集器由于没有线程交互开销,可以获取最高的单线程收集效率。
      • 是client级别默认的GC方式,可以通过-XX:+UseSerialGC来强制指定。
    • Serial Old收集器(标记-整理算法):老年代单线程收集器,Serial收集器的老年代版本。
    • ParNew收集器(复制算法):新生代收集器,可以认为是Serial收集器的多线程版本。
      • 在多核CPU环境下有着比Serial更好的表现。
      • 是Server模式下的虚拟机首选的新生代收集器。除了Serial收集器外,目前只有它能与CMS收集器配合工作。
      • 它默认开启的收集线程数与CPU数量相同,在CPU数量非常多的情况下,可以使用-XX:ParallelGCThreads参数来限制垃圾收集的线程数。
    • 并行(Parallel)和并发(Concurrent):
      • 并行:指多条垃圾收集线程并行工作,此时用户线程处于等待状态。
      • 并发:指用户线程和垃圾回收线程同时执行(不一定是并行,有可能是交叉执行),用户进程在运行,而垃圾回收线程在另一个 CPU 上运行。
    • Parallel Scavenge收集器(复制算法):新生代的多线程收集器(并行收集器)。 也被称为“吞吐量优先收集器”。
      • 回收期间不需要暂停其他用户线程。
      • 追求高吞吐量(Throughput = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)),高效利用CPU,主要是为了达到一个可控的吞吐量。
      • Parallel Scavenge收集器是虚拟机运行在Server模式下的默认垃圾收集器。
      • 适合后台应用等对交互相应要求不高的场景。可用-XX:+UseParallelGC来强制指定,用-XX:ParallelGCThreads=4来指定线程数。
    • Parallel Old收集器(标记-整理算法): Parallel Scavenge收集器的老年代版本,多线程,并行收集器,吞吐量优先。
    • CMS(Concurrent Mark Sweep)收集器(标记-清除算法):以获取最短回收停顿时间为目标的并发收集器。
      • 高并发、低停顿,追求最短GC回收停顿时间,cpu占用比较高,多核cpu 追求高响应时间的选择。
      • 收集过程分为如下四步:
        • 1、初始标记(CMS initial mark):标记 GC Roots 能直接关联到的对象,时间很短。
        • 2、并发标记(CMS concurrent mark):进行 GC Roots Tracing(可达性分析)过程,时间很长。
        • 3、重新标记(CMS remark):修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,时间较长。
        • 4、并发清除(CMS concurrent sweep),时间很长。
      • 对CPU资源非常敏感,可能会导致应用程序变慢,吞吐率下降。
      • 无法处理浮动垃圾,因为在并发清理阶段用户线程还在运行,自然就会产生新的垃圾,而在此次收集中无法收集他们,只能留到下次收集,这部分垃圾为浮动垃圾
      • 由于采用的标记 - 清除算法,会产生大量的内存碎片,不利于大对象的分配,可能会提前触发一次Full GC。
    • G1 收集器:面向服务端的垃圾回收器。 它能充分利用多CPU、多核环境。因此它是一款并行与并发收集器,并且它能建立可预测的停顿时间模型。
      • 优点:并行与并发、分代收集、空间整合、可预测停顿。
      • 并行和并发:使用多个CPU来缩短Stop The World停顿时间,与用户线程并发执行。
      • 分代收集:独立管理整个堆,但是能够采用不同的方式去处理新创建对象和已经存活了一段时间、熬过多次GC的旧对象,以获取更好的收集效果。
      • 空间整合:基于标记 - 整理算法,无内存碎片产生。
      • 可预测的停顿。能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒。
      • 使用G1收集器时,Java堆的内存布局与其他收集器有很大差别,它将整个Java堆划分为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代的概念,但新生代和老年代不再是物理隔离的了,它们都是一部分(可以不连续)Region的集合。

执行引擎

物理机的执行引擎是由硬件实现的,和物理机的执行过程不同的是虚拟机的执行引擎由于自己实现的。

执行引擎负责具体的代码调用及执行过程:
输入:字节码文件
处理:字节码解析
输出:执行结果。

类装载器装载负责装载编译后的字节码,并加载到运行时数据区(Runtime Data Area),然后执行引擎执行会执行这些字节码。

执行引擎以指令为单位读取Java字节码。它就像一个CPU一样,一条一条地执行机器指令。每个字节码指令都由一个1字节的操作码和附加的操作数组成。执行引擎取得一个操作码,然后根据操作数来执行任务,完成后就继续执行下一条操作码。不过Java字节码是用一种人类可以读懂的语言编写的,而不是用机器可以直接执行的语言。因此,执行引擎必须把字节码转换成可以直接被JVM执行的语言。 字节码可以通过以下两种方式转换成合适的语言:

  • 解释器:一条一条地读取,解释并且执行字节码指令。因为它一条一条地解释和执行指令,所以它可以很快地解释字节码,但是执行起来会比较慢。这是解释执行的语言的一个缺点。字节码这种“语言”基本来说是解释执行的。
  • 即时(Just-In-Time)编译器:即时编译器被引入用来弥补解释器的缺点。执行引擎首先按照解释执行的方式来执行,然后在合适的时候,即时编译器把整段字节码编译成本地代码。然后,执行引擎就没有必要再去解释执行方法了,它可以直接通过本地代码去执行它。执行本地代码比一条一条进行解释执行的速度快很多。编译后的代码可以执行的很快,因为本地代码是保存在缓存里的。

总结和调优

1、Minor GC、Full GC触发条件

  • Minor GC触发条件
    • Eden区域满了,或者新创建的对象大小 > Eden所剩空间
    • Full GC的时候会先触发Minor GC
    • CMS设置了CMSScavengeBeforeRemark参数,这样在CMS的Remark之前会先做一次Minor GC来清理新生代,加速之后的Remark的速度。这样整体的stop-the-world时间反而短。
  • Full GC触发条件
    • Minor GC后存活的对象晋升到老年代时由于悲观策略的原因,有两种情况会触发Full GC, 一种是之前每次晋升的对象的平均大小 > 老年代剩余空间;一种是Minor GC后存活的对象超过了老年代剩余空间。属于promotion failure。
    • 新生代直接晋升到老年代的大对象超过了老年代的剩余空间,引发Full GC。注意于promotion failure的区别,promotion failure指的是Minor GC后发生的担保失败
    • Perm永久代空间不足会触发Full GC,可以让CMS清理永久代的空间。设置CMSClassUnloadingEnabled即可
    • System.gc()引起的Full GC,可以设置DisableExplicitGC来禁止调用System.gc引发Full GC。
    • CMS失败,发生concurrent mode failure会引起Full GC,原因是老年代剩余的空间不够,导致了和gc线程并发执行的用户线程创建的大对象不能进入到老年代,只能stop the world来暂停用户线程,执行GC清理。可以通过设置CMSInitiatingOccupancyFraction预留合适的CMS执行时剩余的空间。

2、stop-the-world

不管选择哪种GC算法,stop-the-world都是不可避免的。Stop-the-world意味着从应用中停下来并进入到GC执行过程中去。一旦Stop-the-world发生,除了GC所需的线程外,其他线程都将停止工作,中断了的线程直到GC任务结束才继续它们的任务。GC调优通常就是为了改善stop-the-world的时间。

3、降低GC的调优的策略

  • 代大小优化:-Xms、 -Xmx 、-Xmn 、-XX:SurvivorRatio、-XX:MaxTenuringThreshold、-XX:PermSize、-XX:MaxPermSize

    • -Xms、 -Xmx 通常设置为相同的值,避免运行时要不断扩展JVM内存,这个值决定了JVM heap所能使用的最大内存。
    • -Xmn 决定了新生代空间的大小,新生代Eden、S0、S1三个区域的比率可以通过-XX:SurvivorRatio来控制(假如值为 4 表示:Eden:S0:S1 = 4:3:3 )。
    • -XX:MaxTenuringThreshold 控制对象在经过多少次minor GC之后进入老年代,此参数只有在Serial 串行GC时有效。
    • -XX:PermSize、-XX:MaxPermSize 用来控制方法区的大小,通常设置为相同的值。
    • 策略:
      • 避免新生代大小设置过小:一是minor GC次数频繁,二是可能导致 minor GC对象直接进入老年代,当老年代内存不足时,会触发Full GC。
      • 避免新生代大小设置过大:一是老年代变小,可能导致Full GC频繁执行;二是 minor GC 执行回收的时间大幅度增加。
      • 避免Survivor区过大或过小:minor GC次数会降低或增加。
      • 合理设置对象在新生代存活的周期:新生代存活周期的值决定了新生代对象在经过多少次Minor GC后进入老年代。因此这个值要根据自己的应用来调优,Jvm参数上这个值对应的为-XX:MaxTenuringThreshold,默认值为15次。
  • 减少GC开销的措施

    • 不要显式调用System.gc():增加主GC的频率,也即增加了间歇性停顿的次数。大大的影响系统性能。
    • 尽量减少临时对象的使用。
    • 对象不用时最好显式置为Null:一般而言,为Null的对象都会被作为垃圾处理,所以将不用的对象显式地设为Null,有利于GC收集器判定垃圾,从而提高了GC的效率。
    • 尽量使用StringBuffer,而不用String来累加字符串:累加String对象时,并非在一个String对象中扩增,而是重新创建新的String对象,只会增加更多的垃圾。
    • 能用基本类型如int,就不用Integer对象:基本类型变量占用的内存资源比相应对象占用的少得多。
    • 尽量少用静态对象变量:静态变量属于全局变量,不会被GC回收,它们会一直占用内存。
    • 分散对象创建或删除的时间。

4、内存泄漏(MemoryLeak)和内存溢出(OutOfMemory)

  • 内存泄漏:指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。

  • 内存溢出:指程序在申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。

  • 内存泄漏的分类:

    • 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。
    • 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。
    • 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。
    • 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。
  • 内存溢出的原因及解决方法:

    • 内存溢出原因:
      • 内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
      • 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
      • 代码中存在死循环或循环产生过多重复的对象实体;
      • 使用的第三方软件中的BUG;
      • 启动参数内存值设定的过小;
      • nio直接操作内存,内存过大导致溢出。
    • 内存溢出的解决方案:
      • 修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加)
      • 检查错误日志,查看“OutOfMemory”错误前是否有其 它异常或错误。
      • 对代码进行走查和分析,找出可能发生内存溢出的位置。
      • 查看是否使用了nio直接操作内存。

4、年轻代到年老代的晋升过程的判断条件

  • 部分对象会在From和To区域中复制来复制去,如此交换15次(由JVM参数MaxTenuringThreshold决定,这个参数默认是15),最终如果还是存活,就存入到老年代。
  • 如果对象的大小大于Eden的二分之一会直接分配在old,如果old也分配不下,会做一次major GC,如果小于eden的一半但是没有足够的空间,就进行minor gc也就是新生代GC。minor gc后,survivor仍然放不下,则放到老年代。
  • 动态年龄判断 ,大于等于某个年龄的对象超过了survivor空间一半 ,大于等于某个年龄的对象直接进入老年代。

多有参考这两篇:
https://www.cnblogs.com/Java3y/p/9296496.html
https://blog.csdn.net/know9163/article/details/80574488
https://www.cnblogs.com/semi-sub/p/12827335.html

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

相关文章

  1. 基数排序(radix sort)

    基数排序(radix sort) 1.基本介绍1)基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用。 2)基数排序法是属于稳定性的排序…...

    2024/4/25 0:31:04
  2. MySQL redo log(重做日志)和 binlog(归档日志)

    WAL的全称是Write-Ahead Logging,它的关键点就是先写日志,再写磁盘。 具体来说,当有一条记录需要更新的时候,InnoDB引擎就会先把记录写到redo log(粉板)里面,并更新内存,这个时候更新就算完成了。同时,InnoDB引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个…...

    2024/4/25 0:30:56
  3. rabbitmq代码

    文章目录1.生产者代码2.消费者代码2.1 消费幂等性代码2.2 消费者rpc代码2.3 消费者消费重试2.4 消费者直接交换机代码2.5 基础代码 1.生产者代码 <?php namespace app\controller;use app\BaseController; use PhpAmqpLib\Connection\AMQPStreamConnection; use PhpAmqpLib…...

    2024/5/7 16:09:40
  4. LeetCode_Diary02_Python_Longest Substring Without Repeating Characters

    Longest Substring Without Repeating Characters 解决思路 把每个子序列列出来,然后去比较有没有相同的字符,最后输出,每个子序列列出来应该有单独的函数,比较相同字符的话要么就是循环,要么就是用函数。 疑问 1、字符串的子序列怎么提取, 有专门的傻瓜方法,也可以直接用…...

    2024/4/25 0:30:54
  5. powershell中的逻辑控制语句和简单的习题练习

    一、逻辑控制语句1.分支结构if-else说明:当分支只有两种时,则采用if-else结构当分支超过两个时,采用if-elseif-……-else格式:if(判断条件){满足则执行语句}elseif(判断条件){ 满足则执行语句}else{if后的判断条件都不满足则执行语句}2.循环结构(1)while:当powershell中如…...

    2024/4/25 0:30:57
  6. 9.如何判断两个Class对象是否相等?类加载器的引用,类的主动使用和被动使用

    1.两个class对象是否相等的条件 1.类的完整类名必须一致,包括包名。 2.加载这个类的ClassLoader(指的是ClassLoader实例对象)必须相同。 换句话说,在JVM中,即使两个类对象(Class对象)来源于同一个Class文件,被同一个虚拟机加载,但是只要加载它们的ClassLoader实例对象…...

    2024/5/7 21:02:32
  7. Linux完全卸载MySQL,干干净净

    //rpm包安装方式卸载 查包名: rpm -qa|grep -i mysql删除命令: rpm -e –nodeps 包名//yum安装方式下载 1.查看已安装的mysql 命令: rpm -qa | grep -i mysql2.卸载mysql,这个命令是直接卸载全部的,想一个一个卸载的打上全名,别用* 命令: yum remove mysql*然后在运行一…...

    2024/4/25 0:30:52
  8. 3.1.5 命令行工具SpringBoot-CLI

    CLI安装 ### 作用 - 通过Groovy快速开发Spring命令说明作用 - 项目构建...

    2024/4/25 0:30:57
  9. python之内置函数之int()

    class int(x, base=10)返回一个整型对象。默认返回0。参数x可以是字符串,也可以是浮点数。base指x的进制形式,比如2表示2进制,10表示10进制。特别需要注意的是,0表示任何进制。>>> int(123,10) 123 >>> int(123,0) 123 >>> int(0x123,16) 291 &…...

    2024/4/25 0:30:49
  10. 第五章 - 乐观锁 无锁方案

    无锁 — 乐观锁(非阻塞) 共享模式之无锁CAS 与 volatile 原子整数 原子引用 原子累加器 UnsafeCAS无锁方案 CAS无锁主要看重三个变量: 预估值 + 修改值 + 主存值 预估值: 主要用来判断是否等于主存值, 是则将修改值修改到主存值中 修改值: 即将需要修改的新值, 修改到主存中 主…...

    2024/4/25 0:30:48
  11. 2020全球新冠累积病例动态赛跑图实践

    2020年是注定不凡的一年,在这场突如其来的没有硝烟的疫情战疫中,世界各国人民都在不同程度上付出了很大的代价,我们大中国,众志成城,共度国难才有了今天的局面。然而新冠疫情大半年过去了,这么长时间在世界各国到底呈现怎样的发展趋势呢?先直接上图吧:上面的动态条形赛…...

    2024/4/14 20:36:57
  12. 华为初级网络工程师(HCIA)(四)——wireshark抓包工具

    本文为作者学习文章,按作者习惯写成,如有错误或需要追加内容请留言(不喜勿喷) 本文为追加文章,后期慢慢追加,作者不是很懂 wireshark抓包工具 主要参考一下大佬文章: wireshark抓包新手使用教程 https://www.cnblogs.com/mq0036/p/11187138.html 网络抓包工具 wiresh…...

    2024/4/14 20:36:56
  13. 第八章 - JUC

    J.U.C AQS 原理 全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架 特点:用 state 属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取 锁和释放锁getState - 获取 state 状态 setState - 设置 state 状态 com…...

    2024/4/14 20:36:56
  14. 使用IDEA开发

    IDEA 全称 IntelliJ IDEA,是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。 官网:https:…...

    2024/4/14 20:36:54
  15. 2016-2020考研英语1真题重点单词词汇表

    完整打印版(737词)文档下载地址:https://pan.baidu.com/s/1Mqo0iUFUaKbyD3n0DE-IKA提取码:mkdc序号单词出现次数音标中文释义1benefit8[ˈbɛnəfɪt]n.利益,好处vt.有益于,有助于vi.受益2issue8[ˈɪʃu]n.问题,争论点;发行,(报刊)一期3digital6[ˈdɪdʒɪtl]adj.数…...

    2024/4/25 0:30:48
  16. 程序员一般喜欢浏览的40个网站,屯了这么多年,我就不藏私了,个人强烈推荐

    1、Google:https://google.com 作为王牌浏览器,相比打开电脑就会进入谷歌浏览器,里面的谷歌搜索很好用。2、CSDN— 开发者齐聚的网站:https://www.csdn.net/ CSDN不用多说,老牌专业 IT 技术社区,有很多厉害的开发者,当然也有很多小白,各种研究方向的都有,里面还包括着…...

    2024/5/5 5:00:36
  17. 2020年抖音、腾讯、阿里、美团春招服务端开发岗位最新硬核面试(上)

    先报一下身份,笔者的师弟小民同学。小民同学应届校招从事服务端开发,参加校招面试以来,共面四个公司的服务端开发岗位:抖音,IES互娱 腾讯,PCG 应用宝数据中台 阿里,新零售供应链 美团,到店事业部 目前为止,除了阿里还在等交叉,其他均已收到 offer,硬核技术实力。小民…...

    2024/5/5 13:29:43
  18. 境外收款什么渠道比较好?

    境外收款分两类,一类是跨境电商平台收款,一类是外贸收款。由于资金来源的问题,一个属于线上,一个属于线下收款,入账和结汇都稍微有一些差别。1、跨境电商平台收款比较简单,常用的收款方式有payoneer和WorldFirst,都是老牌的跨境收款公司,安全和权威性比较好。注册好pay…...

    2024/5/5 14:40:38
  19. dubbo解析-介绍服务端和客户端启动和服务调用步骤

    本文基于dubbo 2.7.5版本代码前面的文章介绍了很多dubbo的各个组件,本文将对通过介绍启动和服务调用过程梳理一下这些组件,也让大家对dubbo的全局有一个了解。 文章目录一、服务端启动二、客户端启动三、服务调用 一、服务端启动 1、spring启动调用后处理器ServiceAnnotation…...

    2024/4/25 0:30:50
  20. 随机点名系统

    课堂作业 - 随机点名系统 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>随机点名系统</t…...

    2024/5/5 11:30:46

最新文章

  1. [Maven]IDEA报错-xxx is referencing itself

    在IDEA中&#xff0c;执行 mvn clean时报错xxx is referencing itself。 解决方案&#xff1a;https://stackoverflow.com/questions/64246267/maven-error-using-intellij-is-referencing-itself 具体做法&#xff1a;采用上图第二条&#xff0c;将父模块pom文件中的对子模块…...

    2024/5/8 1:38:43
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/5/7 10:36:02
  3. uniapp原生下拉刷新在手机上不起作用

    开启原生下拉刷新时&#xff0c;页面里使用了全屏高的scroll-view&#xff0c;向下拖动内容时&#xff0c;会优先触发scroll-view滚动而不是下拉刷新。 "enablePullDownRefresh": true, 这就可能会导致下拉刷新不起作用&#xff0c;这时候就需要做到取舍&#xff0c…...

    2024/5/3 2:04:35
  4. 自定义OPPO-r9s的kernel内核,并开启安卓支持docker

    0. 版本说明 本文提供了OPPO手机r9s的内核编译方法&#xff0c;并开机支持docker。用的是开源lineage14.1的rom。 我这边基于开源lineage14.1&#xff0c;打了一个docker内核编译镜像(17380582683/r9s)&#xff0c;大家可以在容器里&#xff0c;手动打出完整的rom包zip文件。…...

    2024/5/2 2:39:28
  5. C++ 【原型模式】

    简单介绍 原型模式是一种创建型设计模式 | 它使你能够复制已有对象&#xff0c;客户端不需要知道要复制的对象是哪个类的实例&#xff0c;只需通过原型工厂获取该对象的副本。 以后需要更改具体的类或添加新的原型类&#xff0c;客户端代码无需改变&#xff0c;只需修改原型工…...

    2024/5/7 14:08:47
  6. 【外汇早评】美通胀数据走低,美元调整

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

    2024/5/7 5:50:09
  7. 【原油贵金属周评】原油多头拥挤,价格调整

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

    2024/5/7 9:45:25
  8. 【外汇周评】靓丽非农不及疲软通胀影响

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

    2024/5/4 23:54:56
  9. 【原油贵金属早评】库存继续增加,油价收跌

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

    2024/5/7 14:25:14
  10. 【外汇早评】日本央行会议纪要不改日元强势

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

    2024/5/4 23:54:56
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

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

    2024/5/4 23:55:05
  12. 【外汇早评】美欲与伊朗重谈协议

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

    2024/5/4 23:54:56
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

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

    2024/5/7 11:36:39
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

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

    2024/5/4 23:54:56
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

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

    2024/5/6 1:40:42
  16. 【外汇早评】美伊僵持,风险情绪继续升温

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

    2024/5/4 23:54:56
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

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

    2024/5/4 23:55:17
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

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

    2024/5/7 9:26:26
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

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

    2024/5/4 23:54:56
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

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

    2024/5/4 23:55:06
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

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

    2024/5/5 8:13:33
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

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

    2024/5/4 23:55:16
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

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

    2024/5/4 23:54:58
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

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

    2024/5/6 21:42:42
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

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

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

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

    2022/11/19 21:17:18
  27. 错误使用 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
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

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

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

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

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

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

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

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

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

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

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

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

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,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
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2022/11/19 21:16:58
  45. 如何在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