一、方法区概述

Person person = new Person()为例,看一下栈、堆、方法区(元空间)之间的关系
在这里插入图片描述

《Java虚拟机规范》中明确说明:‘尽管所有的方法区在逻辑上属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。’但对于HotSpot而言,方法区还有一个别名叫做Non-heap(非堆),目的就是要和堆分开。所以,方法区可以看作是一块独立于Java堆的内存空间。

1.1 方法区的不同版本

  • 在jdk7及以前,习惯上把方法区称为永久代。jdk8开始,使用元空间取代了永久代

  • 本质上,方法区和永久代并不等价。仅是对hotSpot而言的。《java虚拟机规范》对如何实现方法区,不做统一要求。例如:BEA JRockit/IBM J9中不存在永久代的概念

  • 元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代最大的区别在于:元空间不再虚拟机设置的内存中,而是使用本地内存

  • 永久代、元空间并不只是名字变了。内部结构也调整了

  • 在Hotspot中可以把方法区等同于元空间

1.2 方法区的特点

  • 方法区(Method Area)与Java堆一样,是各个线程共享的内存区域

  • 方法区在JVM启动时就会被创建,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的

  • 方法区的大小,跟堆空间一样,可以选择固定大小或者可拓展

  • 方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出错误:java.lang.OutOfMemoryError:PermGen space( jdk1.7之前)java.lang,OutOfMemoryError:Metaspace(jdk1.8之后),比如:

    • 加载大量的第三方jar包;
    • Tomcat部署的工程过多;
    • 大量动态生成反射类;
  • 关闭JVM就会释放这个区域的内存

1.3 举例查看元空间

下面以一个例子看一下方法区(元空间)默认占用情况

public class MethodAreaDemo1 {public static void main(String[] args) throws InterruptedException {System.out.println("start.....");Thread.sleep(1000_000);}
}

在这里插入图片描述

通过下面这个图可以看出来,看似一段非常简单的代码,实际加载到内存中的类有1629个(动态)
在这里插入图片描述

二、方法区参数

2.1 方法区默认参数

jdk7及以前:

  • 通过-XX:PermSize来设置永久代初始分配空间。默认值是20.75M
  • -XX:MaxPermSize来设定永久代最大可分配空间。32位机器默认是64M,64位机器模式是82M
  • 当JVM加载的类信息容量超过了这个值,会报异常OutOfMemoryError : PermGen space

jdk8及以后:

  • 默认值依赖于平台。==windows下,-XX:MetaspaceSize是21M,-XX:MaxMetaspaceSize的值是-1, 即没有限制。==在《1.3 举例查看元空间》中也已看得出来。
  • 与永久代不同,如果不指定大小,默认情况下,虚拟机会耗尽所有的可用系统内存。 如果元数据区发生溢出,虚拟机一样会拋出异常OutOfMemoryError:Metaspace

2.2 方法区自定义参数

默认值就是元空间初始的高水位线,一旦触及这个水位线,Full GC将会被触发并卸载没用的类(即这些类对应的类加载器不再存活),然后这个高水位线将会重置。新的高水位线的值取决于GC后释放了多少元空间。如果释放的空间不足,那么在不超过元空间最大值时,适当提高该值。如果释放空间过多,则适当降低该值

  • -XX:MetaspaceSize=100M: 设置元空间初始大小。

    • 如果初始化的高水位线设置过低,上述高水位线调整情况会发生很多次。通过垃圾回收器的日志可以观察到Full GC多次调用。为了避免频繁地GC,建议将-XX:MetaspaceSize设置为一个相对较高的值。
  • -XX:MaxMetaspaceSize=100M:设置元空间最大值。

2.3 方法区OOMDemo

/***      -XX:MetaspaceSize=10M   -XX:MaxMetaspaceSize=10M*/
public class MethodAreaOOMTest extends ClassLoader {public static void main(String[] args) {int j = 0;try {MethodAreaOOMTest test = new MethodAreaOOMTest();for (int i = 0; i < 10000; i++) {//创建ClassWriter对象,用于生成类的二进制字节码ClassWriter classWriter = new ClassWriter(0);//指明版本号,修饰符,类名,包名,父类,接口classWriter.visit(Opcodes.V1_6, Opcodes.ACC_PUBLIC, "Class" + i, null, "java/lang/Object", null);//返回byte[]byte[] code = classWriter.toByteArray();//类的加载test.defineClass("Class" + i, code, 0, code.length);j++;}} finally {System.out.println(j);}}
}
Exception in thread "main" java.lang.OutOfMemoryError: Compressed class spaceat java.lang.ClassLoader.defineClass1(Native Method)at java.lang.ClassLoader.defineClass(ClassLoader.java:763)at java.lang.ClassLoader.defineClass(ClassLoader.java:642)at cn.rain.java.methodarea.MethodAreaOOMTest.main(MethodAreaOOMTest.java:27)

Compressed class space:代表当前JVM是64位的,并且开启了类指针压缩

2.4 排查OOM思路

要解决00M异常或heap space的异常,一般的手段是首先通过内存映像分析工具(如Eclipse Memory Analyzer) 对dump出来的堆转储快照进行分析,重点是确认内存中的对象是否是必要的,也就是要先分清楚到底是出现了内存泄漏(Memory Leak)还是内存溢出(Memory 0verflow) 。

