二、JVM 入門——(三)棧

棧的定義

棧也是一塊區域,用來存放數據的。棧也叫棧內存,主管Java程序的運行。

棧是私有的,是在線程創建時創建,所以它的生命期是跟隨線程的生命期,線程結束棧內存也就釋放。

因此對于棧來說不存在垃圾回收問題,只要線程一結束該棧就Over,生命周期和線程一致。

這里把方法放進棧里,說的就是方法在棧幀里面。入棧出棧說的都是棧幀。

棧的特點

  • 棧空間也是不需要連續分配,只要在邏輯上相連即可。
  • 棧遵循最基本的棧的數據結構特征:先進后出。
  • 棧空間支付動態調整大小。-xms
  • 棧空間不會出現垃圾回收。(gc作用域不在該區域)
  • 棧的 5 棧的創建時機:在線程創建的時候,隨之創建的。
  • 棧屬于線程私有區域。
  • 對棧的操作,只有入棧出棧(壓棧幀彈棧幀)

存儲什么

棧中未來不是直接存放調用的方法,而是存儲棧幀。棧幀是棧中最小單元。

8種基本類型的變量+對象的引用變量+returnAddress都是在函數的棧內存中分配。

棧幀中存儲:前三個比較重要

  • 存儲8種基本數據類型。
  • 存儲對象的引用: user未來存儲在棧幀中。
User user = new User();
  • 存輸方法的返回地址(returnAddress)。
    • 任意一個萬法都要存方法出去后的下一條指令地址,哪怕該方法是 void 類型也得存,因為任意的方法在底層字節碼都會插入一條字節碼指令return
public void a() {...b();...
}public void b() {......
}
  • 存儲局部變量表(Local Variable)
  • 操作數棧。(Operate stack)
  • 動態鏈接(抽象)(Dynamic link)

如圖,查看字節碼指令多了return

舉例

當一個方法A被調用時就產生了一個棧幀 F1,并被壓入到棧中,

A方法又調用了 B方法,于是產生棧幀 F2 也被壓入棧,

B方法又調用了 C方法,于是產生棧幀 F3 也被壓入棧,

……

執行完畢后,先彈出F3棧幀,再彈出F2棧幀,再彈出F1棧幀……

遵循“先進后出”或者“后進先出”原則。

圖示在一個棧中有兩個棧幀:

棧幀 2是最先被調用的方法,先入棧,

然后方法 2 又調用了方法1,棧幀 1處于棧頂的位置,

棧幀 2 處于棧底,執行完畢后,依次彈出棧幀 1和棧幀 2,

線程結束,棧釋放。

每執行一個方法都會產生一個棧幀,保存到棧(后進先出)的頂部,頂部棧就是當前的方法,該方法執行完畢后會自動將此棧幀出棧。

常見問題棧溢出:Exception in thread "main" java.lang.StackOverflowError

通常出現在遞歸調用時。

JVM對Java棧的操作只有兩個,就是對棧幀的壓棧和出棧,遵循“先進后出”或者“后進先出”原則。

一個線程中只能由一個正在執行的方法(當前方法),因此對應只會有一個活動的當前棧幀。

當一個方法1(main方法)被調用時就產生了一個棧幀1 并被壓入到棧中,棧幀1位于棧底位置

方法1又調用了方法2,于是產生棧幀2 也被壓入棧,

方法2又調用了方法3,于是產生棧幀3 也被壓入棧,

…… 執行完畢后,先彈出棧幀4,再彈出棧幀3,再彈出棧幀2,再彈出棧幀1,線程結束,棧釋放。

深入理解

通過在終端中輸入這樣的指令,可以去查看下面要講的內容;或者idea中的jclasslib插件

javap -verbose 類名.class
局部變量表(Local Variables)

也叫本地變量表。 作用:存儲方法參數和方法體內的局部變量:8種基本類型變量、對象引用(reference)。 可以用如下方式查看字節碼中一個方法內定義的的局部變量,當程序運行時,這些局部變量會被加載到 局部變量表中。

實例方法第一個存的是this,方便去調用方法;而類方法直接可以利用類調用,所以就不需要存儲。

局部變量表槽位,一個小方格是一個槽位。

long、double 這種類型是占了兩個小方格

實例方法和形參也都會提前放好

  • 報錯時,為什么能知道哪里錯了?行號表;告訴說是哪一行報錯了

操作數棧

作用: 也是一個棧在方法執行過程中根據字節碼指令記錄當前操作的數據,將它們入棧或出棧。用于保存計算過程的中間結果,同時作為計算過程中變量的臨時存儲空間。

  • 每一步指令都會嚴格的入棧出棧,想要深究可以去找pdf步驟。

動態連接

作用:通過符號引用動態確定某些對象。

比如可以知道當前幀執行的是哪個方法對象。程序在運行期間,通過運行時常量池中方法的符號引用,找到方法對象。

執行一個方法的流程:(待定了,先看上面解釋即可)

找方法,先得找其類 A,而類在運行時常量池里,包括各種方法,各種屬性(這里可能是哪個類在運行,其屬性就在里面去找)。

