【JVM 07-運行時常量池重要組成部分-StringTable】

StringTable 筆記記錄

  • 1. 常量池、運行時常量池與字符串常量池(StringTable)的關系
  • 2. String str="a"放入字符串常量池的過程
  • 3. 常見面試題
  • 4. StringTable特性
  • 5.StringTable的位置變更
    • 5.1 為什么位置變換?
    • 5.2 位置變更演示
  • 6. StringTable垃圾回收
  • 7. StringTable性能調優
    • 7.1 考慮字符串是否入池(字符串常量池)

1. 常量池、運行時常量池與字符串常量池(StringTable)的關系

在這里插入圖片描述


/*** StringTable[] 當變為字符串對象時,還會將符號當作key在StringTable中去找,看有沒有取值相同的key,* 如果沒有就放入,如果有就直接使用。* 也就是StringTable結構其實是一個哈希表。哈希表是長度固定的,不能進行擴容。如果沒有“a”字符串對象,則* 會放入串池。StringTable ["a"],執行完String s1="a"時就會放入串池中。下一行代碼類似的。**/
public class Demo {//常量池中的信息,都會被加載到運行時常量池中,這時a,b,ab,都是常量池中的符號,還沒有變為java字符串對象//當執行到該行代碼時://ldc #2 會把a符號變為 “a” 字符串對象//ldc #3 會把b符號變為 “b” 字符串對象//ldc #4 會把ab符號變為“ab” 字符串對象public static void main(String[] args) {//將“a”放入字符串池中是一個惰性的過程,當執行到該行代碼時,才會去檢查是否有。String s1="a";String s2="b";String s3="ab";}
}

這里是引用
使用javap -v class文件看具體細節。
這里能看到Constant poool;在這里插入圖片描述

常量池:.class 文件中的靜態數據,存儲字面量和符號引用。
運行時常量池:類加載后解析的常量池,支持動態修改。
字符串常量池:運行時常量池的子集,專門存儲字符串字面量。

在這里插入圖片描述

2. String str="a"放入字符串常量池的過程

這里是引用

3. 常見面試題

        String s1 = "a";String s2 = "b";String s3 = "ab";//new  StringBuilder().append("a").append("b").toString;//StringBuilder的toString方法最終是new String("ab");String s4 = s1+s2; String s5="a"+"b";System.out.println(s3==s4);//false s3在字符串常量池中,s4在堆中,地址不一樣。System.out.println(s3==s5);//true 編譯器優化 實際上是"ab"  這里都可以利用javap -v *.class 查看字節碼

String s1 = “a”;
String s2 = “b”;
String s4 = s1+s2;的底層如下
在這里插入圖片描述

4. StringTable特性

  1. 常量池中的字符串僅是符號,第一次用到時才變為對象。
  2. 利用串池的機制,避免重復創建字符串對象。
  3. 字符串變量拼接的原理是StrngBuilder(1.8)
  4. 字符串常量拼接的原理是編譯器優化 String s5=“a”+“b”;
  5. 可以使用intern方法,主動將串池中還沒有的字符串對象放入串池
 //串池中StringTable [ "a","b"]//堆中 [ "a", "b","ab" ] 這里注意串池中沒有ab,因為這里是動態拼接的變量而不是常量。如果是String str="ab",則串池中存在。String s=new String("a")+new String("b");//想要把s的ab放入串池中調用 s.intern();即可。s.intern();String s2="ab";System.out.println(s==s2);
        String x="ab";String s1=new String("a")+new String("b");String s2 = s1.intern();System.out.println(s2==x);//trueSystem.out.println(s1==x);//false x的ab已經放進去了,實際上s1.intern()放不進去了,所以s1和x不相等