  • 如果是内存泄漏,可进一步通过工具查看泄漏对象到GC Roots 的引用链。于是就能找到泄漏对象是通过怎样的路径与GCRoots相关联并导致垃圾收集器无法自动回收它们的。掌握了泄漏对象的类型信息,以及GC Roots引用链的信息,就可以比较准确地定位出泄漏代码的位置。

  • 如果不存在内存泄漏,换句话说就是内存中的对象确实都还必须存活着,那就应当检查虚拟机的堆参数(一Xmx与一Xms) ,与机器物理内存对比看是否还可以调大,从代码_上检查是否存在某些对象生命周期过长、持有状态时间过长的情况,尝试减少程序运行期的内存消耗。

三、 方法区内部结构

方法区用于存储已被虚拟机加载的类型信息、 常量、 即时编译器编译后的代码缓存、ClassLoader信息等数据 。Classloader也会记录加载过哪些文件

3.1 类型信息

对每个加载的类型( 类class、接口interface、枚举enum、注解annotation),JVM必 .须在方法区中存储以下类型信息:

  • ①这个类型的完整有效名称(全名=包名.类名)
  • ②这个类型直接父类的完整有效名(对于interface或是java. lang.Object,都没有父类)
  • ③这个类型的修饰符(public, abstract, final的某个子集)
  • ④这个类型直接接口的一个有序列表

3.2 属性信息

  • JVM必须在方法区中保存类型的所有属性的相关信息以及属性的声明顺序。
  • 属性的相关信息包括:属性名称、 属性类型、属性修饰符(public, private, protected, static, final, volatile, transient的某个子集)

3.3 方法信息

JVM必须保存所有方法的以下信息,同域信息一样包括声明顺序:

  • 方法名称
  • 方法的返回类型(或void)
  • 方法参数的数量和类型(按顺序)
  • 方法的修饰符(public, private, protected, static, final, synchronized, native , abstract的一个子集)
  • 方法的字节码(bytecodes)、操作数栈、局部变量表及大小( abstract和native 方法除外)
  • 异常表( abstract和native方法除外)
    • 每个异常处理的开始位置、结束位置、代码处理在程序计数器中的偏移地址、被捕获的异常类的常量池索引

通过一个代码示例反编译后看一下内部结构

package cn.rain.java.methodarea;import java.io.Serializable;/*** @PackageName :  cn.rain.java.methodarea* @Created : 2020/7/1* @Author : Rain* @Version : V1.0* @Des :       方法区内部结构测试*/
public class MethodInnerStrucTest extends Object implements Comparable<String>,Serializable {//属性public int num = 10;private static String str = "测试方法内部结构";//方法public void test1(){int count = 20;System.out.println("count= "+ count);}public static int test2(){int result = 0;try {int value = 30;result = value/0;} catch (Exception e) {e.printStackTrace();}return result;}@Overridepublic int compareTo(String o) {return 0;}
}
Classfile /E:/IdeaProjects/JVM/out/production/chapter01/cn/rain/java/methodarea/MethodInnerStrucTest.classLast modified 2020-7-1; size 1636 bytesMD5 checksum 827030496cbd5a2e7f6311fb20122c24Compiled from "MethodInnerStrucTest.java"
//本类、父类、接口的全限定类名
//类的权限修饰符:flags: ACC_PUBLIC, ACC_SUPER
public class cn.rain.java.methodarea.MethodInnerStrucTest extends java.lang.Object implements java.lang.Comparable<java.lang.String>, java.io.Serializableminor version: 0major version: 52flags: ACC_PUBLIC, ACC_SUPER
//常量池
Constant pool:#1 = Methodref          #18.#52        // java/lang/Object."<init>":()V#2 = Fieldref           #17.#53        // cn/rain/java/methodarea/MethodInnerStrucTest.num:I#3 = Fieldref           #54.#55        // java/lang/System.out:Ljava/io/PrintStream;#4 = Class              #56            // java/lang/StringBuilder#5 = Methodref          #4.#52         // java/lang/StringBuilder."<init>":()V#6 = String             #57            // count=#7 = Methodref          #4.#58         // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;#8 = Methodref          #4.#59         // java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;#9 = Methodref          #4.#60         // java/lang/StringBuilder.toString:()Ljava/lang/String;#10 = Methodref          #61.#62        // java/io/PrintStream.println:(Ljava/lang/String;)V#11 = Class              #63            // java/lang/Exception#12 = Methodref          #11.#64        // java/lang/Exception.printStackTrace:()V#13 = Class              #65            // java/lang/String#14 = Methodref          #17.#66        // cn/rain/java/methodarea/MethodInnerStrucTest.compareTo:(Ljava/lang/String;)I#15 = String             #67            // 测试方法内部结构#16 = Fieldref           #17.#68        // cn/rain/java/methodarea/MethodInnerStrucTest.str:Ljava/lang/String;#17 = Class              #69            // cn/rain/java/methodarea/MethodInnerStrucTest#18 = Class              #70            // java/lang/Object#19 = Class              #71            // java/lang/Comparable#20 = Class              #72            // java/io/Serializable#21 = Utf8               num#22 = Utf8               I#23 = Utf8               str#24 = Utf8               Ljava/lang/String;#25 = Utf8               <init>#26 = Utf8               ()V#27 = Utf8               Code#28 = Utf8               LineNumberTable#29 = Utf8               LocalVariableTable#30 = Utf8               this#31 = Utf8               Lcn/rain/java/methodarea/MethodInnerStrucTest;#32 = Utf8               test1#33 = Utf8               count#34 = Utf8               test2#35 = Utf8               (I)I#36 = Utf8               value#37 = Utf8               e#38 = Utf8               Ljava/lang/Exception;#39 = Utf8               cal#40 = Utf8               result#41 = Utf8               StackMapTable#42 = Class              #63            // java/lang/Exception#43 = Utf8               compareTo#44 = Utf8               (Ljava/lang/String;)I#45 = Utf8               o#46 = Utf8               (Ljava/lang/Object;)I#47 = Utf8               <clinit>#48 = Utf8               Signature#49 = Utf8               Ljava/lang/Object;Ljava/lang/Comparable<Ljava/lang/String;>;Ljava/io/Serializable;#50 = Utf8               SourceFile#51 = Utf8               MethodInnerStrucTest.java#52 = NameAndType        #25:#26        // "<init>":()V#53 = NameAndType        #21:#22        // num:I#54 = Class              #73            // java/lang/System#55 = NameAndType        #74:#75        // out:Ljava/io/PrintStream;#56 = Utf8               java/lang/StringBuilder#57 = Utf8               count=#58 = NameAndType        #76:#77        // append:(Ljava/lang/String;)Ljava/lang/StringBuilder;#59 = NameAndType        #76:#78        // append:(I)Ljava/lang/StringBuilder;#60 = NameAndType        #79:#80        // toString:()Ljava/lang/String;#61 = Class              #81            // java/io/PrintStream#62 = NameAndType        #82:#83        // println:(Ljava/lang/String;)V#63 = Utf8               java/lang/Exception#64 = NameAndType        #84:#26        // printStackTrace:()V#65 = Utf8               java/lang/String#66 = NameAndType        #43:#44        // compareTo:(Ljava/lang/String;)I#67 = Utf8               测试方法内部结构#68 = NameAndType        #23:#24        // str:Ljava/lang/String;#69 = Utf8               cn/rain/java/methodarea/MethodInnerStrucTest#70 = Utf8               java/lang/Object#71 = Utf8               java/lang/Comparable#72 = Utf8               java/io/Serializable#73 = Utf8               java/lang/System#74 = Utf8               out#75 = Utf8               Ljava/io/PrintStream;#76 = Utf8               append#77 = Utf8               (Ljava/lang/String;)Ljava/lang/StringBuilder;#78 = Utf8               (I)Ljava/lang/StringBuilder;#79 = Utf8               toString#80 = Utf8               ()Ljava/lang/String;#81 = Utf8               java/io/PrintStream#82 = Utf8               println#83 = Utf8               (Ljava/lang/String;)V#84 = Utf8               printStackTrace
{public int num;descriptor: Iflags: ACC_PUBLICprivate static java.lang.String str;descriptor: Ljava/lang/String;flags: ACC_PRIVATE, ACC_STATICpublic cn.rain.java.methodarea.MethodInnerStrucTest();descriptor: ()Vflags: ACC_PUBLICCode:stack=2, locals=1, args_size=10: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: aload_05: bipush        107: putfield      #2                  // Field num:I10: returnLineNumberTable:line 12: 0line 14: 4LocalVariableTable:Start  Length  Slot  Name   Signature0      11     0  this   Lcn/rain/java/methodarea/MethodInnerStrucTest;public void test1();descriptor: ()Vflags: ACC_PUBLICCode:stack=3, locals=2, args_size=10: bipush        202: istore_13: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;6: new           #4                  // class java/lang/StringBuilder9: dup10: invokespecial #5                  // Method java/lang/StringBuilder."<init>":()V13: ldc           #6                  // String count=15: invokevirtual #7                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;18: iload_119: invokevirtual #8                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;22: invokevirtual #9                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;25: invokevirtual #10                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V28: returnLineNumberTable:line 19: 0line 20: 3line 21: 28LocalVariableTable:Start  Length  Slot  Name   Signature0      29     0  this   Lcn/rain/java/methodarea/MethodInnerStrucTest;3      26     1 count   Ipublic static int test2();descriptor: ()Iflags: ACC_PUBLIC, ACC_STATICCode:stack=2, locals=2, args_size=00: iconst_01: istore_02: bipush        304: istore_15: iload_16: iconst_07: idiv8: istore_09: goto          1712: astore_113: aload_114: invokevirtual #12                 // Method java/lang/Exception.printStackTrace:()V17: iload_018: ireturnException table:from    to  target type2     9    12   Class java/lang/ExceptionLineNumberTable:line 24: 0line 26: 2line 27: 5line 30: 9line 28: 12line 29: 13line 31: 17LocalVariableTable:Start  Length  Slot  Name   Signature5       4     1 value   I13       4     1     e   Ljava/lang/Exception;2      17     0 result   IStackMapTable: number_of_entries = 2frame_type = 255 /* full_frame */offset_delta = 12locals = [ int ]stack = [ class java/lang/Exception ]frame_type = 4 /* same */public int compareTo(java.lang.String);descriptor: (Ljava/lang/String;)Iflags: ACC_PUBLICCode:stack=1, locals=2, args_size=20: iconst_01: ireturnLineNumberTable:line 37: 0LocalVariableTable:Start  Length  Slot  Name   Signature0       2     0  this   Lcn/rain/java/methodarea/MethodInnerStrucTest;0       2     1     o   Ljava/lang/String;public int compareTo(java.lang.Object);descriptor: (Ljava/lang/Object;)Iflags: ACC_PUBLIC, ACC_BRIDGE, ACC_SYNTHETICCode:stack=2, locals=2, args_size=20: aload_01: aload_12: checkcast     #13                 // class java/lang/String5: invokevirtual #14                 // Method compareTo:(Ljava/lang/String;)I8: ireturnLineNumberTable:line 12: 0LocalVariableTable:Start  Length  Slot  Name   Signature0       9     0  this   Lcn/rain/java/methodarea/MethodInnerStrucTest;static {};descriptor: ()Vflags: ACC_STATICCode:stack=1, locals=0, args_size=00: ldc           #15                 // String 测试方法内部结构2: putstatic     #16                 // Field str:Ljava/lang/String;5: returnLineNumberTable:line 15: 0
}
Signature: #49                          // Ljava/lang/Object;Ljava/lang/Comparable<Ljava/lang/String;>;Ljava/io/Serializable;
SourceFile: "MethodInnerStrucTest.java"

完整的本类、父类、接口的全限定类名

//本类、父类、接口的全限定类名
//类的权限修饰符:flags: ACC_PUBLIC, ACC_SUPER
public class cn.rain.java.methodarea.MethodInnerStrucTest extends java.lang.Object implements java.lang.Comparable<java.lang.String>, java.io.Serializable
flags: ACC_PUBLIC, ACC_SUPER

属性信息

/**顺序与代码书写顺序一致
*  //属性
*  public int num = 10;
*  private static String str = "测试方法内部结构";
*/public int num;							//属性名称descriptor: I						//属性类型flags: ACC_PUBLIC					//权限修饰符private static java.lang.String str;	//属性名称descriptor: Ljava/lang/String;		//属性类型flags: ACC_PRIVATE, ACC_STATIC		//权限修饰符

方法信息

