运行时常量池、字符串常量池、静态常量池、静态变量

4 篇文章 0 订阅

        静态常量池指的是java代码中定义的常量,经过jvm编译后形成在class文件中的常量区域。所以静态常量池指的是class文件内部。在堆中

        运行常量池指的是jvm运行中,将编译后的类放在metaspace区,具体包括class文件辕信息描述、编译后的代码数据、引用类型数据、类文件常量池等。在metaspace区

        字符串常量池指的是类加载完成后,经过验证、准备阶段之后放在字符串常量池中。字符串常量池的数据只会存储一份,被所有的类共享。基本流程是:创建字符串之前检查常量池中是否存在,如果有存在则获取其应用,如果不存在则创建并存入,并返回新对象的应用(如string.toIntern()方法)。在堆中

        静态变量是指由static修饰的变量,也是在堆中。

package jvm;

public class RuntimeConstantPoolOOM {
    public static void main(String args[]) {
        /*Set<String> set = new HashSet<String>();
    	short i = 0;
    	while(true) {
    		set.add(String.valueOf(i).intern());
    	}*/
    	String str1 = new StringBuffer("test").append("hello").toString();
    	System.out.println(str1.intern() == str1); //输出true
    	String str2 = "testdemo";
    	str2.intern();
    	String str3 = new StringBuffer("test").append("demo").toString();
    	System.out.print(str3.intern() == str3);//输出false
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答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空间溢出的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunny_daily

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值