【JVM 03-JVM內存結構之-虛擬機棧】

虛擬機棧 筆記記錄

  • 1. 定義
    • 1.1 演示棧幀
  • 2. 特點
  • 3. 線程運行診斷
    • 3.1 案例1 cpu占用過多&解決
    • 3.2 案例2 程序運行很長時間沒有結果
  • 4. 拓展知識&問題辨析
    • 4.1 棧的內存越大越好嘛?(不是)
    • 4.2 方法內的局部變量是否線程安全?(是線程安全的)
      • 4.2.1 局部變量全在方法中
      • 4.2.2 局部變量可能逃離方法
    • 4.3 可能拋出的異常?
    • 4.4 什么情況下會發生棧內存溢出?
    • 4.5 如何設置棧的大小?
    • 4.6 補充棧幀的內部結構
      • 重要的兩個(局部變量表&操作數棧)
        • 4.6.1 局部變量表
        • 4.6.2 操作數棧

學習資料來源-b站黑馬JVM& 尚硅谷JVM精講與GC調優

1. 定義

這里是引用

  • 虛擬機棧:線程運行需要的內存空間。棧中放的是多個棧幀。
  • 棧幀:每個方法運行時需要的內存。(比如參數,局部變量,返回地址等。)
  • 每個線程只能有1個活動棧幀,對應著當前正在執行的那個方法。
  • Java虛擬機棧(Java Virtual Machine Stack),早期也叫Java棧。每個線程在創建時都會創建一個虛擬機棧,其內部保存一個個的棧幀(Stack Frame),對應著一次次的Java方法調用。是線程私有的,生命周期和線程一致。
  • 虛擬機棧中放的一個個棧幀。
    這里是引用

1.1 演示棧幀

在這里插入圖片描述

    public static void main(String[] args) {method1();}private static void method1() {method2(1,2);}private static int method2(int a, int b) {int c=a+b;return c;}

2. 特點

  • 棧是一種快速有效的分配存儲方式,訪問速度僅次于程序計數器。
  • 垃圾回收是否涉及棧內存?(不會,一次次方法執行后彈出棧自動被回收掉。)不存在GC ; 但是會存在OOM。

3. 線程運行診斷

3.1 案例1 cpu占用過多&解決

在這里插入圖片描述

  1. 首先通過top命令定位哪個進程對cpu占用過高
  2. 根據pid 32655 我們只直到這個進程占用過高,但是我們需要知道那個線程導致的。使用ps H -eo pid,tid,%cpu | grep 32655 (用ps命令進一步定位哪個線程占用cpu過高)
    對Linux忘記的話借用deepseek回顧一下。在這里插入圖片描述
    在這里插入圖片描述
  3. 使用jdk提供的工具,jstack 進程id
    在這里插入圖片描述
    我們已經知道是線程32655的導致的,可以直接根據線程編號,找到對應的輸出信息。但是注意,32655是10進制的,但是jstack輸出的信息是16進制的,所以先換算一下。
    在這里插入圖片描述
    這里得到7F99,找到對應的代碼。根據線程id7f99找到對應的包下的java代碼,第8行。
    在這里插入圖片描述
  • 發現原來是代碼寫了while(true) 死循環,導致CPU高。
  • 當然這里只是一個舉例,實際情況要看線上的具體問題和代碼。
    在這里插入圖片描述

3.2 案例2 程序運行很長時間沒有結果

這里是引用
一直滑倒最后看到一個死鎖問題。這也是為啥不輸出的原因。
在這里插入圖片描述
再看具體的Java代碼,其實也是很好理解。如果不理解也沒關系,重溫鎖的知識或者死鎖的產生等即可。
在這里插入圖片描述

4. 拓展知識&問題辨析

4.1 棧的內存越大越好嘛?(不是)

棧越大 內存分配的棧越少,棧越少 線程越少。所以棧別太大,越小線程越多,也不能太小,太小棧溢出。【一般采用系統默認就好】

4.2 方法內的局部變量是否線程安全?(是線程安全的)

4.2.1 局部變量全在方法中

不會有線程安全問題,每個局部變量都在各自的棧幀中,線程不共享。

static void m1(){int x=0;for (int i=0;i<1000;i++){x++;}System.out.println(x);}

4.2.2 局部變量可能逃離方法

總結就是具體問題具體分析,要注意局部變量逃離本方法的問題。

