diff --git a/docs/java/basis/java-basic-questions-02.md b/docs/java/basis/java-basic-questions-02.md index e80c74ba..40cb9e5b 100644 --- a/docs/java/basis/java-basic-questions-02.md +++ b/docs/java/basis/java-basic-questions-02.md @@ -520,50 +520,88 @@ System.out.println(s); **字符串常量池** 是 JVM 为了提升性能和减少内存消耗针对字符串(String 类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建。 ```java -String aa = "ab"; // 放在常量池中 -String bb = "ab"; // 从常量池中查找 +// 在堆中创建字符串对象”ab“ +// 将字符串对象”ab“的引用保存在字符串常量池中 +String aa = "ab"; +// 直接返回字符串常量池中字符串对象”ab“的引用 +String bb = "ab"; System.out.println(aa==bb);// true ``` -JDK1.7 之前运行时常量池逻辑包含字符串常量池存放在方法区。JDK1.7 的时候,字符串常量池被从方法区拿到了堆中。 - -你可以在 JVM 部分找到更多关于字符串常量池的介绍。 +更多关于字符串常量池的介绍可以看一下 [Java 内存区域详解](https://javaguide.cn/java/jvm/memory-area.html) 这篇文章。 #### String s1 = new String("abc");这句话创建了几个字符串对象? -会创建 1 或 2 个字符串: +会创建 1 或 2 个字符串。 -- 如果字符串常量池中已存在字符串常量“abc”,则只会在堆空间创建一个字符串常量“abc”。 -- 如果字符串常量池中没有字符串常量“abc”,那么它将首先在字符串常量池中创建,然后在堆空间中创建,因此将创建总共 2 个字符串对象。 +1、如果字符串常量池中不存在字符串对象“abc”的引用,那么会在堆中创建 2 个字符串对象“abc”。 -**验证** : +示例代码(JDK 1.8): ```java -String s1 = new String("abc");// 堆内存的地址值 -String s2 = "abc"; -System.out.println(s1 == s2);// 输出 false,因为一个是堆内存,一个是常量池的内存,故两者是不同的。 -System.out.println(s1.equals(s2));// 输出 true +String s1 = new String("abc"); ``` -**结果** : +对应的字节码: +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/open-source-project/image-20220413175809959.png) + +`ldc` 命令用于判断字符串常量池中是否保存了对应的字符串对象的引用,如果保存了的话直接返回,如果没有保存的话,会在堆中创建对应的字符串对象并将该字符串对象的引用保存到字符串常量池中。 + +2、如果字符串常量池中已存在字符串对象“abc”的引用,则只会在堆中创建 1 个字符串对象“abc”。 + +示例代码(JDK 1.8): + +```java +// 字符串常量池中已存在字符串对象“abc”的引用 +String s1 = "abc"; +// 下面这段代码只会在堆中创建 1 个字符串对象“abc” +String s2 = new String("abc"); ``` -false -true + +对应的字节码: + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/open-source-project/image-20220413180021072.png) + +这里就不对上面的字节码进行详细注释了,7 这个位置的 `ldc` 命令不会在堆中创建新的字符串对象“abc”,这是因为 0 这个位置已经执行了一次 `ldc` 命令,已经在堆中创建过一次字符串对象“abc”了。7 这个位置执行 `ldc` 命令会直接返回字符串常量池中字符串对象“abc”对应的引用。 + +#### intern 方法有什么作用? + +`String.intern()` 是一个 native(本地)方法,其作用是将指定的字符串对象的引用保存在字符串常量池中,可以简单分为两种情况: + +- 如果字符串常量池中保存了对应的字符串对象的引用,就直接返回该引用。 +- 如果字符串常量池中没有保存了对应的字符串对象的引用,那就在常量池中创建一个指向该字符串对象的引用并返回。 + +示例代码(JDK 1.8) : + +```java +// 在堆中创建字符串对象”Java“ +// 将字符串对象”Java“的引用保存在字符串常量池中 +String s1 = "Java"; +// 直接返回字符串常量池中字符串对象”Java“对应的引用 +String s2 = s1.intern(); +// 会在堆中在单独创建一个字符串对象 +String s3 = new String("Java"); +// 直接返回字符串常量池中字符串对象”Java“对应的引用 +String s4 = s3.intern(); +// s1 和 s2 指向的是堆中的同一个对象 +System.out.println(s1 == s2); // true +// s3 和 s4 指向的是堆中不同的对象 +System.out.println(s3 == s4); // false +// s1 和 s4 指向的是堆中不同的对象 +System.out.println(s1 == s4); //true ``` #### String 类型的变量和常量做“+”运算时发生了什么? -一个非常常见的面试题。 - 先来看字符串不加 `final` 关键字拼接的情况(JDK1.8): ```java String str1 = "str"; String str2 = "ing"; -String str3 = "str" + "ing";//常量池中的对象 -String str4 = str1 + str2; //在堆上创建的新的对象 -String str5 = "string";//常量池中的对象 +String str3 = "str" + "ing"; +String str4 = str1 + str2; +String str5 = "string"; System.out.println(str3 == str4);//false System.out.println(str3 == str5);//true System.out.println(str4 == str5);//false @@ -573,39 +611,23 @@ System.out.println(str4 == str5);//false ![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/java-guide-blog/image-20210817123252441.png) -> 对于基本数据类型来说,== 比较的是值。对于引用数据类型来说,==比较的是对象的内存地址。 +**对于编译期可以确定值的字符串,也就是常量字符串 ,jvm 会将其存入字符串常量池。并且,字符串常量拼接得到的字符串常量在编译阶段就已经被存放字符串常量池,这个得益于编译器的优化。** -对于编译期可以确定值的字符串,也就是常量字符串 ,jvm 会将其存入字符串常量池。 +在编译过程中,Javac 编译器(下文中统称为编译器)会进行一个叫做 **常量折叠(Constant Folding)** 的代码优化。《深入理解 Java 虚拟机》中是也有介绍到: -> **字符串常量池** 是 JVM 为了提升性能和减少内存消耗针对字符串(String 类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建。 -> -> ```java -> String aa = "ab"; // 放在常量池中 -> String bb = "ab"; // 从常量池中查找 -> System.out.println(aa==bb);// true -> ``` -> -> JDK1.7 之前运行时常量池逻辑包含字符串常量池存放在方法区。JDK1.7 的时候,字符串常量池被从方法区拿到了堆中。 +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/javaguide/image-20210817142715396.png) -并且,字符串常量拼接得到的字符串常量在编译阶段就已经被存放字符串常量池,这个得益于编译器的优化。 +常量折叠会把常量表达式的值求出来作为常量嵌在最终生成的代码中,这是 Javac 编译器会对源代码做的极少量优化措施之一(代码优化几乎都在即时编译器中进行)。 -> 在编译过程中,Javac 编译器(下文中统称为编译器)会进行一个叫做 **常量折叠(Constant Folding)** 的代码优化。《深入理解 Java 虚拟机》中是也有介绍到: -> -> ![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/javaguide/image-20210817142715396.png) -> -> 常量折叠会把常量表达式的值求出来作为常量嵌在最终生成的代码中,这是 Javac 编译器会对源代码做的极少量优化措施之一(代码优化几乎都在即时编译器中进行)。 -> -> 对于 `String str3 = "str" + "ing";` 编译器会给你优化成 `String str3 = "string";` 。 -> -> 并不是所有的常量都会进行折叠,只有编译器在程序编译期就可以确定值的常量才可以: -> -> - 基本数据类型( `byte`、`boolean`、`short`、`char`、`int`、`float`、`long`、`double`)以及字符串常量。 -> - `final` 修饰的基本数据类型和字符串变量 -> - 字符串通过 “+”拼接得到的字符串、基本数据类型之间算数运算(加减乘除)、基本数据类型的位运算(<<、\>>、\>>> ) +对于 `String str3 = "str" + "ing";` 编译器会给你优化成 `String str3 = "string";` 。 -因此,`str1` 、 `str2` 、 `str3` 都属于字符串常量池中的对象。 +并不是所有的常量都会进行折叠,只有编译器在程序编译期就可以确定值的常量才可以: -引用的值在程序编译期是无法确定的,编译器无法对其进行优化。 +- 基本数据类型( `byte`、`boolean`、`short`、`char`、`int`、`float`、`long`、`double`)以及字符串常量。 +- `final` 修饰的基本数据类型和字符串变量 +- 字符串通过 “+”拼接得到的字符串、基本数据类型之间算数运算(加减乘除)、基本数据类型的位运算(<<、\>>、\>>> ) + +**引用的值在程序编译期是无法确定的,编译器无法对其进行优化。** 对象引用和“+”的字符串拼接方式,实际上是通过 `StringBuilder` 调用 `append()` 方法实现的,拼接完成之后调用 `toString()` 得到一个 `String` 对象 。 @@ -613,16 +635,12 @@ System.out.println(str4 == str5);//false String str4 = new StringBuilder().append(str1).append(str2).toString(); ``` -因此,`str4` 并不是字符串常量池中存在的对象,属于堆上的新对象。 - -我画了一个图帮助理解: - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/java-guide-blog/%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%8B%BC%E6%8E%A5-%E5%B8%B8%E9%87%8F%E6%B1%A0.png) - 我们在平时写代码的时候,尽量避免多个字符串对象拼接,因为这样会重新创建对象。如果需要改变字符串的话,可以使用 `StringBuilder` 或者 `StringBuffer`。 不过,字符串使用 `final` 关键字声明之后,可以让编译器当做常量来处理。 +示例代码: + ```java final String str1 = "str"; final String str2 = "ing"; @@ -636,7 +654,7 @@ System.out.println(c == d);// true 如果 ,编译器在运行时才能知道其确切值的话,就无法对其优化。 -示例代码如下(`str2` 在运行时才能确定其值): +示例代码(`str2` 在运行时才能确定其值): ```java final String str1 = "str"; @@ -649,83 +667,6 @@ public static String getStr() { } ``` -**我们再来看一个类似的问题!** - -```java -String str1 = "abcd"; -String str2 = new String("abcd"); -String str3 = new String("abcd"); -System.out.println(str1==str2); -System.out.println(str2==str3); -``` - -上面的代码运行之后会输出什么呢? - -答案是: - -``` -false -false -``` - -**这是为什么呢?** - -我们先来看下面这种创建字符串对象的方式: - -```java -// 从字符串常量池中拿对象 -String str1 = "abcd"; -``` - -这种情况下,jvm 会先检查字符串常量池中有没有"abcd",如果字符串常量池中没有,则创建一个,然后 str1 指向字符串常量池中的对象,如果有,则直接将 str1 指向"abcd"; - -因此,`str1` 指向的是字符串常量池的对象。 - -我们再来看下面这种创建字符串对象的方式: - -```java -// 直接在堆内存空间创建一个新的对象。 -String str2 = new String("abcd"); -String str3 = new String("abcd"); -``` - -**只要使用 new 的方式创建对象,便需要创建新的对象** 。 - -使用 new 的方式创建对象的方式如下,可以简单概括为 3 步: - -1. 在堆中创建一个字符串对象 -2. 检查字符串常量池中是否有和 new 的字符串值相等的字符串常量 -3. 如果没有的话需要在字符串常量池中也创建一个值相等的字符串常量,如果有的话,就直接返回堆中的字符串实例对象地址。 - -因此,`str2` 和 `str3` 都是在堆中新创建的对象。 - -**字符串常量池比较特殊,它的主要使用方法有两种:** - -1. 直接使用双引号声明出来的 `String` 对象会直接存储在常量池中。 -2. 如果不是用双引号声明的 `String` 对象,使用 `String` 提供的 `intern()` 方法也有同样的效果。`String.intern()` 是一个 Native 方法,它的作用是:如果字符串常量池中已经包含一个等于此 String 对象内容的字符串,则返回常量池中该字符串的引用;如果没有,JDK1.7 之前(不包含 1.7)的处理方式是在常量池中创建与此 `String` 内容相同的字符串,并返回常量池中创建的字符串的引用,JDK1.7 以及之后,字符串常量池被从方法区拿到了堆中,jvm 不会在常量池中创建该对象,而是将堆中这个对象的引用直接放到常量池中,减少不必要的内存开销。 - -示例代码如下(JDK 1.8) : - -```java -String s1 = "Javatpoint"; -String s2 = s1.intern(); -String s3 = new String("Javatpoint"); -String s4 = s3.intern(); -System.out.println(s1==s2); // True -System.out.println(s1==s3); // False -System.out.println(s1==s4); // True -System.out.println(s2==s3); // False -System.out.println(s2==s4); // True -System.out.println(s3==s4); // False -``` - -**总结** : - -1. 对于基本数据类型来说,==比较的是值。对于引用数据类型来说,==比较的是对象的内存地址。 -2. 在编译过程中,Javac 编译器(下文中统称为编译器)会进行一个叫做 **常量折叠(Constant Folding)** 的代码优化。常量折叠会把常量表达式的值求出来作为常量嵌在最终生成的代码中,这是 Javac 编译器会对源代码做的极少量优化措施之一(代码优化几乎都在即时编译器中进行)。 -3. 一般来说,我们要尽量避免通过 new 的方式创建字符串。使用双引号声明的 `String` 对象( `String s1 = "java"` )更利于让编译器有机会优化我们的代码,同时也更易于阅读。 -4. 被 `final` 关键字修改之后的 `String` 会被编译器当做常量来处理,编译器程序编译期就可以确定它的值,其效果就相当于访问常量。 - ## 参考 - 深入解析 String#intern diff --git a/docs/java/jvm/memory-area.md b/docs/java/jvm/memory-area.md index cb0a2afb..6cdae59c 100644 --- a/docs/java/jvm/memory-area.md +++ b/docs/java/jvm/memory-area.md @@ -74,7 +74,7 @@ Java 虚拟机规范对于运行时数据区域的规定是相当宽松的。以 **操作数栈** 主要作为方法调用的中转站使用,用于存放方法执行过程中产生的中间计算结果。另外,计算过程中产生的临时变量也会放在操作数栈中。 -**动态链接** 主要服务一个方法需要调用其他方法的场景。在 Java 源文件被编译成字节码文件时,所有的变量和方法引用都作为符号引用(Symbilic Reference)保存在Class 文件的常量池里。当一个方法要调用其他方法,需要将常量池中指向方法的符号引用转化为其在内存地址中的直接引用。动态链接的作用就是为了将符号引用转换为调用方法的直接引用。 +**动态链接** 主要服务一个方法需要调用其他方法的场景。在 Java 源文件被编译成字节码文件时,所有的变量和方法引用都作为符号引用(Symbilic Reference)保存在 Class 文件的常量池里。当一个方法要调用其他方法,需要将常量池中指向方法的符号引用转化为其在内存地址中的直接引用。动态链接的作用就是为了将符号引用转换为调用方法的直接引用。 ![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/jvmimage-20220331175738692.png) @@ -195,51 +195,42 @@ JDK 1.8 的时候,方法区(HotSpot 的永久代)被彻底移除了(JDK1 与永久代很大的不同就是,如果不指定大小的话,随着更多类的创建,虚拟机会耗尽所有可用的系统内存。 -最后,我画了 3 张图带你看看 JDK1.6 到 JDK1.8 方法区的变化。 - -![方法区-jdk1.6](./pictures/java内存区域/method-area-1.6.png) - -![方法区-jdk1.7](./pictures/java内存区域/method-area-jdk1.7.png) - -![方法区-jdk1.8](./pictures/java内存区域/method-area-jdk1.8.png) - -多提一嘴,为了完善方法区这部分内容的介绍,我看了很多文档,还特意去扒了一下《深入理解Java虚拟机(第3版)》勘误的 issues,简直看到的脑壳疼。。。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/jvmimage-20220331112415166.png) - -讲真,深挖下来的话细节太多,也没太大意义(卷不动了),我上面讲到的这些基本就够面试使用了。 - ### 运行时常量池 -Class 文件中除了有类的版本、字段、方法、接口等描述信息外,还有用于存放编译期生成的各种字面量(Literal)和符号引用(Symbolic Reference)的常量池表(Constant Pool Table)。常量池表会在类加载后存放到方法区的运行时常量池中。 +Class 文件中除了有类的版本、字段、方法、接口等描述信息外,还有用于存放编译期生成的各种字面量(Literal)和符号引用(Symbolic Reference)的 **常量池表(Constant Pool Table)** 。 字面量是源代码中的固定值的表示法,即通过字面我们就能知道其值的含义。字面量包括整数、浮点数和字符串字面量,符号引用包括类符号引用、字段符号引用、方法符号引用和接口方法符号引用。 +常量池表会在类加载后存放到方法区的运行时常量池中。 + 运行时常量池的功能类似于传统编程语言的符号表,尽管它包含了比典型符号表更广泛的数据。 既然运行时常量池是方法区的一部分,自然受到方法区内存的限制,当常量池无法再申请到内存时会抛出 `OutOfMemoryError` 错误。 -~~**JDK1.7 及之后版本的 JVM 已经将运行时常量池从方法区中移了出来,在 Java 堆(Heap)中开辟了一块区域存放运行时常量池。**~~ - -> **🐛 修正(参见:[issue747](https://github.com/Snailclimb/JavaGuide/issues/747),[reference](https://blog.csdn.net/q5706503/article/details/84640762))** : -> -> 1. JDK1.7 之前,运行时常量池包含的字符串常量池和静态变量存放在方法区, 此时 HotSpot 虚拟机对方法区的实现为永久代。 -> 2. JDK1.7 字符串常量池和静态变量被从方法区拿到了堆中, 这里没有提到运行时常量池,也就是说字符串常量池被单独拿到堆,运行时常量池剩下的东西还在方法区, 也就是 HotSpot 中的永久代 。 -> 3. JDK1.8 HotSpot 移除了永久代用元空间(Metaspace)取而代之, 这时候字符串常量池和静态变量还在堆, 运行时常量池还在方法区, 只不过方法区的实现从永久代变成了元空间(Metaspace) - -**字符串常量池有什么作用?** +### 字符串常量池 **字符串常量池** 是 JVM 为了提升性能和减少内存消耗针对字符串(String 类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建。 ```java -String aa = "ab"; // 放在常量池中 -String bb = "ab"; // 从常量池中查找 +// 在堆中创建字符串对象”ab“ +// 将字符串对象”ab“的引用保存在字符串常量池中 +String aa = "ab"; +// 直接返回字符串常量池中字符串对象”ab“的引用 +String bb = "ab"; System.out.println(aa==bb);// true ``` -JDK1.7 之前运行时常量池逻辑包含字符串常量池存放在方法区。JDK1.7 的时候,字符串常量池被从方法区拿到了堆中。 +HotSpot 虚拟机中字符串常量池的实现是 `src/hotspot/share/classfile/stringTable.cpp` ,`StringTable` 本质上就是一个`HashSet` ,容量为 `StringTableSize`(可以通过 `-XX:StringTableSize` 参数来设置)。 -这里的字符串其实就是我们前面提到的字符串字面量。在声明一个字符串字面量时,如果字符串常量池中能够找到该字符串字面量,则直接返回该引用。如果找不到的话,则在常量池中创建该字符串字面量的对象并返回其引用。 +**`StringTable` 中保存的是字符串对象的引用,字符串对象的引用指向堆中的字符串对象。** + +JDK1.7 之前,字符串常量池存放在永久代。JDK1.7 字符串常量池和静态变量从永久代移动了 Java 堆中。 + +![](pictures/java内存区域/method-area-jdk1.6.png) + +![](pictures/java内存区域/method-area-jdk1.7.png) + +![](pictures/java内存区域/method-area-jdk1.8.png) **JDK 1.7 为什么要将字符串常量池移动到堆中?** @@ -247,6 +238,10 @@ JDK1.7 之前运行时常量池逻辑包含字符串常量池存放在方法区 相关问题:[JVM 常量池中存储的是对象还是引用呢? - RednaxelaFX - 知乎](https://www.zhihu.com/question/57109429/answer/151717241) +最后再来分享一段周志明老师在[《深入理解 Java 虚拟机(第 3 版)》样例代码&勘误](https://github.com/fenixsoft/jvm_book) Github 仓库的 [issue#112](https://github.com/fenixsoft/jvm_book/issues/112) 中说过的话: + +> **运行时常量池、方法区、字符串常量池这些都是不随虚拟机实现而改变的逻辑概念,是公共且抽象的,Metaspace、Heap 是与具体某种虚拟机实现相关的物理概念,是私有且具体的。** + ### 直接内存 直接内存并不是虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用。而且也可能导致 OutOfMemoryError 错误出现。 @@ -336,7 +331,9 @@ Java 对象的创建过程我建议最好是能默写出来,并且要掌握每 - 《深入理解 Java 虚拟机:JVM 高级特性与最佳实践(第二版》 - 《自己动手写 Java 虚拟机》 - Chapter 2. The Structure of the Java Virtual Machine:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html -- JVM栈帧内部结构-动态链接:https://chenxitag.com/archives/368 +- JVM 栈帧内部结构-动态链接:https://chenxitag.com/archives/368 +- Java 中 new String("字面量") 中 "字面量" 是何时进入字符串常量池的? - 木女孩的回答 - 知乎: https://www.zhihu.com/question/55994121/answer/147296098 +- JVM 常量池中存储的是对象还是引用呢? - RednaxelaFX 的回答 - 知乎: https://www.zhihu.com/question/57109429/answer/151717241 - - - diff --git a/docs/java/jvm/method-area-jdk1.6.png b/docs/java/jvm/method-area-jdk1.6.png new file mode 100644 index 00000000..c46ce57e Binary files /dev/null and b/docs/java/jvm/method-area-jdk1.6.png differ diff --git a/docs/java/jvm/pictures/java内存区域/Java运行时数据区域JDK1.8.png b/docs/java/jvm/pictures/java内存区域/Java运行时数据区域JDK1.8.png index 67ea8df2..a6ba271d 100644 Binary files a/docs/java/jvm/pictures/java内存区域/Java运行时数据区域JDK1.8.png and b/docs/java/jvm/pictures/java内存区域/Java运行时数据区域JDK1.8.png differ diff --git a/docs/java/jvm/pictures/java内存区域/hotspot-heap-structure.png b/docs/java/jvm/pictures/java内存区域/hotspot-heap-structure.png index 9c8e8c45..4ae7436f 100644 Binary files a/docs/java/jvm/pictures/java内存区域/hotspot-heap-structure.png and b/docs/java/jvm/pictures/java内存区域/hotspot-heap-structure.png differ diff --git a/docs/java/jvm/pictures/java内存区域/method-area-1.6.drawio b/docs/java/jvm/pictures/java内存区域/method-area-1.6.drawio deleted file mode 100644 index 58807ff9..00000000 --- a/docs/java/jvm/pictures/java内存区域/method-area-1.6.drawio +++ /dev/null @@ -1 +0,0 @@ -7Vptb5tIEP41K919cAUsrx/BxmlS3am6nJp+O61hMSgYHIzjpL/+ZpbFBrO+pDrbcdM6kbzM7AvMM8/M7GJCx4unq4ot0z/KmOfE0OInQifEMHRds+ELJc+NxPOcRjCvslh22glus29cCjUpXWcxX/U61mWZ19myL4zKouBR3ZOxqio3/W5JmfdXXbI5HwhuI5YPpXdZXKeN1DWcnfwjz+Zpu7Jue41mwdrO8klWKYvLTUdEQ0LHVVnWTWvxNOY5Gq+1SzNuekC7vbGKF/VrBnz9Gq4/Ltk1+8LvJqX/kH3+yxqZzSyPLF/LB5Y3Wz+3FqjKdRFznEQnNNikWc1vlyxC7QYwB1laL3KpTrI8H5d5WYmxNLHwD+SruirveUdjiw9q7nkdpe3wsqilD8DTNNedQc0H5MNnl+Z45FXNnzoiaYsrXi54XT1DF+mIWw/b7GC1bClLO5BuhUy60nw7187a0JAG/w7j20PjhzbxbBJ42Ago8SwSWsQdk8An4ZQEY+K6QqWRABom9nQt0QiITz/zanHFCxzjh8QLSegQN8TecrA3QBesVfch7ENVlAXfw1WKWJ7NC7iMAAMO8gBtnwFzfKlYZHGMyyh9ZudV2h7u1v/EV2pN2oxo4aZDuE1HAbdxKrTd01ItZtxNIiXVIpfPkpeodgSTG61/tTb3hjY3LJXNT0axluQ9jrkkmBK4N2j4OrILWeeQwEbiAK+QWsAr4M5UkE0nvjbA6vKIYxwJRcfsoUgVgdJwz8kcXVeA6BFvQjwRKOFmXF0ESoC1g91RM5kb8UhJr5lrmZb2BvSyIPK/il7uyYChA2Burv/epiNMP36DjYPpx6MiM00QpKNikySGGpvYntnWi1XGEbBpOXI50FinTTdcjy3uqGzu2Q5l57C50bf5JWQbVUXnYAIBPmB8gn8q6DHFzIOhC3LLMFC929xiXVpmcf4LsBdxem9bI6m1+8Si1hAmXUUs82QwKWpnmUkcRAc2O4H1Cy+Jl6mg1Znx8hR4DXe2v/BqYPCGxcJ58TKGu6QP4vODZKa0rLJvIGO57HCMim6vpDPtIavMc+YqQ7ELMuwc4VgtWQHtObYxMHpTcWAEjBsTv9neWuIUCIg2wWjZLUq8kLhBOxPcWW+yn4SRlF5aymvLdXXKcxBW3xYh1CXB+z+0PYDT26c6Y7gF7sAjjiQCR5wrjUXOc4hnEv/I+98fCLC3z3XDVx4/fa6j7qXlOtVG2sXjPk/kNUhY3lQmOMx0wDNbvAg5dLx0mVgeAbr9kydHFRGpfRrs+PWf41l89+mfUfWYf7nxH6i5Hh0uU2B+BpooZdWKN7dhP6zx/WewrhN8QdJe7uqPboHTAbTtGDVg+aCs5rPf4JngprX263cxhYZmHyVskeXPTdeU548cQezoVwIX1BrW8qmraBZFTVFWC+TdVreRBkWlqTVs1HJeg6eM4J6jrJgPR6IvjqRboW7rWa0uA5cp5Kxaey9CU1esWCUwVzurcFFEu6zi/orbgTMW3c+FH472rGWYbmMoCMuyYbU2i7PVMmfSXlmRZ+1KSV6yem/5fdhuJp/0D/Zra0rJzRdy3gFiKOhzmCtG/52gbiq4oiviHD0VV9RFHgQyrNpNUTM4nSpCvMT1/Bv2yK7wdxGthWeVkhx7fq3b0iUGLMOlJhhLIcbiyxRru1SzDO4SKPGtCw2rOZvxPNi6+f7iu6Cr28NqJxB/Ys6a1VmJa4/o4H3OEdzP3I/UilJIdfqpf7/3weXuhyVC1/l5Dg3/BQ== \ No newline at end of file diff --git a/docs/java/jvm/pictures/java内存区域/method-area-1.6.png b/docs/java/jvm/pictures/java内存区域/method-area-1.6.png deleted file mode 100644 index d65edc37..00000000 Binary files a/docs/java/jvm/pictures/java内存区域/method-area-1.6.png and /dev/null differ diff --git a/docs/java/jvm/pictures/java内存区域/method-area-implementation.png b/docs/java/jvm/pictures/java内存区域/method-area-implementation.png index 363908e9..a42a9576 100644 Binary files a/docs/java/jvm/pictures/java内存区域/method-area-implementation.png and b/docs/java/jvm/pictures/java内存区域/method-area-implementation.png differ diff --git a/docs/java/jvm/pictures/java内存区域/method-area-jdk1.6.drawio b/docs/java/jvm/pictures/java内存区域/method-area-jdk1.6.drawio index 6c5d585e..85fcc85d 100644 --- a/docs/java/jvm/pictures/java内存区域/method-area-jdk1.6.drawio +++ b/docs/java/jvm/pictures/java内存区域/method-area-jdk1.6.drawio @@ -1 +1 @@ -7ZnRbpswFIafxperAGNjXwIhaztNmtZp7S0FJ6ASnFGypH362WCSEDttp5E0bUcj1RzbYM7n3+cYAAxnq89VPM++8pQVwLHSFYAj4Di2bWHxT1oeWgulXmuYVnmqGm0MV/kjU0ZLWRd5yu57DWvOizqf940JL0uW1D1bXFV82W824UX/rvN4yjTDVRIXuvU6T+ustRLH29jPWT7NujvbmLY1s7hrrJ7kPotTvtwywQjAsOK8bkuzVcgK6bzOL22/8Z7a9cAqVtYv6XBzEy3O5/FF/JNdj7j/K//2HX1y26v8jouFemA12Pqh80DFF2XK5EVsAINlltfsah4nsnYpmAtbVs8KVT3JiyLkBa+avnCC5J+w39cVv2NbNbg5ZM0dq5Os687LWs0B8TTt+Van9hB2NWpW1Wy11x322slidjI+Y3X1IJqoibieYcsNVoSVLdtCujbGaipN19faeFsUlMP/wvlYd36EAcUgoLIQQEARiBAgIQh8EI1BEAJCLkdf7DPcnVKNl3BJ3YfSd37JS7ZDSpniIp+W4jQRLmTCHkgH50ILvqqY5Wkqb2OcBZt5Yu2QRP9IrOvgKhAdQagTdIiBoHMogOSw6kljRiaJUT0JYbeT59QzgM+dboJ1PqcGnyOTzw+mmk63PdkQEIyBGJso+LYUjBSSBwIs9RMQ+YsoIB4g40ZaNvAtjdXpKccZiKLn9ihCw9p3XOXYtgEiBXQEaLP2icEQu1n7BNYtdoMGJ5KwxCivW4JcZL2CvBBBL5MXORgYqIG5vPgBIhcEAfAhiDypHMnGk/GHQgnJH0lIg7KZTBwzmxTfYvRs4jBEuLFODQ06bLhhdoqYZ/I5xR6Mj+FzZyfCn0C0MSVpngwgQg9yfRI/2MhjLCOPXLpEbNEXqncbW9CpRRbvaWA0AiR4AbD3tu1RHXBfYRDpvGyTwtyD8TIk0SqkeJKOH4EA/eeleLkGfR2ZFzXwWu9a24TNVnm4P3BS8HYwUT1ZOC4mR98lnTXHG4lMGa/yR2GLC9VgiIxuJ6VzsS4m95ixyjHtgrT96geREISnFpq6/NocmsRGKAQ+bkKTAPb+X5zu4fT6IcnR96xNpjduXpuK2BRKVLIgtGU1KcRI5hV6WvhREb5+uNI/RHz4cAXJqYUr016YyDd2tNGZEBAdK8FJ5YlkEMsN8t43RKfJcgB0uy+PPNMaCfEg7MTp5iNiU7f1KRZGfwA= \ No newline at end of file +7Vltk5s2EP41mmk/OAMIYfgItu8lbWcyvUyTbx0ZZJs5DA7mzvb9+molAcIo8V3vcJymPo8PdiWQ9tlnV9IiPFnvr0u6Wf1RJCxDjpXsEZ4ix7GxZfN/IDkoiT3GUrIs00TJWsFd+sSU0FLShzRh207DqiiyKt10hXGR5yyuOjJalsWu22xRZN23buiS9QR3Mc360k9pUq3qaXhBq7hh6XJVv9ojrtSsad1aTWW7okmx00R4hvCkLIpKXq33E5aB+WrDyH5XX9E2IytZXj2nw+fPs4ebDb2lf7FP0yL8kn74k4zUYB9p9qBmrAZbHWoTlMVDnjB4iI1wtFulFbvb0Bi0O446l62qdabUizTLJkVWlKIvXhD44/JtVRb3TNN44gOae1bFq7p7kVfKCfhs5L3WSX64fJnR7Vb1aewKHfpGUXZ6ZGXF9ppIGemaFWtWlQfeRPlo43u7FnDiKdlKw5pYSkiVky2bZ7Uw8AuFxAtQ8QyoeFkFk93QvAOP9+UBHCiKpZVCriyXc/oLHxr/8tdbxqtfkSPNZYGJRwu6TrOD7L4u8mIrAO402QpYoIG12bfv5VdL+Z8cxwHCZwxS4eLNXW0BImzAJVO4hoERmCbhhjvV1m7a1kj/q8c47WOkpRsN/5lxDEgAP1FQ30YYZARu4cefgCyEW3hZBLe+/4GV62uW141CGEIAP7Mx6OEqsrp9gnYgEthmINxlxeQkxUBsi1udTiDNi1z00vjXEdMsXeZCFHNzMaGNgBIpD3Vho1ynSSJfr/McNILpIK+jQTuWhrMgcogcnyR120gSVpuAJC0ILCHQsJBMfQ7ajaoBuqUzb64/xG09wzpoPkA0uSR8o8OWplPEbztqOrpt5UttAMd+KG4bZ9SFXYqodj0uyRDAI4qMAjXxjuK18JlOUO4GX+EU3UitRNJLGh859pDGP8xZoJsn9EhOjsP8IOG71roqKtfh3O2Hc8c3hHNnqGjuD5tjE8r8RWzMsbHP5otTOXZIMBw/6IIRGMAgBjD8ocCok7uOxsxH0RXiQ+MXoY14XOfhPhijyEM8hkc+fGcB8sfIvwJVZKPQ6mF4ebxzzsk7Z+x2oMbO9+adbRugDlAwRUEAMPLB+DYgzFENNITfdAHsxyw2knPuE5dYl0RO4pPvTU7cQ+z97Uc0c1EUoRAjvoQKJWicnBMUYEAvnAJ6bwraYuGYQUu8uUdO7loGBc26NMzIsOmN2QlhYxMYgTfG9JLAeHZ2c7zB0DBsHYEsNjAIQh3/YkGoK0h1EAV5MuvHvJ88mZFuKjOcCJw5lY2/DSvfYPrRM2D9ac5ylNbrEhSTPpC2iaDuYEAaNgMqh40BtnCGIvI/kKeAdA2MPDOQgQFIvmvguwOxuIwwCojaUIRvvDz5D+AX9Jct58XP6e8D34nPD5IKV0WZPnEZzRRI5ztgsY+w9PpcdAdKjvvr3zfYetzcPHl/lzQ93CaT+ci0zWtCKt8xTFDoiZDKN/LOS3b0rzqVIcxPXBNJfWeOT5P0BII9uAygPnvj55qOyIbaRJghNKxvfoSQ+QZgeEeh0VR+csZDlZ/MaJhyGxFbb+8Cw6OF+sfNQwBjWDwOtgsw4uL0j0dMaw4CJ5hRiGZXcEjSVqQAwhlsFXhQ9Pk606pbBBcI6mtrCK+C3sanawjYOiv0pkL9i0rC5orwN+rA/EF0vRFKjCGTrVj2yADLngZ9pVLsECgVd3RylKDMi3JNs656p2wJeleOUygzVnFvGkFZOs2Xxv7gsiPlfaCuC526OuXOlVdaFVtXViXNtwv+0PrxeVsB3xVl0n273n1O4/ulcN3Rkc0d129szRe97TXRLJ+k201GldXTPEu1Fy+yglb6gI7r7u+nv9nvvBfWBk8kzzdgkHu0SLQN1YBmIakzCL+cQUjVT1udVjnFs38A \ No newline at end of file diff --git a/docs/java/jvm/pictures/java内存区域/method-area-jdk1.6.png b/docs/java/jvm/pictures/java内存区域/method-area-jdk1.6.png new file mode 100644 index 00000000..61a0694d Binary files /dev/null and b/docs/java/jvm/pictures/java内存区域/method-area-jdk1.6.png differ diff --git a/docs/java/jvm/pictures/java内存区域/method-area-jdk1.7.drawio b/docs/java/jvm/pictures/java内存区域/method-area-jdk1.7.drawio index f5688a5e..eef651b0 100644 --- a/docs/java/jvm/pictures/java内存区域/method-area-jdk1.7.drawio +++ b/docs/java/jvm/pictures/java内存区域/method-area-jdk1.7.drawio @@ -1 +1 @@ -7Vptb6M4EP41lm4/ZAUYA/4ICeltTyutrrc63aeTA06CSiBHaNPurz+PMe/eS6tLULrbtFKdGb8xzzzj8VCE57unm4Ltt5/zmKfIMuInhBfIskyKsfgDkudKQqlbCTZFEqtOreAu+caV0FDShyTmh17HMs/TMtn3hVGeZTwqezJWFPmx322dp/1V92zDR4K7iKVj6Z9JXG4rqWe5rfxXnmy29cqmQyvNjtWd1ZMctizOjx0RDhGeF3leVq3d05ynYLzaLtW45Xe0zcYKnpUvGfBXsDO+8psvv//tf/q8IeFiHdGZ5VTTPLL0QT2x2m35XJugyB+ymMMsJsLBcZuU/G7PItAeBehCti13qVKvkzSd52leyLF4TeBHyA9lkd/zjsaRH9Dc8zLa1sPzrFROIB6n+t4ZVH2EfPzwyh6PvCj5U0ekjHHD8x0vi2fRRXli42LHFlfiKNm2g2kjZMqXNs1crblFQ1n8NdZ3x9YPHUQdFFBoBBhRgkKCvDkKfBQuUTBHnidVBgpEw4aeHpGNAPn4Cy92NzyDMX6IaIhCF3kh9FaD6QheYa6yj2EfqyzP+ABYJWJpssnE10iAwIU8AOMngju+UuySOIZltE7TupUxAJ78T4CVdmaKmeSYGnF7jLhnahC3Lga4NwL89tMfDXqAlm8gz4SGQItiCeQCUe+8rFyvrSjSsTJ2Vg45ycozgFObXUFDPDKCxiIaaLyLQUMvGwm5GRPu6mxOHRezKWxu9W1u0TEdtDa3LhYAsaEJgML1TeADxD3xiyU9lsg3Ie4JbvjLNxDDrPNA1g9gWHNkNYyYJIBh878AO4nTj5ZKKK3TJxYmY5hMHbHsi8FkaWCqThIX0BG5QUDe8VJ42RpaTYwXflEi+I5XBQMdJwsT42WP8PooP2/kZNrmRfJNyFiqOpwjoxukdLYzZpU96VlFNKTyEKWI+pJCAaJLSbPqdiVyDUfepb6Xcl8nludIDAfQubqAiJ0psfsJ6xJ1sBtEu8bI3aTPnbROgXV1CkGjBZAJmFTdWQWBlsAbofJcaJ8VMS/i+jvryiM2MSa4P7nG6TzPMjTIuBcDZlxPkOHLgFB2/eHrTIWeEWN0uEx7TdIVE5wUzH/Ys6yHi/PPA5SAg6iyuS+UxWb1CxHPLLYn1jd6zQ/tCNHayL9tau8if458R6aKHgqkN0CjQ0pIJ01wEbUh8YDVntRk5yRtzLi31pLWiTy+Wk9AWof279AEaypNk5K2ToIGpBWZh8AOgJtLKGU0DVxVuKX+LXtkN/A2pAZuVWj9CGw4O0gjgi+Zzv6p8pWR14ilFpD8iKQIIjhplqqWETugGPnkSgNJylY8DVh0v5Hy4eKtJ5nO+MAO5I+cs2RlksPaUI0a+OMZ/A8PcitHU4Q2dcHJvJj/6Wo473mx7sCvX9BcTV5sawo7P1jAtup3VNdTprY15Znecd6ew4I5ga/IA+HcgcINvH4TFFpA3a1b3qYhkG2Cc/iKrzsYn06qpy3u2OPiTiexao5lIs9KAipqI//Mb+jeDmC6Os/EgI0LPT99NQ57A5Q0VYRJq3G2pobwyiuR0VyDOq0PSB08hkx812yXpM/VGDER2+2lEmMbDM3TRw6ojTT9Sdrs2SIie+7rql2CMsuLHUv76qOyJejtap9SmfJS+M1MPGqUZBvteHDOmfIzUCtX66kT4UaZmt7obE0qy4Jlh7WYtJ5eeG7d4ZgXcX/17vBVk0bPBja3bK+xtWXTtk06lo+Twz5lyupJliadhddpzsruhob3kNvFb+ZH96WnoGLwiWh6BgLZAwKZWJf7aRiEX88g8bX9PzCp6/w3HQ7/BQ== \ No newline at end of file +7Zlbb6M4FIB/jaWdh4wAYzCPkNLMzGqkarur3e5L5YC5qARngTTp/Po9BpOE4Nm0Uoimms2MFOccfOF852K7CM9Xu0XF1tlXEfMCWUa8Q/gGWZaJDRO+pORFSUwXd5K0ymMlOwju829cCQ0l3eQxrwcPNkIUTb4eCiNRljxqBjJWVWI7fCwRxXDWNUv5SHAfsWIs/TOPm6yTUss9yD/xPM36mU3H6zQr1j+s3qTOWCy2RyIcIjyvhGi61mo354W0Xm+Xrt/td7T7hVW8bF7T4SFYGX/wxd1vj/7nrykJb5LIm2GnG+aZFRv1xmq1zUtvgkpsypjLUUyEg22WN/x+zSKp3QJ1kGXNqlDqJC+KuShE1fbFCZH/QF43lXjiRxqn/UjNE2+irO8uykY5AbxO9/uoU/cB+fjllT2eedXw3ZFIGWPBxYo31Qs8orSOo8Ao19yD2h44W66SZUeMbU8JmfKtdD/2wfzQUATeQsMd0wg95N0gz0Ohg6iBqIlCgugt8qhUUVe2L0qMRjyKdMSWlNjEOEfsAmRcY0gGEw0ZQ0PGnQwM1YAhyAcezsj68JbN0MRDU5ai5Cd2VyJW5GkJPyOwHQd5IG2WQzLylWKVx7GcRsv0QN044UImihgdF6rhYk3GxdOkL6eQ5q/XrBxwcf7ZyFQbRJ3NfVBW6fIXAu8My4P5jUHzw6EHtNL2WyKHWHRR6CJ/jnwHhTYKKApab5CNo6CEeA1M6SJqQfCC3ZrUYJcM2phwGtu6oKXWEp9Ps5dwDo8MnINgcr2g/bt+fIwfPrl/Pd1tHiL/ecEbMTM1vvEOSltasLruE0e/ZzhAGhHRcPsuJPN8ySOOhhExpoJkTQspZpwm2mrmRJQvk3OQpoRhed6wzBmadEo0NOhUMLCmykFSg82GIRu+iehc5jXIgIHznynvhyuJp3CtU/KTkqb2kDS+YuHUkiYj0l8+/95WswD5uK1v3V4TSM+Rh/vSRy+bQpPE0u81Y2fpkLMpdEpmeJgqiacpZ1cNzolPatyETYSrY+E5LmY/EotXJ0rLmQqG7qDmyuQXtLtECv9xG063MmvKoxvkxfFB7SfPi+Zwy4h1J/CrpkXdMe8IqxciGrwC68+2rXRP4tMZczR18WlPxVFzLDyc3Rzkhygg/3M8x9HWxON1OfbnlQFI2H/CPrO9EAswgrrcbU39C+9N3j8/Yoz3LFfmNz6Df2w/76QSZqLKv4GMFQrS9UqjdRKL7jgW7WuWRnN8ZNCFIpFHxMBH4a08OFB6x6vVgpdt+g1lAYV6SiH9Gv0T3jtwBXJV8vaQvO6WFesu0qZDrzt6dJeaMAEDTZSxqubdOvpb002TyP3U6BL1jfez6kK2//rQDmFIOrOErfLipXs048Uzl6yP9HWLT2otst4dK7pJpaYU1UpG9163VRaVStvomBoFb8ChZrDmKC/TcU/psjPlfVK3d8Bel4NnlWpUo19Lq2kqVtYJjNWP2nqyxC2qeDjjvuOSRU9p666zE2tZNu0MZdmeapDeZnFerwum7JWXRd7PlBSCNSfTn2L7cvOr+dF97V22CuEzFfcCwWKfpElTt2UxNcGC3x4s8PPw19pWd/RHbxz+Cw== \ No newline at end of file diff --git a/docs/java/jvm/pictures/java内存区域/method-area-jdk1.7.png b/docs/java/jvm/pictures/java内存区域/method-area-jdk1.7.png index 1dfbcf26..b81b8117 100644 Binary files a/docs/java/jvm/pictures/java内存区域/method-area-jdk1.7.png and b/docs/java/jvm/pictures/java内存区域/method-area-jdk1.7.png differ diff --git a/docs/java/jvm/pictures/java内存区域/method-area-jdk1.8.drawio b/docs/java/jvm/pictures/java内存区域/method-area-jdk1.8.drawio index f641d6c3..9d2ac793 100644 --- a/docs/java/jvm/pictures/java内存区域/method-area-jdk1.8.drawio +++ b/docs/java/jvm/pictures/java内存区域/method-area-jdk1.8.drawio @@ -1 +1 @@ -7Vptc5s4EP41mrl+cAcQEugjODjX3PRTbuZu7psMsk2DwcUkTvrrbyXEu3pppzbjXOtkJvKu3thnd/VoCcLL/fNtyQ+7j0UiMuRYyTPCN8hxbIYx/JGSl1rCmFcLtmWa6E6d4D79IrTQ0tLHNBHHQceqKLIqPQyFcZHnIq4GMl6WxWnYbVNkw1UPfCsmgvuYZ1PpX2lS7Wqp73id/HeRbnfNyjZltWbPm876SY47nhSnnghHCC/Loqjq1v55KTJpvMYu9bjVV7TtxkqRV98yoPqc/v3PMd++ZB8se7N+uv/0abXQszzx7FE/sN5s9dJYoCwe80TISWyEw9MurcT9gcdSewLMQbar9plWb9IsWxZZUaqxeEPkD8iPVVk8iJ6Gqo/UPIgq3jXDi7zSPgBPU3/vDao/IJ8+e/MgoqzEc0+kbXErir2oyhfooh2x9bBTByuhWrbrQdoKuXalbTtXZ21oaIN/h/GdqfEjihhFIZONECNGUESQv0RhgKIVCpfI91HkoYApCUMQTaH7UVS8hgQ6BxFikezjRyi0mlFsAiuYqRpiN8QoL3IxAlSLeJZuc/gag/EFyENp9BRCJtCKfZokchmjs3TuZI0AJz8IrNYubJhJjWmQdqdI+7YBaedSQJMJ0Hcf/kSRi8IQBVgBaiHflg0Ai2GF4w1i/nmDcbNx4tgUjAldU/JqMJ4Bm8bqGhnikwkyDjEg418KGXrZ/CfshAjPZHJGPcznMLkzNLnDpsFgNLlzsbTnGdIeOL4to0FmO/jFKjhWKLBlIoTICFZvIIE550FsmL2w4Zxq42GW7OX/F16vwvR/ow9aS4dhhckUJdsUVu6lUGIGlOpTxJPgAC0IyS+4NFyuIajmhavZwCvk7xdeNQxsShRmxmt6U3qvPm/kXNoVZfoFZDzTHc7B5kZ0zqXTqHLnPKnsKdFWQbVEwVJmQ2jIKxEQDCppxldZ9nVCeA4yOELMM+VBTOeE7MIM/Jpz3CjJtUbuMz1v1oqEbeLmDDGIEnUq+fU1FQJoJeMGVL4n22dFzI+F+Zq69olLrBnuTJ71OrtzLAMy3sWAMZFwosoG9A2krzOVdiYRY8Jl1ruRbaDdDs2k+Y8Hng9woZ8fZa03jGubB6Ast+vfCDwzbA/WtwbNd90IaG3V347Re/JIC6hiiD4KlTfIRi8oJYu0pYvoDcED1nvSk50zaBMu/I0xaGnsi/VmhqClbHhxJthQXJo1aB0Tx1cFDklHXFXr83Q2DT1dqmXBHX/it/K1RwPcujT6kbTh4qiMKH3Jpofn2lcmXgNL3UjyE/kqg5N2qXoZyYwwCsiVJpKMr0UW8vhhq+TjxTtPsun0wA7Vj5qz4lVayLUXeHKInMH/8IhbUUPZ2TYlJ/ti/md4uwMuAEc5C9RpHiK20gRZvk74eXmx17zPuxpeTJ3L8uIrSNhO81bqikrTJqv3j/PuHIbICYPe7ZLKeo28XUII3chyW7+mzSIZbDOcw1d83cH42kqmnmvIjy2xao9los5KIlXMRcGZX8q9HcBM5Z2ZAZvWd376Ihz2RygZqgizFuG8H78SWe01qNd6h/TBYyniu+H7NHupx8BEfH9QSoxdaWiRPQmJ2kQznKRjzw4B9jzU1buUyrwo9zwbqk/allLv1vtUykxU4DcLeNQ4zbfG8dI5F9rPpFq72kCdghvlenqrtzWlrEqeHzcwaTM9eG7T4VSUyXD1/vB1S6MXI5s7rt/a2nFZ1yY9yyfp8ZBxbfU0z9Lewpus4FV/Q+N7yN3NH/Z7/1tPQR3Br2TTMwSQOwogG5u4nyGC8PdHEHzt/uFL6Xr/NoejfwE= \ No newline at end of file +7Zlbc6M2FIB/jWa6D94BhEA8gkO2TZu+pDud6UtHBnFpZKCYxM7++h6BsLmodTJjvJvZOpmxOAcJ6XznImSE19vDp5pV2X0Zc4EsIz4gfIMsyzQNB76k5KWTeJ7bCdI6j9VNJ8FD/oUroaGkT3nMd6Mbm7IUTV6NhVFZFDxqRjJW1+V+fFtSivFTK5bymeAhYmIu/T2Pm6yTUss9yX/keZr1TzYdr9NsWX+zWskuY3G5H4hwiPC6Lsuma20Pay6k8Xq7dP1u/0V7nFjNi+Y1HaLMu/ul+ny4qf58uad/ZH/9WpkrU832mYkntWI12+alN0FdPhUxl6OYCAf7LG/4Q8Uiqd0DdJBlzVYodZILsS5FWbd9cULkH8h3TV0+8oHGaT9S88ibKOu7l0WjnACW010POnUfkM8Xr+zxzOuGHwYiZYxPvNzypn6BW5TWcRQY5ZlHUPsTZ8tVsmzA2PaUkCnfSo9jn8wPDUXgDTT6GQxphB7ybpDnodBB1EDURCFB9BZ5VKqoK9sXJUYjHkU6YhtKbGKcI3YBMq4xJoOJhoyhIeMuBsbUgCHIBx7OzPqwymZs4rEpi7LgE7srERN5WsBlBLbjIA+kzXJIRr5SbPM4lo/RMj1RNyZcyEIRo+NCNVysxbhYmvTlCGn+XcWKERfn7yeZaoOos7kPyjrd/EBgzTA9eL4xan449YBW2n5L5BCLLgpd5K+R76DQRgFFQesNsjEISojXwJQuoiYEC+zmpAa7ZNDGhNPY1gUttTb4fJq9hHN4ZOQcBJOvHbT4fda2VLDdrs8c/abhQpTM8zWPOBpIxFiMkr0spZhxmmjrmRNRvknOUVqSBuyGx4XO0CRUosFBF6NBNIUO8hrsNwzZ8E1E1zK1QRIMnP/Met9cVZzStaboF0VN7TFq/NVrpzNDfffTb21FC5CP2xrX7TcB9Rp5uC9/9LJZNEks/X4zdjYOOZtFl4SGx9mSeJqSdt3wdJdNltyEnYSrg+E5LmbfEoxX50rLWYwG1SRLV+a/oN0rUvjHbUDdysQpX+AgNc5f177z1GiON45Y9x5+3cyoORQZcvVCRINXcP3eNpfuJEKdOUhTF6H2UiD7lDF9be/e4Rzkhygg/4M8B9LWROSVQerOX2ATCpvN9mAswAhqc7c/9S+8P3n//Igx37dcmd/8nOZj+3kntTAr6/wLyJhQkK5XHK1JLLrzWLSvWRyx5lRFE4pEvicGPgpv5csDpfe8YZ3JZQIOZQ2FkkohARv9Pd47cAZyVfb2mL3uvBVfF77usOZt563G8Yx10PqA1DGkIY29Stg2Fy9dHxiIbatWibE84sy4eOaS5UwzHmTXIpNDWKQ6THTdLKWyKOstE2P1XtlS6u1unq1S8Aa8aQVLjfIi1faXLrtS3ifVygFH6hycq1DDG4OptcqmZsUugUH74cGf+xv2ZR2Pnz7svmHRY9q67mpic8umR1tbtndqk4Hl43xXCaasnhciHzw4ESVrhhOaHo3f3fxsfqSvPepWcX2mEF8gguxJ9jR1OxlTE0H47REEl6cfc1vd4CdxHP4D \ No newline at end of file diff --git a/docs/java/jvm/pictures/java内存区域/method-area-jdk1.8.png b/docs/java/jvm/pictures/java内存区域/method-area-jdk1.8.png index eb87031e..abd7bc80 100644 Binary files a/docs/java/jvm/pictures/java内存区域/method-area-jdk1.8.png and b/docs/java/jvm/pictures/java内存区域/method-area-jdk1.8.png differ diff --git a/docs/java/jvm/pictures/java内存区域/stack.png b/docs/java/jvm/pictures/java内存区域/stack.png index c62b5a07..0a462178 100644 Binary files a/docs/java/jvm/pictures/java内存区域/stack.png and b/docs/java/jvm/pictures/java内存区域/stack.png differ diff --git a/docs/java/jvm/pictures/java内存区域/字符串拼接-常量池.png b/docs/java/jvm/pictures/java内存区域/字符串拼接-常量池.png index 47a10211..861dfd8b 100644 Binary files a/docs/java/jvm/pictures/java内存区域/字符串拼接-常量池.png and b/docs/java/jvm/pictures/java内存区域/字符串拼接-常量池.png differ diff --git a/docs/java/jvm/pictures/java内存区域/对象的访问定位-使用句柄.png b/docs/java/jvm/pictures/java内存区域/对象的访问定位-使用句柄.png index 1f4610c8..76627ba9 100644 Binary files a/docs/java/jvm/pictures/java内存区域/对象的访问定位-使用句柄.png and b/docs/java/jvm/pictures/java内存区域/对象的访问定位-使用句柄.png differ