图解Java内存区域( 二 )

  • 元空间对于Java8,HotSpots取消了永久代,取代永久代的就是元空间 。永久代存在内存上限( -XX:MaxPermSize,即使不设置也有默认大小),当进程申请不到足够的内存,会造成内存溢出 。改成元空间后,改用本地内存,只要本地空间足够,就不会有内存溢出的问题 。元空间和永久代有什么不同的?存储位置不同,永久代物理是是堆的一部分,和新生代,老年代地址是连续的,而元空间属于本地内存;存储内容不同,元空间存储类的元信息,静态变量和常量池等并入堆中 。相当于永久代的数据被分到了堆和元空间中 。
  • 运行时常量池运行时常量池是方法区的一部分,是一块内存区域 。Class 文件常量池将在类加载后进入方法区的运行时常量池中存放 。 一个类加载到 JVM 中后对应一个运行时常量池 。
    图解Java内存区域

    文章插图
     
    易混淆的概念屏幕面前的你,会不会遇到这样的困惑 。运行时常量池和Class文件常量池有什么关系?和字符串常量池呢?和缓冲池呢?
    Class文件常量池Class 文件常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放 。常量池中主要存放两大类常量:字面量和符号引用 。当Class文件常量池加载到方法区时,会把符号引用转换为直接引用,存放到运行时常量池 。
    图解Java内存区域

    文章插图
     

    图解Java内存区域

    文章插图
     
    字符串常量池字符串常量池是 全局的,JVM 中独此一份 ,因此也称为全局字符串常量池 。
    其中:
    【图解Java内存区域】在 jdk1.6(含) 之前也是方法区的一部分,并且其中存放的是字符串的实例; 在 jdk1.7(含) 之后是在堆内存之中, 存储的是字符串对象的引用,字符串实例是在堆中;
    底层原理在 HotSpot VM 里实现线程池功能的是一个 StringTable 类,它是一个Hash表,默认值大小长度是1009;这个 StringTable 在每个 HotSpot VM 的实例只有一份,被所有的类共享 。字符串常量由一个一个字符组成,放在了 StringTable 上 。
    String str1 = "图解Java";String str2 = new String("图解Java");System.out.println(str1 == str2);在这段代码中,当执行 String str1 = "图解Java" 时,先到常量池中查询有没有 "图解Java" 字符串的引用,如果没有,则会在 Java堆 上创建 "图解Java" 字符串,在常量池中存储字符串的地址,str1 则指向字符串常量池的地址 。
    String str2 = new String("图解Java"),则会直接在Java堆中创建对象 。str2 指向堆中的地址 。
    看到这里,屏幕面前的你有没有想到最后的结果是 false 呢 。
    如果此时还有 String str3 = "图解Java" 那么 str1==str3 的结果是什么?
    此时 str3 发现字符串常量池中已经有了 "图解Java" 字符串的引用,则直接返回,不会创建新的对象 。
    看到这里,屏幕面前的你有没有想到最后的结果是 true 呢 。
    图解Java内存区域

    文章插图
     
    JVM 中除了字符串常量池,8种基本数据类型中除了两种浮点类型剩余的6种基本数据类型的包装类,都使用了缓冲池技术,但是 Byte 、 Short 、 Integer 、 Long 、 Character 这5种整型的包装类也只是在对应值在 [-128,127] 时才会使用缓冲池,超出此范围仍然会去创建新的对象 。
    Class文件常量池、运行时常量池、字符串常量池的联系我们平时写好的Java代码即Java格式的文件,经过编译,会变成Class类型的文件 。而Class文件有一部分是Class文件常量池,用于存储字面量和符号引用 。
    Class文件经过类加载器加载后,之前Class文件常量池的内容会存放到方法区的运行时常量池,需要注意的是Class文件常量池的符号引用会转变直接引用存入运行时常量池 。
    字符串常量池是 JVM 的一部分,整个 JVM 只有一份,在将Class文件常量池的字面量也会在类加载的时候进入到字符串常量池中 。
    份数内容Class文件常量池每个类对应一份字面量、符号引用运行时常量池每个类对应一份字面量、直接引用字符串常量池整个 JVM 仅有一份字符串
    图解Java内存区域

    文章插图
     




    推荐阅读