JVM中的運行時常量池詳解

????????運行時常量池(Runtime Constant Pool)是每一個類或接口的常量池(Constant_Pool)的運行時表示形式,它包括了若干種不同的常量:從編譯期可知的數值字面量到必須運行期解析后才能獲得的方法或字段引用。運行時常量池扮演了類似傳統語言中符號表(Symbol Table)的角色,不過它存儲數據范圍比通常意義上的符號表要更為廣泛。

????????每一個運行時常量池都分配在Java虛擬機的方法區之中,在類和接口被加載到虛擬機后,對應的運行時常量池就被創建出來。

???????? 在創建類和接口的運行時常量池時,可能會發生如下異常情況:

? 當創建類或接口的時候,如果構造運行時常量池所需要的內存空間超過了方法區所能提供的最 大值,那Java虛擬機將會拋出一個OutOfMemoryError異常。

? ? ? ? 上面的表述實在有些晦澀,不易初學者理解,所以下面我通過一個詳細的例子,用通俗的語言一步步帶你理解“運行時常量池”是怎么工作的。


假設我們寫了一段簡單的 Java 代碼:

public class Example {public static void main(String[] args) {int number = 42;String message = "Hello, World!";System.out.println(message);}
}

第一步:代碼編譯成?.class?文件

????????當你用?javac Example.java?編譯這段代碼時,Java 編譯器會生成一個?Example.class?文件。這個文件里有一個“常量池”(Constant Pool),它就像一個清單列表,把代碼里用到的“固定信息”列出來。這些信息在編譯時就已經確定了,但它們只是“符號”或者“名字”,還沒有變成程序運行時能直接用的東西。

在這個例子中,常量池里可能會記錄這些內容:

  1. 數字?42(一個整數字面量)。
  2. 字符串?"Hello, World!"(一個字符串字面量)。
  3. 方法引用?System.out.println(表示我們要調用的那個打印方法)。
  4. 一些類名和字段名,比如?java/lang/System?和?out

這些信息被存成一種特殊的格式,比如:

  • #1 = Integer 42(表示數字 42)。
  • #2 = String "Hello, World!"(表示字符串)。
  • #3 = Methodref java/lang/System.out.println(表示打印方法)。

????????這些只是符號,不是最終的內存地址或實際數據。常量池就像一個“備忘錄”,記錄了代碼里用到的所有關鍵東西。

第二步:JVM 加載并創建運行時常量池

????????當你運行?java Example?時,JVM 會加載?Example.class?文件。它會把文件里的常量池拿出來,變成一個“活的”東西——這就是“運行時常量池”(Runtime Constant Pool)。這個運行時常量池存在于 JVM 的內存中(具體在方法區里),它的任務是把剛才那些符號“翻譯”成程序能用的實際內容。

比如:

  • 數字?42:在運行時常量池里,它還是?42,但會被關聯到程序的計算中,直接用在?int number = 42?賦值。
  • 字符串?"Hello, World!":JVM 會檢查字符串池(String Pool,專門用來存字符串),如果池子里已經有?"Hello, World!",就直接用那個;如果沒有,就創建一個新的字符串對象,然后把它的引用存到運行時常量池里。
  • 方法?System.out.println:運行時常量池會去查找?System?類的具體位置,找到?out?這個字段(它是一個?PrintStream?對象),再找到?println?方法的實際內存地址。這樣,程序就知道去哪里執行打印操作。

第三步:程序運行時的翻譯過程

現在程序開始執行?main?方法:

  1. int number = 42;

    • JVM 直接從運行時常量池拿到?42,把它賦值給變量?number。這里沒什么復雜的,因為?42?是個簡單的數字。
  2. String message = "Hello, World!";

    • JVM 從運行時常量池里找到?"Hello, World!"?的引用。因為它是字符串字面量,JVM 會確保它在字符串池里只存在一份,然后讓?message?指向這個字符串。
  3. System.out.println(message);

    • JVM 去運行時常量池查找?System.out.println?的符號引用。
    • 它先找到?System?類(可能在內存地址比如?0x1234),然后找到?out?字段(一個?PrintStream?對象,比如在?0x5678),再找到?println?方法的具體地址(比如?0x9abc)。
    • 最后,JVM 調用這個方法,把?message?的內容?"Hello, World!"?打印出來。

比喻解釋:運行時常量池像一個“翻譯官”

想象你去一個陌生的國家旅游,帶了一本旅游手冊,里面寫著:

  • “酒店” 在第 1 頁。
  • “問候語:你好” 在第 2 頁。
  • “找餐廳的方法” 在第 3 頁。