//線程安全public static void m1() {StringBuilder sb = new StringBuilder();sb.append(1);sb.append(2);sb.append(3);System.out.println(sb);}//線程不安全,StringBuilder作為參數傳遞進來,就意味著有可能有其他線程能訪問到它。就不再是線程私有的了。public static void m2(StringBuilder sb) {sb.append(1);sb.append(2);sb.append(3);System.out.println(sb);}//線程不安全,返回值也是StringBuilder,所以其他線程能訪問到它。public static StringBuilder  m3() {StringBuilder sb = new StringBuilder();sb.append(1);sb.append(2);sb.append(3);return sb;}

4.3 可能拋出的異常?

StackOverFlowError?OutOfMemoryError?

  • Java 虛擬機規范允許Java棧的大小是動態的或者是固定不變的。 如果采用固定大小的Java虛擬機棧,那每一個線程的Java虛擬機棧容量可以在線程創建的時候獨立選定。如果線程請求分配的棧容量超過Java虛擬機棧允許的最大容量,Java虛擬機將會拋出一個
    StackOverflowError 異常。
  • 如果Java虛擬機棧可以動態擴展,并且在嘗試擴展的時候無法申請到足夠的內存,或者在創建新的線程時沒有足夠的內存去創建對應的虛擬機棧,那Java虛擬機將會拋出—個
    OutOfMemoryError 異常。

4.4 什么情況下會發生棧內存溢出?

一、局部數組過大。當函數內部的數組過大時,有可能導致堆棧溢出。(棧幀過大)
二、遞歸調用層次太多。遞歸函數在運行時會執行壓棧操作,當壓棧次數太多時,也會導致堆棧溢出。(棧幀過多)

對于第1種情況可能會發生在對象轉換JSON的時候,如Dept中有Emp,Emp中有Dept,無線循環,可以使用
@JsonIgnore
private Dept dept; 忽略即可。

在這里插入圖片描述

4.5 如何設置棧的大小?

在這里插入圖片描述

-Xss size (即:-XX:ThreadStackSize)
-Xss256k或者-XX:ThreadStackSize=256k都可以
我們看棧大小window下可能會顯示0
在這里插入圖片描述

  • 設置10124K
    添加VM options在這里插入圖片描述在這里插入圖片描述

4.6 補充棧幀的內部結構

這里是引用

重要的兩個(局部變量表&操作數棧)

可以IDEA插件中下載jclasslib插件來看代碼

4.6.1 局部變量表

局部變量表(local variables)
● 局部變量表也被稱之為局部變量數組或本地變量表。
● 定義為一個數字數組,主要用于存儲方法參數和定義在方法體內的局部變量,這些數據類型包括各類基本數據類型(8種)、對象引用(reference),以及returnAddress類型
● 局部變量表所需的容量大小是在編譯期確定下來的,并保存在方法的Code屬性的maximum local variables數據項中。在方法運行期間是不會改變局部變量表的大小的。
● 方法嵌套調用的次數由棧的大小決定。一般來說,棧越大,方法嵌套調用次數越多。對一個函數而言,它的參數和局部變量越多,使得局部變量表膨脹,它的棧幀就越大,以滿足方法調用所需傳遞的信息增大的需求。進而函數調用就會占用更多的棧空間,導致其嵌套調用次數就會減少。
● 局部變量表中的變量只在當前方法調用中有效。在方法執行時,虛擬機通過使用局部變量表完成參數值到參數變量列表的傳遞過程。當方法調用結束后,隨著方法棧幀的銷毀,局部變量表也會隨之銷毀。
在這里插入圖片描述

4.6.2 操作數棧

操作數棧(Operand Stack)
● 我們說Java虛擬機的解釋引擎是基于棧的執行引擎,其中的棧指的就是操作數棧。
● 每一個獨立的棧幀中除了包含局部變量表以外,還包含一個后進先出(Last-In-First-Out)的操作數棧,也可以稱之為表達式棧(Expression Stack)。
● 操作數棧就是JVM執行引擎的一個工作區,當一個方法剛開始執行的時候,一個新的棧幀也會隨之被創建出來,這個方法的操作數棧是空的。
● 每一個操作數棧都會擁有一個明確的棧深度用于存儲數值,其所需的最大深度在編譯期就定義好了,保存在方法的Code屬性中,為max_stack的值。
棧中的任何一個元素都是可以任意的Java數據類型。
32bit的類型占用一個棧單位深度
64bit的類型占用兩個棧單位深度
● 操作數棧,在方法執行過程中,根據字節碼指令,并非采用訪問索引的方式來進行數據訪問的,而是只能通過標準的入棧(push)和出棧(pop)操作,往棧中寫入數據或提取數據來完成一次數據訪問。
某些字節碼指令將值壓入操作數棧,其余的字節碼指令將操作數取出棧。使用它們后再把結果壓入棧。比如:執行復制、交換、求和等操作
如果被調用的方法帶有返回值的話,其返回值將會被壓入當前棧幀的操作數棧中,并更新PC寄存器中下一條需要執行的字節碼指令。

  • 操作數棧,主要用于保存計算過程的中間結果,同時作為計算過程中變量臨時的存儲空間。