  • 构造器
//构造器,在字节码里面构造器也是属于Method
public cn.rain.java.methodarea.MethodInnerStrucTest();	//方法名descriptor: ()V										//返回值类型flags: ACC_PUBLIC									//权限修饰符
  • test1
//源码
public void test1(){int count = 20;System.out.println("count= "+ count);}public void test1();									//方法名descriptor: ()V										//返回值类型voidflags: ACC_PUBLIC									//权限修饰符Code:stack=3, locals=2, args_size=1//stack=3		操作数栈深度//locals=2		局部变量表大小//args_size=1	参数个数,当前方法不是static修饰,														这里的参数指的是this
  • test2
//源码
public static int test2(){int result = 0;try {int value = 30;result = value/0;} catch (Exception e) {e.printStackTrace();}return result;}public static int test2();								//方法名descriptor: ()I										//返回值类型intflags: ACC_PUBLIC, ACC_STATIC						//权限修饰符Code:stack=2, locals=2, args_size=0//stack=3		操作数栈深度//locals=2		局部变量表大小//args_size=0	参数个数,当前方																		法是static修饰,																		   就不存在this引用........Exception table:									//异常信息表from    to  target type2     9    12   Class java/lang/ExceptionLineNumberTable:line 24: 0line 26: 2line 27: 5line 30: 9line 28: 12line 29: 13line 31: 17........											//从LineNumberTable的第2行至第9															行,对应的是源码的第26行至30行line 26: 2line 27: 5line 30: 9int value = 30;result = value/0;} catch (Exception e) {e.printStackTrace();}

3.4 non-final的类变量

