詳解Java字符串在內(nèi)存中的存儲位置
在JDK6的時候在Java虛擬機(這里指的是HotSpot)中內(nèi)存區(qū)域分為本地方法棧、虛擬機棧、堆、程序計數(shù)器、方法區(qū)等,方法區(qū)又被稱作永久代。
這里只說一下字符串的存儲位置,在Java虛擬機內(nèi)存中有個區(qū)域叫做運行時常量池,是方法區(qū)的一部分。在JDK6中其中存放的有類的版本、字段、方法、接口等描述信息以及常量池,常量池用來存放編譯期間生成的各種字面量和符號引用,字符串就存儲在這個位置。下面通過代碼來看下現(xiàn)象。
這是JDK6的實驗現(xiàn)象,Java虛擬機的配置如下:
-XX:PermSize=5M -XX:MaxPermSize=5M -Xms5M -Xmx5M -XX:-UseGCOverheadLimit -verbose:gc
其含義是方法區(qū)的初始大小為5M,最大為5M;堆空間的初始大小為5M,最大為5M,當(dāng)垃圾回收時間占的比例較高時不允許報錯,打印垃圾回收信息。
import java.util.ArrayList; import java.util.List; public class StringTest { static String base = "string"; public static void main(String[] args) { List list = new ArrayList(); for (int i = 0; i < Integer.MAX_VALUE; i++) { String str = base + base; base = str; list.add(str.intern()); } } }
運行錯誤如下:
可以看到報的是永久代即方法區(qū)的內(nèi)存溢出錯誤,在這里使用了String API的inner方法,其作用是把首次遇到的字符串實例復(fù)制到永久代去,返回的也是永久代中這個字符串實例的引用。
在JDK7中字符串已經(jīng)從常量池中移除,方法區(qū)有被取消掉的趨勢,在JDK7的環(huán)境下虛擬機中使用相同的配置運行以上代碼,情況如下:
我們看到的信息是Java虛擬機堆溢出,由此可見在JDK7中字符串的存儲位置已經(jīng)被移到了堆中。
在JDK8的環(huán)境下,使用相同的虛擬機配置信息,就會報一個錯誤,錯誤如下:
指出永久代已經(jīng)在JDK8中移除。
在JDK8中新出現(xiàn)的內(nèi)存區(qū)域叫做元空間,其位于本地內(nèi)存中。我們將JDK8的虛擬機配置信息修改為如下:
-Xms5M -Xmx5M -XX:MetaspaceSize=5M -XX:MaxMetaspaceSize=5M -verbose:gc
其含義是堆內(nèi)存的初始大小為5M,最大空間為5M,元空間的初始大小為5M,最大為5M,打印垃圾回收的信息。
運行遇上相同的代碼,打印的錯誤信息如下:
可以看到是堆內(nèi)存溢出,在這里筆者產(chǎn)生一個疑問,因為通過網(wǎng)上看的資料說的是此處應(yīng)該為元空間溢出的錯誤,但是筆者通過實際的測試發(fā)現(xiàn),其報的錯誤依然是堆內(nèi)存溢出的錯誤,也就是在JDK8中字符串的存儲位置是堆?
因為實驗結(jié)果跟網(wǎng)上看到的有區(qū)別,暫且在這里打上一個問號。
以上所述是小編給大家介紹的Java字符串在內(nèi)存中的存儲位置詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
java.imageIo給圖片添加水印的實現(xiàn)代碼
最近項目在做一個商城項目, 項目上的圖片要添加水?、?添加圖片水印;②:添加文字水印;一下提供下個方法,希望大家可以用得著2013-07-07[Java]詳解Socket和ServerSocket學(xué)習(xí)筆記
即時類應(yīng)用或者即時類的游戲,HTTP協(xié)議很多時候無法滿足于我們的需求,這會,Socket對于我們來說就非常實用了。本篇文章主要介紹了Socket和ServerSocket,有興趣的可以了解一下。2016-12-12Java instanceof關(guān)鍵字用法詳解及注意事項
instanceof 是 Java 的保留關(guān)鍵字。它的作用是測試它左邊的對象是否是它右邊的類的實例,返回 boolean 的數(shù)據(jù)類型。本文重點給大家介紹Java instanceof關(guān)鍵字用法詳解及注意事項,需要的朋友參考下吧2021-09-092020最新 idea下載、安裝與創(chuàng)建項目測試的教程圖解
這篇文章主要介紹了2020最新 idea下載、安裝與創(chuàng)建項目測試的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08SpringBoot?整合mybatis+mybatis-plus的詳細(xì)步驟
這篇文章主要介紹了SpringBoot?整合mybatis+mybatis-plus的步驟,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06