這里做一下簡單的介紹,具體對于棧的深度,以及有過slot的復用,每個類型占多少大小等后續復習繼續更新吧。

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

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

相關文章

文章記單詞 | 第104篇(六級)

一&#xff0c;單詞釋義 keyboard /?ki?b??rd/ n. 鍵盤underlying /??nd?r?la???/ adj. 潛在的&#xff1b;根本的&#xff1b;基礎的June /d?u?n/ n. 六月tactics /?tkt?ks/ n. 戰術&#xff1b;策略&#xff1b;手段south /sa?θ/ n./adj./adv. 南方&#x…

中宏立達與天空衛士達成戰略合作

戰略合作篇 中宏立達-天空衛士 2025年5月23日&#xff0c;中宏立達與天空衛士在中宏立達集團總部北京麗金智地中心正式簽署戰略合作協議。中宏立達總經理王博先生與天空衛士高級副總裁兼首席運營官鞏文堅先生代表雙方簽署協議。這標志著兩家領軍企業在數字安全領域的深度合作正…

RxJS 高階映射操作符詳解:map、mergeMap 和 switchMap

1. map 操作符 map 是最基本的轉換操作符&#xff0c;用于對 Observable 發出的每個值進行一對一轉換。 基本特點&#xff1a; 同步操作一對一轉換不改變 Observable 的發出時機 詳細示例&#xff1a; import { of } from rxjs; import { map } from rxjs/operators;// 示…

基于stm32的多旋翼無人機(Multi-rotor UAV based on stm32)

由于一直在調試本項目&#xff0c;好久沒有發文章&#xff0c;最近本項目的PID調試初見成效&#xff01;開始正文前首先感謝各位粉絲的支持&#xff0c;以及對本項目技術上支持的老師以及師兄&#xff0c;謝謝你們&#xff01; 對應源碼及文件&#xff1a;源碼及文件下載 基于…

量子傳感器:開啟微觀世界的精準探測

隨著量子技術的飛速發展&#xff0c;量子傳感器逐漸成為前沿科技領域的熱門研究方向。量子傳感器利用量子力學的特性&#xff0c;能夠實現對物理量的極高精度測量&#xff0c;其應用范圍涵蓋了基礎科學研究、醫學診斷、環境監測以及國防安全等多個領域。本文將深入探討量子傳感…

河道管網排口在線監測系統解決方案

一、方案概述 我國作為世界上河流數量最為豐富的國家之一&#xff0c;擁有眾多歷史悠久的壯闊江河流域。然而&#xff0c;伴隨經濟社會的迅猛發展&#xff0c;河湖管理與保護面臨諸多新挑戰&#xff0c;諸如河道干涸、湖泊萎縮、水環境惡化以及河湖功能退化等問題&#xff0c;對…

Foldseek快速蛋白質結構比對

1. 下載和安裝 Foldseek 如果只是單個蛋白質結構的序列比對&#xff0c;我們只需要用Foldseek 的網站服務 https://search.foldseek.com/search 上傳我們的蛋白質結構并選擇想要進行比對的數據庫即可&#xff0c;這里不做重點講解。做生物信息學研究&#xff0c;我們難免需要批…

宏山激光韓國釜山開放日圓滿舉行,服務本地化再提速

5月21日-22日&#xff0c;宏山激光在韓國釜山展廳舉辦了主題為“韓國本地服務領導者”的開放日活動&#xff0c;此次活動聚焦韓國市場&#xff0c;通過沉浸式參觀和深度交流&#xff0c;全面展示宏山激光本地化服務體系的建設成果&#xff0c;彰顯其服務本地、深耕市場的堅定決…

大模型「瘦身」指南:從LLaMA到MobileBERT的輕量化部署實戰

大模型「瘦身」指南&#xff1a;從LLaMA到MobileBERT的輕量化部署實戰 系統化學習人工智能網站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目錄 大模型「瘦身」指南&#xff1a;從LLaMA到MobileBERT的輕量化部署實戰摘要引言一、輕量化技術…

JavaScript篇:函數作用域與作用域鏈探秘

