jdk8 运行时常量池在jvm的区域

本文通过实例代码分析了Java 8中运行时常量池的位置,指出在JDK8中,由于永久代被元空间取代,但运行时常量池仍然位于堆内存中。通过调整JVM参数,分别测试了堆和元空间的限制,结果表明当堆空间耗尽时会出现`OutOfMemoryError: Java heap space`,证实了运行时常量池存在于堆中。
摘要由CSDN通过智能技术生成

都知道jdk8去除了永久代,用元空间去实现方法区,以前认为方法区是包含运行时常量池和class类型数据,后来看文章说是jdk7把运行时常量池从永久代移到堆中,那么jdk8里运行时常量池是在堆中还是元空间里呢?

先说结论:在堆中。

写个例子:

    /**
     * -Xms2m
     * -Xmx2m
     * 验证运行时常量池在堆还是直接内存
     */
    private static void functionOut() {

        int i = 0;
        while (true) {
            ("hello" + i++).intern();  //intern方法会把第一次遇见的字符串存到运行时常量区里
        }
    }

直接在main方法执行后:

java.lang.OutOfMemoryError: Java heap space

内存溢出了,看来常量池是在堆中了。

在写个对照的例子,只是修改了jvm参数,限制元空间大小为10m:

    /**
     * -XX:MaxMetaspaceSize=10m
     * 验证运行时常量池在堆还是直接内存
     */
    private static void functionOut2() {

        int i = 0;
        while (true) {
            ("hello" + i++).intern();
        }
    }

运行了几分钟没报错。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 字符串常量池JVM属于方法区(也称为永久代)内存分区。方法区是各个线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。字符串常量池是方法区的一部分,用于存储字符串常量。在JDK 8之后,方法区被取消了,取而代之的是空间(MetaSpace),但字符串常量池仍然存放在空间。 ### 回答2: 字符串常量池JVM的方法区(也称为非区)JVM将内存分为几个不同的区域,包括区、方法区、虚拟机栈等。而字符串常量池是方法区的一部分,用于存储在程序直接使用的字符串常量。 在Java,字符串常量池是一种特殊的内存存储区域,用于存储字符串常量,它的作用是提高字符串的重用性和效率。当我们使用双引号声明一个字符串时,JVM会首先在字符串常量池查找是否存在相同内容的字符串,如果存在则直接返回引用,如果不存在则创建一个新的字符串并放入字符串常量池。这种机制可以减少内存占用,提高程序的执行效率。 由于字符串常量池位于方法区,它是与其他线程共享的,在程序运行过程,多个线程可以同时访问字符串常量池。而且,字符串常量池的位置是在程序的执行过程被动态调整的,当字符串没有被引用时,JVM会自动回收字符串常量池空间。 总结来说,字符串常量池JVM的方法区的一部分,用于存储程序直接使用的字符串常量,并提高字符串的重用性和效率。 ### 回答3: 字符串常量池JVM的方法区里。方法区是JVM的一个内存分区,用于存储类信息、常量、静态变量、即时编译器编译后的代码等。而字符串常量池就是方法区的一部分,用于存储字符串常量。 在Java,当我们使用字符串字面量(如"hello")时,编译器会将其放入字符串常量池。当程序执行时,如果再次使用相同的字符串字面量,JVM会直接从字符串常量池取出已存在的字符串对象,而不会创建新的对象,这样可以节省内存空间。 由于字符串在Java使用非常频繁,所以将字符串常量池放在方法区,可以提高字符串的重用率。此外,字符串常量池的位置在方法区也有利于GC(垃圾回收),因为当某个字符串不再被引用时,GC可以更方便地回收该字符串常量。 需要注意的是,从Java 7开始,字符串常量池被移出了PermGen空间(方法区的前身),并放置在,这是因为字符串常量池的字符串对象是可以被垃圾回收的,而且过多的字符串常量可能导致PermGen空间溢出的问题。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值