欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

jvm字符串常量池在什么內(nèi)存區(qū)域問題解析

 更新時(shí)間:2023年11月03日 10:06:04   作者:豐木  
這篇文章主要介紹了jvm字符串常量池在什么內(nèi)存區(qū)域的問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

問題 字符串常量池分配在什么內(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)文章

最新評(píng)論