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