這里注意JDK及7以后:
在這里插入圖片描述

     String s1=new String("a")+new String("b");String s2 = s1.intern();String x="ab";System.out.println(s2==x);//trueSystem.out.println(s1==x);//true 
 String s1="a";String s2="b";String s3="a"+"b";String s4=s1+s2;String s5="ab";String s6=s4.intern();System.out.println(s3==s4);//false s3在常量池s4由StringBuilder拼接然后new String對象 在堆中System.out.println(s3==s5);//true  s3編譯器優化 實際還是"ab"System.out.println(s3==s6);//trueString x2=new String("c")+new String("d");String x1="cd";x2.intern();System.out.println(x1==x2);//false x2放不進去常量池因為已經存在了,所以x2.intern()返回的是常量池中的對象

5.StringTable的位置變更

這里是引用

5.1 為什么位置變換?

這里是引用

5.2 位置變更演示

import java.util.ArrayList;
import java.util.List;/*** 演示StringTable位置* -Xmx10m* -XX:-UseGCOverheadLimit [寫+就是打開開關,-就是關閉。]** -XX:-UseGCOverheadLimit 詳解* 1. 作用* -XX:-UseGCOverheadLimit 是 JVM 的一個 故障保護機制開關,默認啟用(-XX:+UseGCOverheadLimit)。* 它的核心作用是:* 當 JVM 檢測到 GC 占用過多時間(超過 98%)但回收效果極差(釋放內存 < 2%)時,拋出 OutOfMemoryError: GC Overhead Limit Exceeded 錯誤,防止應用陷入無限 GC。* 2. 觸發條件* JVM 會在以下情況觸發該錯誤:* GC 時間占比 > 98%(如 100ms 里 98ms 在 GC)。* GC 后內存釋放 < 2%(幾乎沒回收空間)。* 持續超過 5 次 Full GC(不同 JVM 實現可能略有差異)。* 3. 關閉方式* 通過 -XX:-UseGCOverheadLimit 可禁用此機制,讓 JVM 繼續嘗試 GC,而非直接報錯。* 但需謹慎使用,可能讓應用卡死在 GC 中!*/
public class Demo {public static void main(String[] args) {List<String> list = new ArrayList<>();int i = 0;try {for (int j = 0; j < 260000; j++) {list.add(String.valueOf(j).intern());i++;}} catch (Throwable e) {e.printStackTrace();} finally {System.out.println(i);}}
}

看報錯也就知道了串池在堆空間。
在這里插入圖片描述

6. StringTable垃圾回收

執行代碼前的字符串常量池統計
在這里插入圖片描述
往池子里加了100個對象后
在這里插入圖片描述


/*** 演示StringTable垃圾回收* -Xmx10m 堆空間設置10m* -XX:+PrintStringTableStatistics 打印字符串常量池的統計信息* -XX:+PrintGCDetails -verbose:gc 打印GC信息*/
public class Demo {public static void main(String[] args) {int i=0;try {for (int j=0;j<100;j++){String.valueOf(j).intern();i++;}} catch (Exception e) {e.printStackTrace();}finally {System.out.println( i);}}
}

后面改成10000個對象

    public static void main(String[] args) {int i=0;try {for (int j=0;j<10000;j++){String.valueOf(j).intern();i++;}} catch (Exception e) {e.printStackTrace();}finally {System.out.println( i);}}

發生了GC
在這里插入圖片描述
這里就證明了確實StringTable是會發生垃圾回收的。

7. StringTable性能調優

StringTable底層是哈希表。
這里是讀48w個單詞,-XX:StringTableSize=200000 【調整字符串常量池StringTable的大小】
這里就是動態的調整jvm參數發現執行的時間變化是很大的。在這里插入圖片描述

7.1 考慮字符串是否入池(字符串常量池)

for循環10次,將480w都存入list中。
沒有入池之前在這里插入圖片描述> 沒有入池占用到80%左右。在這里插入圖片描述
入池之后
在這里插入圖片描述
占用30%多左右。在這里插入圖片描述
如果引用出現大量的重復字符串,可以讓字符串入池,來減少字符串對象個數,節約堆內存的使用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84369.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84369.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84369.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

算法-每日一題(DAY10)打家劫舍

