Jvm(一)之棧、堆、方法區

前言-與正文無關

????????生活遠不止眼前的苦勞與奔波,它還充滿了無數值得我們去體驗和珍惜的美好事物。在這個快節奏的世界中,我們往往容易陷入工作的漩渦,忘記了停下腳步,感受周圍的世界。讓我們一起提醒自己,要適時放慢腳步,欣賞生活中的每一道風景,享受與家人朋友的溫馨時光,發現那些平凡日子里隱藏的幸福時刻。因為,這些點點滴滴匯聚起來的,才是構成我們豐富多彩生活的本質。希望每個人都能在繁忙的生活中找到自己的快樂之源,不僅僅為了生存而工作,更為了更好的生活而生活.

????????送你張美圖!希望你開心!

目錄

棧、堆、方法區

棧和堆

堆和方法區

棧、堆、方法區和線程

存儲內容

棧的特性

棧與請求

圖解數據創建


棧、堆、方法區

棧內存中放哪些東西?
? ①基本類型的變量,例如int a=3中的a;
? ②上圖對象的引用變量,例如Person person=new Person();中的person


堆內存中存放哪些東西?
? ① 存放由new創建的對象和數組。如上圖的new Person()后的對象:
? 在堆中存放的內存,由Java虛擬機垃圾回收器來管理。在堆中產生了一個數組或者對象后,還可以在棧中定義一個特殊的變量,這個變量持有的內容等于數組或者對象在堆內存中的首地址。在棧中的這個特殊的變量,就成了數組或者對象的引用變量,以后就可以在程序中使用棧內存中的引用變量來訪問堆中的數組或者對象,引用變量相當于為數組或者對象起的一個別名,或者代號。


靜態區/方法區(也叫元空間)存放哪些東西?:
? 方法區(method)也叫做靜態區,跟堆一樣,被所有的線程共享。方法區包含所有的class和static變量,還有string的直接賦值的數據值。
? 方法區中包含的都是在整個程序中永遠唯一的元素,例如class,static變量。
? 全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量放在相鄰的另一塊區域。

棧和堆

????????通俗來講,堆是用來存放對象的(在細說一下代碼執行的new,包括new后set的內容,也就是對象所持內容都是堆存放。),而棧是用來執行程序還有對象引用的,方法區存放類,靜態變量的。同一個棧中有3個部分是共享的:基本類型變量區,執行環境上下文,操作指令區。

????????就速度來說,有如下關系: 寄存器 > 棧 >堆 >其他這是棧的優勢。但缺點是,存在棧中的數據大小和生存期是必須確定的,缺乏靈活性。棧有一個很重要的特性,就是存在棧中的數據可以共享。假設我們同時定義:

????????int a = 3;

????????int b = 3;

????????編譯器先處理int a = 3;首先它會在棧中創建一個變量為a的引用,然后查找棧中是否有3這個值,如果沒找到,就將3存放進來,然后將a指向3。接著處理int b = 3;在創建完b的引用變量后,因為在棧中已經有3這個值,便將b直接指向3。這樣,就出現了a與b同時均指向3的情況。這時,如果再令a=4;那么編譯器會重新搜索棧中是否有4值,如果沒有,則將4存放進來,并令a指向4;如果已經有了,則直接將a指向這個地址。因此a值的改變不會影響到b的值。要注意這種數據的共享與兩個對象的引用時

堆和方法區

