Java中字元串記憶體位置淺析

来源:http://www.cnblogs.com/holten/archive/2016/08/18/5782596.html
-Advertisement-
Play Games

前言 之前寫過一篇關於 "JVM記憶體區域劃分" 的文章,但是昨天接到螞蟻金服的面試,問到JVM相關的內容,解釋一下JVM的記憶體區域劃分,這部分答得還不錯,但是後來又問了Java裡面String存放的位置,之前只記得String是一個不變的量,應該是要存放在常量池裡面的,但是後來問到new一個Stri ...


前言

之前寫過一篇關於JVM記憶體區域劃分的文章,但是昨天接到螞蟻金服的面試,問到JVM相關的內容,解釋一下JVM的記憶體區域劃分,這部分答得還不錯,但是後來又問了Java裡面String存放的位置,之前只記得String是一個不變的量,應該是要存放在常量池裡面的,但是後來問到new一個String出來應該是放到哪裡的,這個應該是放到堆裡面的,後來又問到String的引用是放在什麼地方的,當時傻逼的說也是放在堆裡面的,現在總結一下:基本類型的變數數據和對象的引用都是放在棧裡面的,對象本身放在堆裡面,顯式的String常量放在常量池,String對象放在堆中。

常量池的說明

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

Area: HotSpot
Synopsis: 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記憶體位置說明

  1. 顯式的String常量

    String a = "holten";
    String b = "holten";
  • 第一句代碼執行後就在常量池中創建了一個值為holten的String對象;
  • 第二句執行時,因為常量池中存在holten所以就不再創建新的String對象了。
  • 此時該字元串的引用在虛擬機棧裡面。
  1. String對象

    String a = new String("holtenObj");
    String b = new String("holtenObj");
  • Class被載入時就在常量池中創建了一個值為holtenObj的String對象,第一句執行時會在堆里創建new String("holtenObj")對象;
  • 第二句執行時,因為常量池中存在holtenObj所以就不再創建新的String對象了,直接在堆里創建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
    }
}

返回結果:

true
false

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 更新具體細節參見:[更新設計]跨平臺物聯網通訊框架ServerSuperIO 2.0 ,功能、BUG、細節說明,以及升級思考過程! 聲明:公司在建設工業大數據平臺,SSIO正好能派上用場,所以抓緊時間進行了完善,並且升級到了2.0版本,希望對大家有幫助。僅供開源學習,商用請聯繫作者。 1.SSIO特 ...
  • 在C#實現類似Typedef的所有功能 Typedef這個關鍵字,是比較好用的東西,因為有時候我們需要使用一些別名來幫助我們記憶某些結構體或者類的共用。(個人覺得這是C與C++唯一能吸引我的東西)為了能夠實現這個想法,我們可以使用下列方法。 1.使用using語句進行別名,這個方法適合針對結構體。 ...
  • ASP.NET Boilerplate,簡稱ABP 詳細深入:可以參考如下文章 http://www.cnblogs.com/mienreal/p/4528470.html http://www.cnblogs.com/farb/ 開始前你將要跑起第一個abp程式 可是發現怎麼都運行不起來。。。。 ...
  • 最前面的話:Smobiler是一個在VS環境中使用.Net語言來開發APP的開發平臺,也許比Xamarin更方便 ...
  • 如題,要實現一個如下的列表,該如何實現? 在設計過程中,會遇到如下問題: 1、ListBox中ListBoxItem的模板設計 2、ListBox中ListBoxItem的模板容器設計 3、ListBox本身的模板設計 4、ListBox本身的焦點樣式 下麵我們依次來解決這些問題: 1、子模板 2、 ...
  • 前端: 後端: ...
  • C#過濾html標簽 在項目中遇到這樣一個需求,需要將一段html轉換為一般文本返回,萬能的正則表達式來了。 正則表達式來拯救你,代碼如下: 1 public static string Html2Text(string htmlStr) 2 3 { 4 5 if (String.IsNullOrE ...
  • 二、activiti.cfg.xml的其他bean節點配置 2.1 新特性:Job Executor和Async Executor 從5.17.0版本的activiti開始提供作業執行者(Job Executor)和非同步作業執行者(Async Executor),Async Executor執行表現 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...