  • 静态变量和类关联在一起,随着类的加载而加载,他们成为类数据在逻辑上的一部分
  • 类变量被类的所有实例所共享,即使没有类实例你也可以访问它。
  • 全局常量 static final 被声明为final的类变量的处理方法则不同,每个全局常量在编译的时候就被分配了。

代码示例及反编译结果

//源码
public class MethodAreaTest {public static void main(String[] args) {Order order = null;order.hello();System.out.println(order.count);}
}class Order {public static int count = 1;public static final int number = 2;public static void hello() {System.out.println("hello!");}
}
//反编译
public static int count;descriptor: Iflags: ACC_PUBLIC, ACC_STATIC//static 修饰在编译阶段没有赋值,在准备阶段													赋初始零值,初始化阶段才真正的给静态变量赋值public static final int number;descriptor: Iflags: ACC_PUBLIC, ACC_STATIC, ACC_FINALConstantValue: int 2						//static final修饰在编译阶段已经赋值

3.5 运行时常量池

上面3.3方法信息中反编译的字节码中包含字节码层面的常量池,如下

//常量池
Constant pool:#1 = Methodref          #18.#52        // java/lang/Object."<init>":()V#2 = Fieldref           #17.#53        // cn/rain/java/methodarea/MethodInnerStrucTest.num:I#3 = Fieldref           #54.#55        // java/lang/System.out:Ljava/io/PrintStream;#4 = Class              #56            // java/lang/StringBuilder
..................................................................#21 = Utf8               num#22 = Utf8               I#23 = Utf8               str#24 = Utf8               Ljava/lang/String;#25 = Utf8               <init>#26 = Utf8               ()V#27 = Utf8               Code
..................................................................

上线的常量池也称为class常量池,是处于编译阶段时期的常量池,这里面包含的内容都是一些符号引用,比如

#21 = Utf8               num
#22 = Utf8               I
#23 = Utf8               str
#24 = Utf8               Ljava/lang/String;
#25 = Utf8               <init>
#26 = Utf8               ()V
#27 = Utf8               Code

这些都是一个个的符号,也就是我们熟知的符号引用。但是在程序运行期间,这些符号引用都会借助动态链接转换为直接引用(动态链接在运行时数据区域—虚拟机栈中有说明),而这经过转换后的常量池被称为运行时常量池,存放在方法区中。

  • JVM方法区中,每个类型都会有一个运行时常量池,池中的数据像数组一样,通过索引访问
  • 运行时常量池包含多种不同的常量,包括编译器已经确定的字面量,也包括到运行期解析后才能够获得的方法或者字段引用。此时不再是常量池中的符号地址了,这里换为真实地址。
  • 具备动态性,例如String类中的public native String intern();
  • 当创建类或接口的运行时常量池时,如果构造运行时常量池所需的内存空间超过了方法区所能提供的最大值,则JVM会抛OOM异常。

四、 方法区的前世今生

首先明确:只有HotSpot才有永久代。 BEA JRockit、IBM J9等来说,是不存在永久代的概念的。原则上如何实现方法区属于虛拟机实现细节,不受《Java虚拟机规范》管束,并不要求统一。

下面的内容都是针对Hotspot来说明。

  • jdk1.6及之前:有永久代(permanent generation),静态变量存放在永久代上

  • jdk1.7:有永久代,但已经逐步“去永久代”,字符串常量池、静态变量移除,保存在堆中

  • jdk1.8及之后: 无永久代,类型信息、字段、方法、常量保存在本地内存的元空间,但字符串常量池、静态变量仍在堆但是静态常量存放在方法区,局部变量存放在虚拟机栈的局部变量表

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

官方文档中说的很明确,在jdk1.8的时候,字符串常量、静态变量放在堆中

The proposed implementation will allocate class meta-data in native memory and move interned Strings and class statics to the Java heap.

  • 静态变量存放位置案例(此案例引用自《深入理解Java虚拟机》)

    public class StaticObjTest {static class Test {static ObjectHolder staticObj = new ObjectHolder();ObjectHolder instanceObj = new ObjectHolder();void foo() {ObjectHolder localObj = new ObjectHolder();System.out.println("done");}}private static class ObjectHolder {}public static void main(String[] args) {Test test = new StaticObjTest.Test();test.foo();}
    }
    
    • staticObj随着Test的Class对象存放在Java堆, instanceObj随着Test的对象实
      例存放在Java堆, localObject则是存放在foo()方法栈帧的局部变量表中。 这个答案是通过前两章学习的
      理论知识得出的, 现在要做的是通过JHSDB来实践验证这一点。

    • 使用scanoops命令在Java堆的新生代(从Eden起始地址到To Survivor结束地址) 范围内查找
      ObjectHolder的实例。 果然找出了三个实例的地址, 而且它们的地址都落到了Eden的范围之内, 算是顺带验证了一般情况下新对象在Eden中创建的分配规则

      hsdb>scanoops 0x00007f32c7800000 0x00007f32c7b50000 JHSDB_TestCase$ObjectHolder
      0x00007f32c7a7c458 JHSDB_TestCase$ObjectHolder
      0x00007f32c7a7c480 JHSDB_TestCase$ObjectHolder
      0x00007f32c7a7c490 JHSDB_TestCase$ObjectHolder
      
    • 接下来要根据堆中对象实例地址找出引用它们的指针, 果然找到了一个引用该对象的地方, 是在一个java.lang.Class的实例里, 并且给出了这个实例的地址, 通过Inspector查看该对象实例, 可以清楚看到这确实是一个java.lang.Class类型的对象实例, 里面有一个名为staticObj的实例字段

