jvm字符串常量池在什么內(nèi)存區(qū)域問題解析
問題 字符串常量池分配在什么內(nèi)存區(qū)域? 方法區(qū)?永久區(qū)? 堆內(nèi)存?
首先明晰幾個概念:
方法區(qū)
-java虛擬機規(guī)范
的運行時數(shù)據(jù)區(qū)
方法區(qū)
概念屬于 java虛擬機規(guī)范
的運行時數(shù)據(jù)區(qū)
的一部分. 運行時數(shù)據(jù)區(qū)包括: 程序計數(shù)器
、java虛擬機棧
、本地方法棧
、java堆
、方法區(qū)
. 其中, 方法區(qū)
跟 java堆
都是所有線程共享的數(shù)據(jù)區(qū), 用于存放已被jvm加載的class信息、常量、static變量、JIT即時編譯后的代碼等這些數(shù)據(jù).
永久區(qū) - jvm實現(xiàn)
永久區(qū)又叫PermGen
, 是jvm實現(xiàn), 且只存在于jdk7和之前的版本;jdk8中已徹底移除PermGen,jdk8引入了一個新的內(nèi)存區(qū)域:metaspace
;
然后再看下面程序的輸出, 可確定java的版本 jdk6/7/8中的字符串分配的內(nèi)存區(qū)域.
運行時指定 VM Options
參數(shù) java -Xms20m -Xmx20m StringOOM
令程序內(nèi)存過限:
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 會把字符串發(fā)布到 字符串常量池中去 */ list.add(str.intern()); } } }
JDK8-在堆內(nèi)存: 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-在堆內(nèi)存: 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-在永久區(qū): 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)
結(jié)論
JDK6-在永久區(qū): OutOfMemoryError: PermGen space
JDK7-在堆內(nèi)存: OutOfMemoryError: Java heap space
JDK8-在堆內(nèi)存: OutOfMemoryError: Java heap space
可見, JDK6
的jvm 對字符串常量池的內(nèi)存區(qū)域的實現(xiàn), 還在永久區(qū)(PermGen)
; 而JDK7/JDK8
就都是在堆內(nèi)存
中劃分的內(nèi)存了;
以上就是jvm字符串常量池在什么內(nèi)存區(qū)域問題解析的詳細內(nèi)容,更多關(guān)于jvm字符串常量池內(nèi)存區(qū)域的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JAVA中excel導(dǎo)出一對多合并具體實現(xiàn)
項目中經(jīng)常會使用到導(dǎo)出功能,有導(dǎo)出Word,有導(dǎo)出Excel的,下面這篇文章主要給大家介紹了關(guān)于JAVA中excel導(dǎo)出一對多合并具體實現(xiàn)的相關(guān)資料,需要的朋友可以參考下2023-09-09解決springboot自定義注解AOP在controller上導(dǎo)致controller注入失敗問題
這篇文章主要介紹了解決springboot自定義注解AOP在controller上導(dǎo)致controller注入失敗問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10Java編程實現(xiàn)基于圖的深度優(yōu)先搜索和廣度優(yōu)先搜索完整代碼
這篇文章主要介紹了Java編程實現(xiàn)基于圖的深度優(yōu)先搜索和廣度優(yōu)先搜索完整代碼,具有一定借鑒價值,需要的朋友可以了解下。2017-12-12SpringCloud?Nacos?+?Ribbon?調(diào)用服務(wù)的實現(xiàn)方式(兩種)
這篇文章主要介紹了SpringCloud?Nacos?+?Ribbon?調(diào)用服務(wù)的兩種方法,分別是通過代碼的方式調(diào)用服務(wù)和通過注解方式調(diào)用服務(wù),每種方式給大家介紹的非常詳細,需要的朋友可以參考下2022-03-03APT?注解處理器實現(xiàn)?Lombok?常用注解功能詳解
這篇文章主要為大家介紹了使用APT?注解處理器實現(xiàn)?Lombok?常用注解功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09