国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

基于Java中字符串內(nèi)存位置詳解

2019-11-26 13:58:22
字體:
供稿:網(wǎng)友

前言

之前寫過一篇關(guān)于JVM內(nèi)存區(qū)域劃分的文章,但是昨天接到螞蟻金服的面試,問到JVM相關(guān)的內(nèi)容,解釋一下JVM的內(nèi)存區(qū)域劃分,這部分答得還不錯,但是后來又問了Java里面String存放的位置,之前只記得String是一個不變的量,應(yīng)該是要存放在常量池里面的,但是后來問到new一個String出來應(yīng)該是放到哪里的,這個應(yīng)該是放到堆里面的,后來又問到String的引用是放在什么地方的,當(dāng)時傻逼的說也是放在堆里面的,現(xiàn)在總結(jié)一下:基本類型的變量數(shù)據(jù)和對象的引用都是放在棧里面的,對象本身放在堆里面,顯式的String常量放在常量池,String對象放在堆中。

常量池的說明

常量池之前是放在方法區(qū)里面的,也就是在永久代里面的,從JDK7開始移到了堆里面。這一改變我們可以從oracle的release version的notes里的** Important RFEs Addressed in JDK 7 **看到。

Area: HotSpotSynopsis: In JDK 7, interned strings are no longer allocated in the permanent generation of the Java heap, but are instead allocated in the main part of the Java heap (known as the young and old generations), along with the other objects created by the application. This change will result in more data residing in the main Java heap, and less data in the permanent generation, and thus may require heap sizes to be adjusted. Most applications will see only relatively small differences in heap usage due to this change, but larger applications that load many classes or make heavy use of the String.intern() method will see more significant differences.RFE: 6962931

String內(nèi)存位置說明

1.顯式的String常量

String a = "holten";String b = "holten";

•第一句代碼執(zhí)行后就在常量池中創(chuàng)建了一個值為holten的String對象;

•第二句執(zhí)行時,因為常量池中存在holten所以就不再創(chuàng)建新的String對象了。

•此時該字符串的引用在虛擬機棧里面。

1.String對象

String a = new String("holtenObj");String b = new String("holtenObj");

•Class被加載時就在常量池中創(chuàng)建了一個值為holtenObj的String對象,第一句執(zhí)行時會在堆里創(chuàng)建new String("holtenObj")對象;

•第二句執(zhí)行時,因為常量池中存在holtenObj所以就不再創(chuàng)建新的String對象了,直接在堆里創(chuàng)建new String("holtenObj")對象。

驗證一下

/** * Created by holten.gao on 2016/8/16. */public class Main {  public static void main(String[] args){    String str1 = "高小天";    String str2 = "高小天";    System.out.println(str1==str2);//true        String str3 = new String("高大天");    String str4 = new String("高大天");    System.out.println(str3==str4);//false  }}

返回結(jié)果:

truefalse

以上這篇基于Java中字符串內(nèi)存位置詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 南昌市| 陇西县| 法库县| 贵溪市| 敦化市| 报价| 大余县| 巴塘县| 沾益县| 双柏县| 平果县| 梓潼县| 汕头市| 郯城县| 齐齐哈尔市| 江永县| 蒙阴县| 和田县| 安吉县| 巨野县| 福清市| 汤原县| 广汉市| 连南| 嘉定区| 宣城市| 东方市| 通江县| 左贡县| 镇康县| 神木县| 遵义市| 拉萨市| 汨罗市| 广汉市| 莲花县| 渭南市| 乐平市| 潞西市| 和林格尔县| 密云县|