    hsdb> revptrs 0x00007f32c7a7c458
    Computing reverse pointers...
    Done.
    Oop for java/lang/Class @ 0x00007f32c7a7b180
    

在这里插入图片描述

从《Java虚拟机规范》 所定义的概念模型来看, 所有Class相关的信息都应该存放在方法区之中,
但方法区该如何实现, 《Java虚拟机规范》 并未做出规定, 这就成了一件允许不同虚拟机自己灵活把
握的事情。 JDK 7及其以后版本的HotSpot虚拟机选择把静态变量与类型在Java语言一端的映射Class对
象存放在一起, 存储于Java堆之中 。

4.1 永久代为什么要被元空间替换

官方文档描述: http://openjdk.java.net/jeps/122

Motivation

This is part of the JRockit and Hotspot convergence effort. JRockit customers do not need to configure the permanent generation (since JRockit does not have a permanent generation) and are accustomed to not configuring the permanent generation.

大概意思:这是JRockit和Hotspot融合工作的一部分,JRockit客户不需要配置永久带,因为JRockit没有永久代,并且也习惯于不配置永久代。

  • jdk1.8中,把类的元数据信息放在了元空间(属于本地内存)
  • 由于元空间在本地内存,所以可分配的最大空间也就是系统最大内存空间
  • 永久代空间大小是很难确定的。 在某些场景下,如果动态加载类过多,容易产生Perm区的O0M。而元空间是在本地内存中存放数据,默认值是-1,所以其大小只要不超过系统内存,则不受限制
  • 比如实际项目中,需要动态的加载很多类,像框架底层的反射机制
  • 永久代调优比较困难

4.2 字符串常量池(String Table)变化

jdk7中将StringTable放到了堆空间中。因为永久代的回收效率很低,在full gc的时候才会触发。而full GC 是老年代的空间不足、永久代不足时才会触发。这就导致了StringTable回收效率不高。而我们开发中会有大量的字符串被创建,回收效率低,导致永久代内存不足。放到堆里,能及时回收内存.

五、方法区回收

一般来说这个区域的回收效果比较难令人满意,尤其是类型的卸载,条件相当苛刻。但是这部分区域的回收有时又确实是必要的。以前 Sun 公司的 Bug 列表中,曾出现过的若干个严重的 Bug 就是由于低版本的 Hotspot 虚拟机对此区域未完全回收而导致内存泄漏。
方法区的垃圾收集主要回收两部分内容:常量池中废奔的常量和不再使用的类型

  • 先来说说方法区内常量池之中主要存放的两大类常量:字面量和符号引用。 字面量比较接近Java语言层次的常量概念,如文本字符串、被声明为final的常量值等。而符号引用则属于编译原理方面的概念,包括下面三类常量:
    • 1、类和接口的全限定名
    • 2、字段的名称和描述符
    • 3、方法的名称和描述符
  • HotSpot虚拟机对常量池的回收策略是很明确的,只要常量池中的常量没有被任何地方引用,就可以被回收。
  • 回收废弃常量与回收Java堆中的对象非常类似。
  • ·判定一个常量是否“废弃”还是相对简单,而要判定一个类型是否属于“不再被使用的类”的条件就比较苛刻了。需要同时满足下面三个条件:
    • 该类所有的实例都已经被回收,也就是Java堆中不存在该类及其任何派生子类的实例。
    • 加载该类的类加载器已经被回收,这个条件除非是经过精心设计的可替换类加载器的场景,如OSGi、JSP的重加载等,否则通常是很难达成的。|】
    • 该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
  • Java虛拟机被允许对满足上述三个条件的无用类进行回收,这里说的仅仅是“被允许”,而并不是和对象一样,没有引用了就必然会回收。关于是否要对类型进行回收,HotSpot虚拟机提供了一Xnoclassgc 参数进行控制,还可以使用一verbose:class以及一XX: +TraceClass一Loading、一XX:+TraceClassUnLoading查 看类加载和卸载信息
  • 在大量使用反射、动态代理、CGLib等字节码框架,动态生成JSP以及oSGi这类频繁自定义类加载器的场景中,通常都需要Java虚拟机具备类型卸载的能力,以保证不会对方法区造成过大的内存压力。

六、总结:运行时数据区域结构图

层次的常量概念,如文本字符串、被声明为final的常量值等。而符号引用则属于编译原理方面的概念,包括下面三类常量:

