?? 作者主頁: 有來技術
?? 開源項目: youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template
?? 倉庫主頁: GitCode︱ Gitee ︱ Github
?? 歡迎點贊 ?? 收藏 ?評論 ?? 如有錯誤敬請糾正!
前言
在 Java 開發中,字符串常量池(String Constant Pool)是一個關鍵但容易被忽略的優化機制。周志明老師在《深入理解 Java 虛擬機:JVM 高級特性與最佳實踐(第 3 版)》的 2.4.3 章節中提出了一個與方法區和常量池相關的有趣測試用例。通過該測試,幫助我們深入理解 JDK6、JDK7 和 JDK8+ 版本中字符串常量池的演變,以及 intern()
方法的關鍵變更。
相關概念
在深入代碼分析之前,先了解幾個關鍵概念:
-
方法區(Method Area):用于存儲類信息、常量池、靜態變量等,JDK6 及之前版本的方法區位于永久代(PermGen),JDK7+ 開始使用元空間(Metaspace)。
-
字符串常量池(String Constant Pool):用于存放字符串字面量,減少字符串對象重復創建帶來的內存開銷。
方法區 (Method Area) [JDK 1.8+為元空間]└── 運行時常量池 (Runtime Constant Pool)└── 字符串常量池 (String Constant Pool) [JDK 1.7之前在方法區,JDK 1.7+在堆中]
-
String::intern()
方法:- JDK6 及之前:如果字符串在常量池中不存在,會創建一個拷貝存入池中,并返回該池中字符串的引用。
- JDK7+:不再拷貝,而是直接存儲堆中的引用,減少不必要的內存占用。
測試代碼分析
public class RuntimeConstantPoolOOM {public static void main