????????這本手冊就像編譯時的“常量池”,它只是記錄了信息,但你還不知道具體怎么用。到了當地,你請了個導游(運行時常量池),他拿著手冊幫你翻譯:

  • “酒店” → 帶你去具體的酒店地址。
  • “你好” → 教你怎么發音跟當地人打招呼。
  • “找餐廳的方法” → 告訴你具體的路線。

????????運行時常量池就干這個活兒:把代碼里的符號(手冊上的詞)翻譯成實際能用的東西(地址、數據),讓程序順利跑起來。

總結

通過這個例子,可知運行時常量池的核心作用是:

  • 保存編譯時確定的常量(數字、字符串、方法引用等)。
  • 在程序運行時,把這些符號解析成實際的內存地址或數據。
  • 確保代碼里的每一部分都能找到它需要的東西,正確執行。

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

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

相關文章

C# MethodBase 類使用詳解

總目錄 前言 在C#編程中,反射(Reflection)是一種強大的機制,允許我們在運行時檢查和操作類型的成員。MethodBase 類是.NET框架中 System.Reflection 命名空間下的一個抽象類,它是所有方法( MethodInfo 和 Constructor…

【css酷炫效果】純CSS實現3D翻轉卡片動畫

【css酷炫效果】純CSS實現3D翻轉卡片動畫 緣創作背景html結構css樣式完整代碼效果圖 想直接拿走的老板,鏈接放在這里:https://download.csdn.net/download/u011561335/90490472 緣 創作隨緣,不定時更新。 創作背景 剛看到csdn出活動了&am…

Flask多參數模版使用

需要建立目錄templates; 把建好的html文件放到templates目錄里面; 約定好參數名字,單個名字可以直接使用;多參數使用字典傳遞; 樣例: from flask import render_template # 模板 (Templates) #Flask 使用…

SVN簡明教程——下載安裝使用

SVN教程目錄 一、開發中的實際問題二、簡介2.1 版本控制2.2 Subversion2.3 Subversion的優良特性2.4 工作原理2.5 SVN基本操作 三、Subversion的安裝與配置1. 服務器端程序版本2. 下載源碼包3. 下載二進制安裝包4. 安裝5. 配置版本庫① 為什么要配置版本庫?② 創建目…

OpenCV圖像拼接(1)概述

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 此圖說明了在Stitcher類中實現的拼接模塊流程。使用該類,可以配置/移除某些步驟,即根據特定需求調整拼接流程。流程中的所…

Ubuntu20.04安裝Nvidia顯卡驅動

Ubuntu20.04安裝Nvidia顯卡驅動 安裝環境為Dell R540服務器 官網下載Nvidia顯卡驅動 https://www.nvidia.cn/geforce/drivers/ 安裝顯卡驅動 chmod x NVIDIA-Linux-x86_64-470.63.01.run sudo ./NVIDIA-Linux-x86_64-470.63.01.run 遇到nouveau報錯 lsmod查看nouveau驅動…

互聯網it常用抓包工具說明

一、引言 在互聯網 IT 領域,無論是網絡故障排查、安全檢測,還是開發調試,抓包工具都發揮著舉足輕重的作用。 當網絡出現故障,比如網頁加載緩慢、應用無法連接服務器時,抓包工具可以幫助我們捕獲網絡數據包&#xff0…

Linux 音頻驅動 WM8960 音頻 DAC IC 音樂播放與錄音

這些先引出一個內容,是 Linux 內核的音頻系統,ALSA,提供了對聲卡的低級訪問,支持 PCM,播放/錄音、混音、MIDI 處理等功能。它取代了舊的 OSS,并提供更強大的功能和更好的硬件支持。 ALSA 主要特點&#xf…

k8s中的組件

1.namespace Namespace 用于將集群資源劃分為不同的邏輯組&#xff0c;方便管理和隔離 kubectl get namespace 查看所有邏輯組 kubectl describe namespace <namespace-name> 查看某個邏輯組信息詳情 kubectl create namespace ... 創建邏輯組 kubectl delete names…

OpenHarmony 開源鴻蒙北向開發——3.配置SDK

安裝、配置完成之后我們就要配置SDK。 我們創建工程后&#xff0c;點擊右上角設置 進入設置 進入OpenHarmony SDK&#xff0c;選擇編輯 這里配置一下SDK安裝位置 點擊完成 這里我們API版本勾選第一個即可 確認安裝 勾選接受 這里要等一會 安裝完成后&#xff0c;點擊完成