大家好&#xff0c;我是江城開朗的豌豆&#xff0c;一名擁有6年以上前端開發經驗的工程師。我精通HTML、CSS、JavaScript等基礎前端技術&#xff0c;并深入掌握Vue、React、Uniapp、Flutter等主流框架&#xff0c;能夠高效解決各類前端開發問題。在我的技術棧中&#xff0c;除了…

Robust Kernel Estimation with Outliers Handling for Image Deblurring論文閱讀

Robust Kernel Estimation with Outliers Handling for Image Deblurring 1. 論文的研究目標與實際問題意義1.1 研究目標1.2 實際問題與產業意義2. 論文的創新方法、模型與優勢2.1 核心思路2.2 關鍵公式與技術細節2.2.1 非線性模糊模型與能量函數2.2.2 中間潛像更新與IRLS2.2.3…

nginx配置跨域請求,后臺不用配置啦,完美

允許全部把域名改* server { listen 22222; server_name localhost; location / { if ($request_method OPTIONS) { add_header Access-Control-Allow-Origin http://localhost:8080; add_header Access-Control-Allow-Headers *; add_header Access-Control-…

[特殊字符] 構建高內聚低耦合的接口架構:從數據校驗到后置通知的分層實踐

在現代企業系統開發中&#xff0c;接口結構設計的質量直接影響系統的穩定性、擴展性與可維護性。隨著業務復雜度上升&#xff0c;單一層次的接口實現往往難以應對功能膨脹、事務一致性、后置擴展等需求。因此&#xff0c;我們提出一種面向復雜業務場景的接口分層模型&#xff0…

MySQL 5.7 實戰:JSON 字段提取、Base64 解碼與引號問題全解析

一、背景與問題場景 在 MySQL 數據庫中&#xff0c;存儲 JSON 格式數據&#xff08;如用戶行為日志、配置參數、擴展信息&#xff09;的場景日益普遍。當需要從 JSON 字段中提取特定鍵值&#xff08;如info&#xff09;并進行 Base64 解碼時&#xff0c;常遇到以下問題&#x…

1.2.1+1.2.2計算機硬件的基本組成

知識總覽 早期馮諾依曼計算機&#xff1a;從人工-》自動 出現原因&#xff1a; 埃尼阿克計算機每執行一條指令都需要人工接線攬&#xff0c;雖然計算機處理的快&#xff0c;但是人工接線可能慢&#xff0c;效率低&#xff0c;于是出現馮諾依曼計算機&#xff0c;把要執行的指…

Spring AI 1.0 GA 正式發布

Spring AI 1.0 GA 正式發布 快速入門核心特性1. **增強型 LLM&#xff08;大語言模型&#xff09;**2. **MCP 協議支持**3. **RAG&#xff08;檢索增強生成&#xff09;**4. **評估與監控**5. **智能代理&#xff08;Agents&#xff09;** 下一步計劃 VMware Spring 團隊 Mark …

亞馬遜云科技推出Anthropic新一代模型

5月23日 亞馬遜云科技宣布在Amazon Bedrock中推出Anthropic的最新一代模型Claude Opus 4和Claude Sonnet 4。這兩款全新混合推理模型能夠根據需求在快速響應和深度思考模式間靈活切換&#xff0c;為編碼、高級推理和多步驟工作流領域帶來全新標準。它們不僅能在復雜的長時間推理…

無人機開啟未來配送新篇章

低空物流&#xff08;無人機物流&#xff09;是利用無人機等低空飛行器進行貨物運輸的物流方式&#xff0c;依托低空空域&#xff08;通常在120-300米&#xff09;實現快速、高效、靈活的配送服務。它是低空經濟的重要組成部分&#xff0c;廣泛應用于快遞配送、醫療物資運輸、農…

數據賦能(234)——數據管理——標準化原則

概述 標準化原則的重要性體現在確保數據的格式、結構和命名的一致性。這不僅可以提高數據的質量&#xff0c;還能促進數據的有效共享、交換和利用。以下是標準化原則的重要性的具體體現&#xff1a; 提高數據通用性&#xff1a;遵循數據標準和規范&#xff0c;確保不同系統、…

【Linux筆記】——線程池項目與線程安全單例模式

&#x1f525;個人主頁&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收錄專欄&#x1f308;&#xff1a;Linux &#x1f339;往期回顧&#x1f339;&#xff1a; 【Linux筆記】——簡單實習一個日志項目 &#x1f516;流水不爭&#xff0c;爭的是滔滔不息 一、線程池設計二…