1.題目鏈接&#xff1a; 198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 2.題目描述&#xff1a; 你是一個專業的小偷&#xff0c;計劃偷竊沿街的房屋。每間房內都藏有一定的現金&#xff0c;影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統&#xf…

android UI 布局

一&#xff1a;約束布局 參考&#xff1a; 【約束布局】ConstraintLayout 約束布局 ( 簡介 | 引入依賴 | 基本操作 | 垂直定位約束 | 角度定位約束 | 基線約束 )_韓曙亮-2048 AI社區 以下是一個基于 ConstraintLayout 的簡單 Android 示例&#xff0c;包含三個控件&#xff0…

【K8S】詳解Labels?? 和 ??Annotations

在 Kubernetes&#xff08;K8s&#xff09;中&#xff0c;??Labels&#xff08;標簽&#xff09;?? 和 ??Annotations&#xff08;注解&#xff09;?? 都是用于為資源對象&#xff08;如 Pod、Service、Deployment&#xff09;附加元數據的機制&#xff0c;但它們在設計…

系統模塊編程與實現

設備類&#xff08;Device Class&#xff09;?? 和 ??設備節點&#xff08;Device Node&#xff09;??是深入 Linux 設備管理和驅動模型的核心基礎。它們就像“骨骼”與“門戶”&#xff0c;共同構建了 Linux 與硬件交互的核心橋梁。 一、設備類與設備節點 1. ??設備…

視頻壓縮、碼率與流媒體傳輸知識總結

&#x1f3a5; 視頻壓縮、碼率與流媒體傳輸知識總結 本筆記整理了 I/P/B 幀結構、碼率計算、文件大小估算、壓縮格式對比、推流帶寬建議等視頻工程常見技術要點。 一、單幀與未壓縮視頻數據量估算 分辨率&#xff1a;19201080&#xff08;1080p&#xff09; 色深&#xff1a;…

嵌入式C++學習路線

&#x1f680; 嵌入式C學習路線圖 從C語言基礎到嵌入式C高手的完整路徑 &#x1f4cb; 學習進度追蹤 總體目標&#xff1a; 20-26周完成全部學習內容 前置條件&#xff1a; C語言基礎 STM32開發經驗 學習方式&#xff1a; 理論學習 實踐項目 階段1: C基礎過渡 (2-3周) 目標…

VSCode1.101.1Win多語言語言編輯器便攜版安裝教程

軟件下載 【名稱】&#xff1a; VSCode1.101.1 【大小】&#xff1a; 120M 【語言】&#xff1a; 簡體中文 【安裝環境】&#xff1a; Win10/Win11 【迅雷網盤下載鏈接】&#xff08;務必手機注冊&#xff09;&#xff1a; 迅雷 【網站下載鏈接】: 其他網盤 軟件介紹 VSCod…

ssh 服務和 rsync 數據同步

目錄 一、ssh服務 1、概述 2、命令解析 遠程登錄命令 遠程拷貝命令 3、登錄方式配置 1、用戶名密碼登錄 2、公鑰驗證登錄 二、rsync 數據同步 1、rsync概述 2、rsync運行原理 3、rsync部署 一、ssh服務 1、概述 ssh服務&#xff0c;一種遠程管理連接工具&#xf…

使用隨機森林實現目標檢測

核心實現思路 滑動窗口策略&#xff1a;在圖像上滑動固定大小的窗口&#xff0c;對每個窗口進行分類多維特征提取&#xff1a;結合統計特征、紋理特征、邊緣特征、形狀特征等隨機森林分類&#xff1a;訓練二分類器判斷窗口是否包含目標后處理優化&#xff1a;使用非極大值抑制…

3.6 move_base導航初體驗

1.環境搭建 在工作空間src下git wpr_simulation&#xff0c;安裝install_for_noetic.sh&#xff0c;然后再回退工作空間進行編譯 下載參數文件 git clone https://github.com/6-robot/wpb_home.git下載需要魔法&#xff0c;在這里可以使用手機熱點進行平替 進入腳本文件夾 …

Mysql高級——MVCC(多版本并發控制)