5.2《生活中的透鏡》——5.3《凸透鏡成像規律》講后再上

教會什么:照相機、投影儀、放大鏡的原理 培養什么:(再說) 課標: (二)運動和相互作用 2.3 聲和光 2.3.5了解凸透鏡成像規律的應用。 例7 了解凸透鏡成像規律在放大鏡、照相機中的應用。 一、導入 提問:生活中有哪些透鏡?(放大鏡、照相機、投影儀/幻燈機) ——直接提出…

怎么用LoRA的低秩結構近似Fisher矩陣

怎么用LoRA的低秩結構近似Fisher矩陣 目錄 怎么用LoRA的低秩結構近似Fisher矩陣**1. Fisher矩陣的內存挑戰****2. LoRA的低秩結構與Fisher近似****3. 具體實現步驟****4. 示例說明****5. 有效性分析****6. 擴展與優化****總結**在LoRA(低秩適應)中,通過低秩結構近似Fisher矩…

C#通過API接口返回流式響應內容---SignalR方式

1、背景 在上兩篇《C#通過API接口返回流式響應內容—分塊編碼方式》和《C#通過API接口返回流式響應內容—SSE方式》實現了流式響應的內容。 上面的這兩個主要是通過HTTP的一些功能&#xff0c;除了這些之外&#xff0c;還有WebSocket的方式。C#中的WebSocket的有比較多的方案&…

Redis 跳表原理詳解

一、引言 在 Redis 中&#xff0c;有序集合&#xff08;Sorted Set&#xff09;是一種非常重要的數據結構&#xff0c;它可以實現元素的有序存儲和高效查找。而實現有序集合的底層數據結構之一就是跳表&#xff08;Skip List&#xff09;。跳表是一種隨機化的數據結構&#xff…

識別并脫敏上傳到deepseek/chatgpt的文本文件中的身份證/手機號

本文將介紹一種簡單高效的方法解決用戶在上傳文件到DeepSeek、ChatGPT,文心一言,AI等大語言模型平臺過程中的身份證號以及手機號等敏感數據識別和脫敏問題。 DeepSeek、ChatGPT,Qwen,Claude等AI平臺工具快速的被接受和使用,用戶每天上傳的文本數據中潛藏著大量敏感信息,…

Spring 如何創建 Bean 實例的?

Spring 創建 Bean 實例的過程主要由 BeanFactory 接口及其實現類&#xff08;通常是 AbstractBeanFactory 的 doGetBean 方法和 DefaultListableBeanFactory 的 preInstantiateSingletons 方法&#xff09;負責。這個過程涉及多個步驟&#xff0c;包括 Bean 定義的解析、依賴的…

第六:go 操作 redis-go

Redis 在項目開發中redis的使用也比較頻繁&#xff0c;本文介紹了Go語言中go-redis庫的基本使用。 Redis介紹 Redis是一個開源的內存數據庫&#xff0c;Redis提供了多種不同類型的數據結構&#xff0c;很多業務場景下的問題都可以很自然地映射到這些數據結構上。除此之外&am…

【RabbitMQ】RabbitMQ如何保證消息不丟失?

為了保證消息不丟失&#xff0c;需要在生產者、RabbitMQ本身和消費者三個環節采取相應措施。 1.生產者端&#xff1a;確保消息發送成功 1.1開啟消息確認機制(Publisher Confirms) 原理&#xff1a; 生產者發送消息后&#xff0c;RabbitMQ會返回一個確認(ACK),表示消息已成功…

fastapi+angular外賣系統

說明&#xff1a; fastapiangular外賣系統 1.美食分類&#xff08;粥&#xff0c;粉&#xff0c;面&#xff0c;炸雞&#xff0c;炒菜&#xff0c;西餐&#xff0c;奶茶等等&#xff09; 2.商家列表 &#xff08;kfc&#xff0c;蘭州拉面&#xff0c;湘菜館&#xff0c;早餐店…

Kafka-Exporter 9308端口啟用TLS認證的完整指南

#作者&#xff1a;張桐瑞 文章目錄 1 方案描述2 涉及版本3 使用CA自簽證書3.1一鍵生成證書腳本3.1.1證書腳本3.1.2執行結果 3.2分步自建證書過程3.2.1生成CA私鑰3.2.2生成CA自簽名證書3.2.3生成服務器私鑰和證書申請文件CRS 3.3最終的文件列表 4 Exporter啟動命令4.1參數說明 …