  • 1、类和接口的全限定名
  • 2、字段的名称和描述符
  • 3、方法的名称和描述符
  • HotSpot虚拟机对常量池的回收策略是很明确的,只要常量池中的常量没有被任何地方引用,就可以被回收。
  • 回收废弃常量与回收Java堆中的对象非常类似。
  • ·判定一个常量是否“废弃”还是相对简单,而要判定一个类型是否属于“不再被使用的类”的条件就比较苛刻了。需要同时满足下面三个条件:
    • 该类所有的实例都已经被回收,也就是Java堆中不存在该类及其任何派生子类的实例。
    • 加载该类的类加载器已经被回收,这个条件除非是经过精心设计的可替换类加载器的场景,如OSGi、JSP的重加载等,否则通常是很难达成的。|】
    • 该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
  • Java虛拟机被允许对满足上述三个条件的无用类进行回收,这里说的仅仅是“被允许”,而并不是和对象一样,没有引用了就必然会回收。关于是否要对类型进行回收,HotSpot虚拟机提供了一Xnoclassgc 参数进行控制,还可以使用一verbose:class以及一XX: +TraceClass一Loading、一XX:+TraceClassUnLoading查 看类加载和卸载信息
  • 在大量使用反射、动态代理、CGLib等字节码框架,动态生成JSP以及oSGi这类频繁自定义类加载器的场景中,通常都需要Java虚拟机具备类型卸载的能力,以保证不会对方法区造成过大的内存压力。

六、总结:运行时数据区域结构图

在这里插入图片描述

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

相关文章

  1. 【消息中间件】RabbitMQ入门基础篇

    一、消息通信模型生产者创建消息,消费者接收这些消息。消息的媒介为建立在真实TCP连接上的虚拟信道(channel)。二、什么是信道?为什么要建立信道?发布消息到RabbitMQ,首先需要先连接到RabbitMQ,才能消费或发布消息。此时,在应用程序和RabbitMQ代理服务器之间创建一条TCP连…...

    2024/4/20 16:17:59
  2. wordpress主题Vieu主题V4.5

    wordpress主题Vieu主题V4.5无授权无限制版 WordPress主题vieu基于Dux主题二次开发!的一款专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。适用范围:wordpress主题、WordPress博客主题 地址:https://www.piaodoo.com/10359.html...

    2024/4/18 7:32:04
  3. Java方法重载

    Java方法的重载,通俗易懂 方法重载定义 所谓方法重载,就是在一个类中,方法名字相同,而参数不同。 方法的重载规则: 1、方法名称必须相同。 2、参数列表必须不同,其中可以包括参数个数不同,参数类型不同、参数顺序不同等。 3、无法以返回值类型作为重载函数的区分标准。 …...

    2024/4/18 8:20:31
  4. maven创建archetype-webapp的时候很慢,目录一直显示不完全

    在新建archetype-webapp的时候,发现生成的目录不完整,后来发现是因为一直没有build成功,一直卡在查阅了一些资料发现是在请求一个叫archetype-catalog.xml的文件一直不成功,可以在创建的步骤中那里添加一个属性name=archetypeCatalogvalue=internal即可解决。...

    2024/4/19 20:58:21
  5. POJ3321 Apple Tree(树状数组+dfs序)

    题意:有n个点,每个点都有苹果,操作1 查询 点x的子树上有又多少个苹果包括自身,操作2 若点x上有苹果则摘下,没有则长出一个 思路:用树状数组去维护苹果树上的苹果个数,dfs序建树获取树上子树和根的区间。 #include <cstdio> #include <cstring> #include <…...

    2024/5/7 3:08:30
  6. leetcode-数组-简单-找到所有数组中消失的数字

    题目给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。找到所有在 [1, n] 范围之间没有出现在数组中的数字。您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空…...

    2024/5/6 23:47:10
  7. Pytorch模型中的GPU运算详解与实践

