OutOfMemroyError异常
2021-03-27
2 min read
public class RuntimeConstantPoolOOM {
public static void main(String[] args) {
String str1 = new StringBuilder("计算机").append("软件").toString();
System.out.println(str1.intern() == str1);
String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2.intern() == str2);
}
}
在 JDK 8 中上述代码分别输出 、。原因是方法在JDK 8中返回的是常量池中对于首次出现该实例在堆中实例的引用。对于 所引用的堆中的 字符串,并非首次出现在堆中,所以二者并不相等。
再来回顾一下方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。在JDK 8中,完全废弃永久代的概念,改用JRockit、J9一样在本地内存中实现的元空间(Metaspace)来代替。在 JDK 7 之前由永久代来实现方法区,方法区的所有信息都在永久代中。在JDK 8中 类型信息被转移到 Metaspace,运行时常量池与静态变量被转移到Java Heap