jvm字符串常量池在什么内存区域问题解析
问题 字符串常量池分配在什么内存区域? 方法区?永久区? 堆内存?
首先明晰几个概念:
方法区-java虚拟机规范的运行时数据区
方法区 概念属于 java虚拟机规范的运行时数据区的一部分. 运行时数据区包括: 程序计数器、java虚拟机栈、本地方法栈、java堆、方法区. 其中, 方法区 跟 java堆 都是所有线程共享的数据区, 用于存放已被jvm加载的class信息、常量、static变量、JIT即时编译后的代码等这些数据.
永久区 - jvm实现
永久区又叫PermGen, 是jvm实现, 且只存在于jdk7和之前的版本;jdk8中已彻底移除PermGen,jdk8引入了一个新的内存区域:metaspace;
然后再看下面程序的输出, 可确定java的版本 jdk6/7/8中的字符串分配的内存区域.
运行时指定 VM Options参数 java -Xms20m -Xmx20m StringOOM 令程序内存过限:
import java.util.ArrayList;
import java.util.List;
public class StringOOM {
static String base = "somethings";
public static void main(String[] args) {
List<String> list = new ArrayList<>();
for (int i = 0; i < Integer.MAX_VALUE; i++) {
String str = base + base;
base = str; // 只是用来增长
/** intern 会把字符串发布到 字符串常量池中去 */
list.add(str.intern());
}
}
}JDK8-在堆内存: OutOfMemoryError: Java heap space
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3332) at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124) at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448) at java.lang.StringBuilder.append(StringBuilder.java:136) at com.niewj.demo.lang.StringOOM.main(StringOOM.java:12) Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=8m; support was removed in 8.0 Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=8m; support was removed in 8.0
JDK7-在堆内存: OutOfMemoryError: Java heap space
PS C:\devs\java\jdk7\bin> .\java.exe -Xms20m -Xmx20m -XX:PermSize=8m -XX:MaxPermSize=8 StringOOM Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOfRange(Arrays.java:2694) at java.lang.String.<init>(String.java:203) at java.lang.StringBuilder.toString(StringBuilder.java:405) at StringOOM.main(StringOOM.java:10)
JDK6-在永久区: OutOfMemoryError: PermGen space
List<String> list = new ArrayList<>(); 无法编译, 必须写完整:List<String> list = new ArrayList<String>(); PS C:\devs\java\jdk6> .\bin\java.exe StringOOM Exception in thread "main" java.lang.OutOfMemoryError: PermGen space at java.lang.String.intern(Native Method) at StringOOM.main(StringOOM.java:12)
结论
JDK6-在永久区: OutOfMemoryError: PermGen space
JDK7-在堆内存: OutOfMemoryError: Java heap space
JDK8-在堆内存: OutOfMemoryError: Java heap space
可见, JDK6的jvm 对字符串常量池的内存区域的实现, 还在永久区(PermGen); 而JDK7/JDK8就都是在堆内存中划分的内存了;
以上就是jvm字符串常量池在什么内存区域问题解析的详细内容,更多关于jvm字符串常量池内存区域的资料请关注脚本之家其它相关文章!
相关文章
Spring Boot从3.x到4.0的分步升级保姆级实战指南
Spring Boot 4.0的发布标志着Java生态向云原生与开发效能革命的全面迈进,下面这篇文章主要介绍了Spring Boot从3.x到4.0的分步升级保姆级实战指南,文中通过代码介绍的非常详细,需要的朋友可以参考下2026-05-05
SpringBoot2+Netty+WebSocket(netty实现websocket支持URL参数)问题记录
Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架,这篇文章主要介绍了SpringBoot2+Netty+WebSocket(netty实现websocket,支持URL参数),需要的朋友可以参考下2023-12-12
Java CompletableFuture之异步执行、链式调用、组合多个Future、异常处理和超时控制等详
这篇文章主要介绍了Java CompletableFuture之异步执行、链式调用、组合多个Future、异常处理和超时控制等用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2025-05-05
SpringBoot+Redis+Lua实现接口限流的示例代码
本文主要介绍了SpringBoot+Redis+Lua实现接口限流的示例代码,利用AOP拦截请求,通过Redis记录访问次数,达到限流效果,具有一定的参考价值,感兴趣的可以了解一下2025-09-09
Intellij IDEA 2019 最新乱码问题及解决必杀技(必看篇)
大家在使用Intellij IDEA 的时候会经常遇到各种乱码问题,今天小编给大家分享一些关于Intellij IDEA 2019 最新乱码问题及解决必杀技,感兴趣的朋友跟随小编一起看看吧2020-04-04


最新评论