????????注意一下String s3 = "china" 中china也存在方法區;String ss1 = new String("china"); 才存在堆中。對于通過 new 產生一個字符串(假設為 ”china” )時,會先去常量池中查找是否已經有了 ”china” 對象,如果沒有則在常量池中創建一個此字符串對象,然后堆中再創建一個常量池中此 ”china” 對象的拷貝對象。并把ss1指向堆中的地址。(在常量池中創建目的是為了提升字符串的訪問效率

棧、堆、方法區和線程

棧是私有,堆和元空間是公有

棧也叫棧內存,是在線程創建時創建,用于管理該線程的局部變量、方法調用信息、操作數棧等。它的生命期是跟隨線程的生命期,線程結束棧內存也就釋放,對于棧來說不存在垃圾回收問題,只要線程一結束該棧就Over,這些棧在物理內存中是獨立的,互不干擾。8種基本類型的變量+對象的引用變量+實例方法都是在函數的棧內存中分配 。每一個棧對應一個線程,但是棧的數量實在太多了,導致jvm無法容納這么多的棧。虛擬機將拋出一個OutOfMemory 異常

每個線程在創建時都會分配一個獨立的棧,

存儲內容
  • 局部變量表:包含方法參數和局部變量。局部變量表的大小在編譯時確定。

  • 操作數棧:用于執行字節碼指令時存儲操作數和中間結果。

  • 棧幀:每個方法調用都會創建一個棧幀,棧幀包含局部變量表、操作數棧、動態鏈接和方法返回地址。

  • 動態鏈接:用于支持方法調用的動態鏈接。

  • 方法返回地址:方法返回時需要跳轉的地址。

棧的特性
  • 獨立性:每個線程都有一個獨立的棧,棧內數據不會與其他線程共享。

  • 內存大小:棧的大小可以通過 JVM 參數 -Xss 配置,通常在 512 KB 到 1 MB 之間。1.5以后默認1M.

  • 棧幀:每次方法調用都會創建一個新的棧幀,保存方法的局部變量、操作數棧、動態鏈接和返回地址。

  • 生命周期:棧的生命周期與線程相同,從線程創建到線程銷毀。

棧與請求
  1. 請求到達服務器

    • 當一個新的 HTTP 請求到達服務器時,服務器會從線程池中獲取一個可用線程(如果沒有可用線程,可能會阻塞或拒絕請求,視線程池配置而定)。

  2. 線程處理請求

    • 獲取到線程后,該線程會開始處理請求,包括解析請求頭、處理業務邏輯、訪問數據庫、生成響應等。

    • 在這個過程中,線程會使用它的棧來保存方法調用的信息、局部變量和中間計算結果。

  3. 請求處理完成

    • 當請求處理完成后,線程會生成 HTTP 響應并返回給客戶端。

    • 處理完成后,線程會返回到線程池中,等待下一個請求。

圖解數據創建

package test01;public class StackHeadMethod {public static void main(String[] args) {int a = 1;String b = "testBName";Test test = new Test();test.testMethod(a, b);}
}class Test {private int testA;private String testB;private static final int testC = 2;public void testMethod(int testA, String testB){this.testA = testA;this.testB = testB;}
}

?首先,JVM將StackHeadMethod.class、Test.class裝載到方法區(JVM會執行啟動類裝載器、擴展類裝載器和類路徑裝載器,在此只詳細講解針對本測試代碼的字節碼文件的執行)。其中方法區中的2是Test.java中的靜態變量,在類加載的時候就在方法區中的靜態存儲空間分配內存。

?然后,在StackHeadMethod.class文件中,找到main方法,開始執行main方法。將main方法在棧中開辟一個空間,稱為棧幀。執行下面07、08、09、17、18、19行代碼。?? 再然后,執行test.testMethod(a, b);這一行,在棧中新分配一個棧幀,調用test中的testMethod方法。

? 最后,testMethod方法執行完之后,testMethod棧幀從棧中釋放空間,然后main方法執行完之后,main棧幀也釋放空間,最后堆中的對象和方法區中的靜態變量、字符串和字節碼指令都沒被使用時,根據java虛擬機的垃圾回收機制,進行對垃圾的回收。
? ? 以上,是執行一段代碼,對內存進行開辟和釋放的整個過程。

------------------------------------------與正文內容無關------------------------------------
?如果覺的文章寫對各位讀者老爺們有幫助的話,麻煩點贊加關注唄!作者在這拜謝了!

混口飯吃了!如果你需要Java 、Python畢設、商務合作、技術交流、就業指導、技術支持度過試用期。請在關注私信我,本人看到一定馬上回復!

這是我全部文章所在目錄,看看是否有你需要的,如果遇到覺得不對地方請留言,看到后我會查閱進行改正。

A樂神-CSDN博客

關注在文章左上角,作者信息處。

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

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

相關文章

【機器學習系列】掌握隨機森林:從基礎原理到參數優化的全面指南

目錄 目錄 一、隨機森林簡介 (一)隨機森林模型的基本原理如下: (二)隨機森林模型的優點包括: (三)森林中的樹的生成規則如下: (四)在隨機森林中,每棵樹都使用不同的訓練集進行訓練,原因如下 隨機森林的分類性能&…

說說影響網絡的因素

1. 物理層面 帶寬 帶寬是指網絡傳輸數據的能力,帶寬越大,網絡能夠傳輸的數據量就越大。 信號強度和干擾 信號強度和干擾對無線網絡尤其重要。信號強度低或干擾嚴重會導致數據丟失、傳輸錯誤和重傳次數增加,從而降低網絡性能。 器件質量 路由…

點賦科技:建設智能飲品高地,打造數字化產業先鋒

在當今數字化時代的浪潮中,點賦科技以其敏銳的洞察力和卓越的創新能力,致力于建設智能飲品高地,打造數字化產業先鋒。 點賦深知智能飲品機對于推動社會進步和滿足人們日益增長的需求的重要性。因此,他們投入大量資源和精力&#x…

2020 6.s081——Lab1:Xv6 and Unix utilities夢開始的地方

一任宮長驍瘦 臺高冰淚難流 錦書送罷驀回首 無余歲可偷 ——知否知否 完整代碼見:6.s081/kernel at util SnowLegend-star/6.s081 (github.com) Lecture 01知識點總結 首先透徹理解Lecture01的知識很是重要 ①pidwait((int *) 0); “wait(int *status)”函數用于…

Python變量用法——單下劃線變量名_

單下劃線變量名_ 在常用的諸多變量中,單下劃線_是比較特殊的一個。它常作為一個無意義的占位符出現在賦值語句中。_這個名字本身沒有什么特別之處,這算是大家約定俗成的一種用法。 舉例,假如你想在解包賦值時忽略某些變量,就可以…

Day54 判斷子序列 + 不同的子序列

392 判斷子序列 題目鏈接:392. 判斷子序列 - 力扣(LeetCode) 給定字符串 s 和 t ,判斷 s 是否為 t 的子序列。 字符串的一個子序列是原始字符串刪除一些(也可以不刪除)字符而不改變剩余字符相對位置形成…

記一次服務器數據庫被攻擊勒索

如圖,早上一起來就發現,我的MongoDB數據庫里面的信息全部沒有了,只留下一段話。 大致意思就是:我的數據庫的數據被他們備份然后全部刪掉了,我必須要支付0.0059的bitcoin(折合400美刀)來贖回我的…

Springboot+WebSocket實現消息推送

WebSocket是一種在單個TCP連接上進行全雙工通信的協議。WebSocket通信協議于2011年被IETF定為標準RFC 6455,并由RFC7936補充規范。WebSocketAPI也被W3C定為標準。 WebSocket使得客戶端和服務器之間的數據交換變得更加簡單,允許服務端主動向客戶端推送數…

學習率調整

學習率調整 import mathdef adjust_learning_rate(optimizer, epoch, args):"""Decay the learning rate with half-cycle cosine after warmup"""if epoch < args.warmup_epochs:lr args.lr * epoch / args.warmup_epochs else:lr args.m…

不是,你不會還在用雙層遍歷循環來做新舊數組對比,尋找新增元素吧?

目錄 一、雙層循環遍歷 1.1、雙循環錯誤示范 1.2、正確的做法 ①使用array.includes() ②使用set 二、array.includes()的使用與技巧 2.1、基本語法 2.2、返回值 2.3、使用技巧 2.3.1、用戶輸入驗證 2.3.2、權限檢查 2.4、兼容問題 三、總結 一、雙層循環遍歷 1.…

【重學C語言】十七、預處理指令

【重學C語言】十七、預處理指令 預處理指令預定義宏`#define` 宏定義示例注意事項特殊符號條件編譯頭文件包含`#pragma`預處理指令 C語言中的預處理指令(Preprocessor Directives)是一種特殊的指令,它們在編譯過程的早期階段(即實際編譯之前)被預處理器(Preprocessor)處…

OpenCV學習 基礎圖像操作(十六):圖像距離變換

基礎原理 顧名思義&#xff0c;我們可以利用像素之間的距離作為對該像素的一種刻畫&#xff0c;并將其運用到相應的計算之中。然而&#xff0c;在一幅圖像之中&#xff0c;某種類型的像素并不是唯一的&#xff0c;因此我門常計算的是一類像素到另一類的最小距離&#xff0c;并…

My Spirit | “頂級復盤”

世界不會在意你的自尊&#xff0c; 人們看到的只是你的成就。 在你沒有成就之前&#xff0c; 切勿過分強調自尊。 ——菲茨杰拉德《了不起的蓋茨比》 目錄 My Spirit | “頂級復盤”00 | 日復盤01 | 周復盤2.1 周計劃2.2 周復盤2.3 下步計劃2.4 下步總結 02 | 月復盤2.1 本月目…

香橙派KunPengPro評測

一、引言 二、開箱 2.1、主要包含說明 1、充電器(贈typec-c線) 2、香橙派kunpengpro(已經帶裝好帶散熱器) 3、SD卡(32G)(已經帶裝好系統openEuler 22.03 (LTS-SP3)) (注意&#xff1a;上電接HDMI線可直接用&#xff0c;賬號&#xff1a;openEuler 密碼&#xff1a;openEuler)…

vue使用tailwindcss

安裝依賴 pnpm add -D tailwindcss postcss autoprefixer創建配置文件tailwind.config.js npx tailwindcss init在配置文件content中添加所有模板文件的路徑 /** type {import(tailwindcss).Config} */ export default {content: [./index.html, ./src/**/*.{vue,js,ts,jsx,…

【Linux】開發工具入門指南,輕松掌握你的開發利器

開發工具 1. 軟件包管理器yum1.1 軟件包安裝方式1.2 yum的"三板斧"1.3 yum的周邊 2. 開發工具3. 編輯器vim4. 編譯器gcc、g5. 項目自動化構建工具make、Makefile6. 進度條小程序7. 調試器gdb 1. 軟件包管理器yum 1.1 軟件包安裝方式 源代碼安裝&#xff1a;用戶手動…

微信小程序 npm構建+vant-weaap安裝

微信小程序&#xff1a;工具-npm構建 報錯 解決&#xff1a; 1、新建miniprogram文件后&#xff0c;直接進入到miniprogram目錄&#xff0c;再次執行下面兩個命令&#xff0c;然后再構建npm成功 npm init -y npm install express&#xff08;Node js后端Express開發&#xff…

智慧校園的機遇與挑戰

隨著5G、物聯網、大數據等技能的日漸老練&#xff0c;數字化正在滲透到各行各業中&#xff0c;為事務立異和價值增加供給支撐。在教育職業&#xff0c;運用智能化體系賦能教育辦理越來越受歡迎&#xff0c;教育信息化方針一再出臺&#xff0c;進一步加快了智慧校園落地的腳步。…

Linux - 文件管理高級 sed

3.處理字符 sed ① sed 默認情況下不會修改原文件內容 ② sed 是一種非交互式的編輯器 3.1 工作原理 將原文件一行一行的進行處理&#xff0c;取出一行&#xff0c;放入“模式空間進行處理”&#xff0c;處理完成之后將結果輸出到屏幕上&#xff0c;然后讀取下一行&#xf…

彭濤 | 2024年5月小結

5月份還是蠻有刺激的&#xff0c;做了蠻多的事情&#xff0c;但是沒賺到錢&#xff0c;真是一屯操作猛如虎&#xff0c;一看賬戶0.5。 就喜歡創業這種一天天累死累活還不賺錢的感覺&#xff0c;哈哈哈哈 老規矩簡單說下這個月的情況&#xff0c;如果對你有收獲就最好了。 游學丹…