拿到 A 在常量池中的符號 #1, 拿到了符號就可以去常量池拿到了類 A,編譯就不會報錯。

這是靜態鏈接,只在編譯的時候去找。

注意

操作數棧的深度和局部變量表的大小,是在編譯階段確定的。

棧空間溢出

Error Exception 平級,都是繼承了 Throwable 類。

IDEA 中可以修改棧的大小,默認是 1MB。

這里是一直遞歸調用,使得一直使用方法redo導致棧空間爆炸。

// JVM設置  -Xss128k(默認1M)
public class StatckOverflowTest1 {private static int count = 0;public static  void  redo(){count++;redo();}public static void main(String[] args) {try {redo();} catch (Throwable e) {e.printStackTrace();System.out.println("counter====="+count);}}
}java.lang.StackOverflowError
at com.atguigu.jvm.StatckOverflowTest1.redo(StatckOverflowTest1.java:13)
at com.atguigu.jvm.StatckOverflowTest1.redo(StatckOverflowTest1.java:13)
at com.atguigu.jvm.StatckOverflowTest1.redo(StatckOverflowTest1.java:13)
at com.atguigu.jvm.StatckOverflowTest1.redo(StatckOverflowTest1.java:13)
at com.atguigu.jvm.StatckOverflowTest1.redo(StatckOverflowTest1.java:13)
at com.atguigu.jvm.StatckOverflowTest1.redo(StatckOverflowTest1.java:13)
at com.atguigu.jvm.StatckOverflowTest1.redo(StatckOverflowTest1.java:13)
at com.atguigu.jvm.StatckOverflowTest1.redo(StatckOverflowTest1.java:13)
counter=====10213

查看文檔鏈接

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

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

相關文章

深度學習入門第一課——神經網絡實現手寫數字識別

昨天我們講了深度學習的大致框架,下面我們用深度學習網絡來實現一個小項目——手寫數字識別。完整代碼import torch from torch import nn from torch.utils.data import DataLoader from torchvision import datasets from torchvision.transforms import ToTensor…

Vue中的scoped屬性

理解&#xff1a; 在 .vue 文件中&#xff0c;scoped 是 <style> 標簽的一個屬性&#xff0c;作用是讓樣式只作用于當前組件&#xff0c;避免樣式污染其他組件 scoped 讓樣式只在自己的組件內生效&#xff0c;不會影響到其他組件的同名元素 舉例 沒有 scoped 的情況&…

S2B2B系統哪個好,商淘云、數商云、金蝶云蒼穹供應鏈批發哪個比較靠譜

在數字化商業浪潮洶涌的當下&#xff0c;S2B2B系統已成為眾多企業優化供應鏈、提升運營效率、拓展業務版圖的關鍵利器。從大型企業的復雜產業鏈協同&#xff0c;到中小企業對上下游資源的整合與把控&#xff0c;S2B2B系統的身影無處不在。但面對市場上層出不窮的各類S2B2B系統&…

利用3臺機器搭建Kubernetes集群

文章目錄1 機器準備修改主機名(可選)配置IP地址和主機名映射關閉防火墻關閉swap2 安裝docker修改并更新軟件源安裝docker設置路由轉發規則&#xff0c;并使配置生效安裝 kubelet&#xff0c;kubeadm&#xff0c;kubectl3 初始化集群4 集群初始化5 work節點加入6 部署網絡插件本…

C6.3:發射結交流電阻

當一個小交流電壓加在發射結上&#xff0c;會產生發射極交流電流&#xff0c;該交流電流的大小取決于Q點位置&#xff0c;而曲線是彎曲的&#xff0c;所以Q點在曲線上的位置越高&#xff0c;發射極交流電流的峰值越大。發射極總電流是直流分量和交流分量疊加而成&#xff0c;即…

python中生成器

生成器是根據算法生成數據的一種機制&#xff0c;每次調用生成器只生成一個值&#xff0c;可以節省大量內存生成器推導式gg ( i * 2 for i in range(5))print(gg)print(next(gg)) # 0 print(next(gg)) # 2 print(next(gg)) # 4 print(next(gg)) # 6 print(next(gg)) # 8yield…

【RAGFlow代碼詳解-28】部署和基礎設施

Docker 部署架構 RAGFlow 使用多階段 Docker 構建過程和 Docker Compose 編排進行部署。該系統支持完整和輕量級部署變體。 多階段 Docker 構建構建過程由 Dockerfile 2-214中定義的三個階段組成&#xff1a; 基礎階段 &#xff1a;使用系統依賴項、ML 模型和運行時環境設置 Ub…

【prism】Prism 彈窗在 ViewModel 中控制大小的實踐總結

好 &#x1f44d; 這個思路非常適合寫成一篇 實用型博客&#xff0c;主題就是 “Prism 彈窗如何在 ViewModel 中控制窗口大小”。我幫你整理了一篇文章草稿&#xff0c;你可以直接拿去修改/發布。Prism 彈窗在 ViewModel 中控制大小的實踐總結 在 WPF 中使用 Prism 的 IDialogS…

項目管理進階——研發項目立項管理制度