    文章目录前言一、关于CUDA的函数接口1.1 torch.cuda1.2 torch.device1.3 .to()1.4 使用指定的GPU1.5 多GPU训练二、训练实例代码展示2.1 数据并行处理2.2 模型并行处理2.2.1 通过流水线输入(Pipelining Inputs)加速三、使用GPU注意事项 前言 什么是GPU? GPU(Graphic Proces…...

    2024/5/6 23:36:59
  8. Mycat数据库集群中间件

    Mycat数据库集群中间件Mycat中间件Mycat分片原理Mycat使用 Mycat中间件 Mycat分片原理 使用了哈希算法,根据id求余数来确定存储或查询哪个数据库Mycat使用 mycat安装省略 一、启动mycat,bin目录下的mycat文件二、使用vi编辑器进入conf目录下,查看server.xml文件三、查看虚拟…...

    2024/4/16 10:50:21
  9. Computer Graphics note(4):Shading

    文章目录一.Shading Model(Blinn-Phong Reflectance Model)1.相关定义(Shading is Local)2.Diffuse Reflection(Blinn-Phong)(1)Shading Point接收的能量强度(2)到达Shading Point的能量强度(3)漫反射表示 & Shading Point的颜色3.Specular Term(Blinn-Phong)(1)高光条件(2…...

    2024/4/16 10:50:01
  10. 机器学习模型的常用评价指标

    在看论文的过程中发现了有很多模型好坏的评价指标,有比较常见的指标,也有一些从未了解到的评价指标,是时候来整理一波了,以便后续学习查缺补漏。常见概念:真正(True Positive , TP):被模型预测为正的正样本。假正(False Positive , FP):被模型预测为正的负样本。假负(Fa…...

    2024/5/7 2:14:08
  11. hualinux 进阶 1.1:前言

    目录一、基于前面的运维基础篇二、关于进阶篇进阶篇之运维技能,主要是运维的进阶篇,其中多少会涉及到一部分开发方面的知识,我将会从dokcer、ansible/saltStack、ELK/EFK、k8s生态、自动化待续集成等方面进行介绍一、基于前面的运维基础篇在运维基础篇,我花了5个专栏,如下…...

    2024/5/7 2:45:22
  12. spring多数据源分布式事务的分析与解决方案

    spring多数据源分布式事务的分析与解决方案参考文章: (1)spring多数据源分布式事务的分析与解决方案 (2)https://www.cnblogs.com/qianjun2017/p/8349829.html 备忘一下。...

    2024/5/6 17:31:54
  13. IntelliJ Idea java开发常用插件记录

    java开发时常用的插件记录 .env files support .ignore Alibaba Java Coding Guidelines BashSupport Lombok Maven Helper Protobuf Support可选安装 arthas idea AsciiDoc Docker jclasslib Bytecode viewer Key Promoter X...

    2024/4/19 14:32:27
  14. less快速入门------混入mixin学习

    一,什么是混入 1.混入就是将一组样式添加到另一组样式里, 二,混入的形式 1.普通的混入 .a{width:10px; }.b{.a;height:10px; }2.带参数的混入 .a(@height) {height:@height; }.b{.a(20px)width:20px; }3.带默认参数的混入 .a(@height:10px) {height:@height; }.b{.a()width:…...

    2024/4/16 10:51:03
  15. Malplotlib教程

    Matplotlib教程:https://www.runoob.com/w3cnote/matplotlib-tutorial.html...

    2024/5/4 23:08:40
  16. 总结了大量的 Java 代码精简之道,值得一看

    转载自品略图书馆 http://www.pinlue.com/article/2020/06/3022/0910903417432.htmlJava 代码精简之“道”。1.利用语法1.1.利用三元表达式普通:String title;if (isMember(phone)) { title = "会员";} else { title = "游客";}精简:String title …...

    2024/4/16 10:51:17
  17. 主动操作案例

    ...

    2024/4/16 10:51:07
  18. Matlab建模—回归拟合(ployfit与regress使用)

    数学建模期末复习,撰写博客做总结之用,主要侧重于算例的模型建立与部分代码的实现,其中不足之处望读者多多指正。文章目录多(一)元线性回归多(一)元线性拟合公式Matlab相关函数例子1一元线性回归例子2多元线性回归ployfit拟合例子2的另解 多(一)元线性回归 多(一)元…...

    2024/4/5 6:31:41
  19. ActiveMQ_05 消息的事务性

    (1)生产者开启事务后,执行commit方法,这批消息才真正的被提交。不执行commit方法,这批消息不会提交。执行rollback方法,之前的消息会回滚掉。生产者的事务机制,要高于签收机制,当生产者开启事务,签收机制不再重要。(2)消费者开启事务后,执行commit方法,这批消息才…...

    2024/4/16 10:50:37
  20. python中文对齐的解决办法,.format填充中文空格

    chr(122288)是中文空格 tplt="{0:^10}\t{1:{3}^10}\t{2:^10}"; print(tplt.format(ls[0],ls[1],ls[2],chr(12288)))...

    2024/4/16 10:51:07

最新文章

  1. 每天一个数据分析题(三百零五)

    同环比是业务描述性分析中针对时间维度使用的重要指标&#xff0c;以下关于同环比描述正确的是 A. 同环比计算方法一般适用于对长周期业务行为结果的观测 B. 有短周期变化特征&#xff0c;应尽量使用环比 C. 在描述较大时间间隔下的行为水平变化特征时应使用环比 D. 同环比…...

    2024/5/7 6:08:42
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/5/6 9:38:23
  3. spark on hive

    由于spark不存在元数据管理模块&#xff0c;为了能方便地通过sql操作hdfs数据&#xff0c;我们可以通过借助hive的元数据管理模块实现。对于hive来说&#xff0c;核心组件包含两个&#xff1a; sql优化翻译器&#xff0c;翻译sql到mapreduce并提交到yarn执行metastore&#xf…...

    2024/5/5 3:54:38
  4. 离散数学【详解】-自学考试湖北,争取做到识字都能看懂。

    回顾8年前&#xff0c;我记得我大学高数没复习&#xff0c;考了23分。 今天公司代码写完了&#xff0c;明天清明节&#xff0c;写篇文章磨磨时间。 我的文章&#xff0c;没有一篇不是磨时间能好好写出来的。 ----我 先列标题&#xff0c;比如h1,h2,这些内容。然后往里面填字&a…...

    2024/5/4 17:28:03
  5. 【外汇早评】美通胀数据走低,美元调整

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

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

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

    2024/5/4 23:54:56
  7. 【外汇周评】靓丽非农不及疲软通胀影响

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

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

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

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

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

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

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

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

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

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

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

    2024/5/4 23:55:16
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2024/5/4 23:54:56
  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