静态常量池指的是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
}
}