MySQL MVCC&#xff08;多版本并發控制&#xff09;詳解 MVCC&#xff08;Multi-Version Concurrency Control&#xff09;是 MySQL InnoDB 存儲引擎實現的一種并發控制機制&#xff0c;用于在保證事務隔離性的同時&#xff0c;提高數據庫的并發性能。下面從原理、實現、事務隔…

Oracle union連接的怎么排序

在Oracle數據庫中&#xff0c;使用UNION或UNION ALL操作符來合并兩個或多個查詢結果時&#xff0c;如果想對這些合并后的結果進行排序&#xff0c;通常有兩種方法可以實現&#xff1a; 方法1&#xff1a;在最后的查詢結果上使用ORDER BY 你可以在所有使用UNION或UNION ALL合并…

uni-app總結2-所需知識儲備和學習途徑

使用uni-app進行跨平臺開發&#xff0c;開發者不用去掌握各個平臺的開發語言&#xff0c;只需一套代碼即可完成多端的產品輸出。那么使用uni-app需要掌握什么呢&#xff0c;這里給大家分享一下。 Vue.js uni-app里是通過Vue來開發的&#xff0c;所以首先肯定是要掌握Vue語言。…

如何高效實現公司文件管理

要實現公司文件管理的高效&#xff0c;企業應聚焦統一文件規范、部署文檔管理系統、強化權限控制、推動協同編輯、實施定期清理、推進文化建設、引入可視化分析。其中&#xff0c;統一文件規范是文件高效管理的基礎。若缺乏清晰的命名規則與分類體系&#xff0c;即便配備了先進…

多模態大語言模型arxiv論文略讀(124)

MediConfusion: Can you trust your AI radiologist? Probing the reliability of multimodal medical foundation models ?? 論文標題&#xff1a;MediConfusion: Can you trust your AI radiologist? Probing the reliability of multimodal medical foundation models …

nacos的總結

服務發現與健康監測&#xff1a;Nacos 支持多種服務注冊方式&#xff0c;包括 API、SDK 和 Annotation 等&#xff0c;服務消費者可以通過 DNS 或 RPC 方式方便地發現服務。其健康檢查機制通過主動和被動的方式實時監測服務實例的健康狀態&#xff0c;確保流量不會被發送到不健…

低軌導航 | 低軌衛星導航PNT模型,原理,公式,matlab代碼

一、PNT模型原理 低軌衛星PNT(定位、導航、授時)模型利用低軌星座的快速幾何構型變化和強信號特性,通過三類核心觀測值實現增強定位: 幾何增強原理 低軌衛星速度7km/s(比GNSS快8-10倍)5分鐘內觀測幾何變化相當于地面站24小時變化量加速模糊度收斂和誤差分離信號增強原理…

基于python的查詢工具,查詢手機號的卡號歸屬地

本文介紹了一個利用Python進行電話號碼歸屬地查詢的代碼示例。代碼使用requests庫發送HTTP請求&#xff0c;偽裝瀏覽器UA頭&#xff0c;通過lxml庫解析網頁數據&#xff0c;并運用XPath提取號碼歸屬地信息。程序構建了查詢URL&#xff0c;發送GET請求后解析返回的HTML內容&…

AI面試系統選型HR應考慮哪些問題?

北森人才管理研究院發布的《2025 企業校園招聘 AI 應用實用指南》數據顯示&#xff1a;全球 44% 的企業已在招聘環節部署AI技術&#xff0c;72% 的 HR 每周至少使用一次 AI 工具&#xff0c;87% 的 HR 認為 AI 能顯著提升招聘效率。 來源于《北森2025 企業校園招聘 AI 應用實用…

Redis02

redis的持久化機制 1.redis為什么需要持久化 redis本身運行時數據保存在內存中&#xff0c;那么在關閉redis的進程或者關閉計算機后數據肯定被會操作系統從內存中清掉。 redis持久化方式有兩種: RDB AOF redis默認采用了一種持久化方式&#xff0c;即RDB &#xff08;Redi…