為使公司研究開發(以下簡稱研發)項目的管理工作規范化、程序化、充分調度研發人員的積極性,提高研發成果的產出率和成果轉化率,特制定管理辦法。 一、 研發項目的立項: 原則上公司部設立基礎研究項目。研發項目的重點放在符合市場需要。能很快轉化成產品,或對現有生產工…

CMake構建學習筆記20-iconv庫的構建

1. 構建 iconv是一個用于在不同字符編碼&#xff08;如 UTF-8、GBK、ISO-8859-1 等&#xff09;之間進行轉換的開源庫。筆者在《c中utf8字符串和gbk字符串的轉換》這篇文章中介紹過如何在Windows下實現utf8字符串和gbk字符串的轉換&#xff0c;不過該實現是基于Win32 API的&am…

STM32的Sg90舵機

1.舵機到底要的是什么信號&#xff1f;想象舵機就像一個“聽秒表的工人”&#xff1a;這個工人每隔 20ms 就抬頭看看秒表一次。秒表上的 高電平持續多久&#xff0c;他就把這個時間當成“指令角度”。高 1ms → 轉到最左&#xff08;0&#xff09; 高 1.5ms → 轉到中間&#x…

動態帶寬擴展(DBE):下一代Wi-Fi性能提升的關鍵技術

動態帶寬擴展(DBE):下一代Wi-Fi性能提升的關鍵技術 引言 在無線通信技術快速發展的今天,用戶對網絡帶寬和傳輸速率的需求呈指數級增長。為了滿足這種需求,IEEE 802.11標準不斷演進,引入了多項創新技術。其中,動態帶寬擴展(Dynamic Bandwidth Expansion, DBE) 作為80…

Seaborn數據可視化實戰:Seaborn數據可視化基礎-從內置數據集到外部數據集的應用

Seaborn數據集探索與圖表繪制實踐 學習目標 通過本課程&#xff0c;你將學習如何使用Seaborn庫中的內置數據集&#xff0c;了解如何加載這些數據集&#xff0c;并掌握使用這些數據集繪制圖表的基本方法。此外&#xff0c;你還將學習如何導入外部數據集&#xff0c;并在Seaborn中…

漫談《數字圖像處理》之經典空域邊緣檢測Canny與LOG

在《數字圖像處理》的圖像分割領域&#xff0c;Canny 邊緣檢測與 LOG&#xff08;高斯拉普拉斯&#xff09;邊緣檢測是兩款極具代表性的先進空域算法。不同于深度學習驅動的方法&#xff0c;它們通過對圖像像素的直接計算提取邊緣&#xff0c;下面用更貼近日常認知的語言&#…

搶紅包案例加強版

加join的功能是保證線程全部運行完畢&#xff0c;之后好統計構造器剛開始為空列表&#xff0c;利用這個方法返回每個成員列表&#xff08;把每個員工弄成一個列表里面寫他們搶到的紅包大小&#xff0c;索引代表搶到的個數。&#xff09;

曲面方程的三維可視化:從數學解析到Python實現

在三維幾何建模中,我們經常遇到需要將隱式方程可視化的需求。本文將深入探討一個特定的曲面方程: XH?YH2+ZH2tan?(θ)?H2πarcsin?(YHYH2+ZH2)=0 X_H - \frac{\sqrt{Y_H^2 + Z_H^2}}{\tan(\theta)} - \frac{H}{2\pi} \arcsin\left( \frac{Y_H}{\sqrt{Y_H^2 + Z_H^2}} \r…

當GitHub宕機時,我們如何協作

引言簡述GitHub在全球開發協作中的重要性提出假設性問題&#xff1a;當GitHub不可用時&#xff0c;如何確保團隊協作不中斷常見的GitHub宕機場景服務完全不可用&#xff08;如DNS問題、全球性故障&#xff09;部分功能受限&#xff08;如API速率限制、倉庫訪問失敗&#xff09;…

如何確定哪些層應添加適配器(Adapter)?(58)

“它如何確定哪些層應添加適配器(Adapter)?是否只有量化層符合條件?我能否也將適配器添加到常規(非量化)線性層上?” 這個問題提得很好,我會逐一為你解答。首先,先給出簡潔結論: ? 主流模型架構會預配置目標層列表,適配器將應用于這些列表中的層。 ? 無論目標層…

【內網滲透】CVE-2025-21420 利用cleanmgr本地提權

目錄 原理 POC 復現 一個windows本地提權漏洞 這是一個存在于Windows磁盤清理工具&#xff08;cleanmgr.exe&#xff09;中的權限提升漏洞。攻擊者可以利用該系統組件在處理特定目錄時的邏輯缺陷&#xff0c;通過精心構造的符號鏈接&#xff08;Symbolic Link&#xff09;&a…

什么是JSON-RPC 2.0,在項目中應該怎么使用

它是什么 JSON-RPC 2.0 是一種超輕量、與傳輸無關的遠程調用協議&#xff1a;用 JSON 表達“方法名 參數 → 結果/錯誤”。可跑在 HTTP、WebSocket、Unix 管道&#xff0c;甚至 stdio 上&#xff08;很多開發協議如 LSP 就用它&#xff09;。 報文長這樣 ? 請求&#xff1a; …