JVM內存模型知識點總結
內存模型如下圖所示
堆
堆是Java虛擬機所管理的內存最大一塊。堆是所有線程共享的一塊內存區(qū)域,在虛擬機啟動時創(chuàng)建。此內存區(qū)域唯一的目的就是存放對象實例。所有的對象實例都在這里分配內存
Java堆是垃圾收集器管理的主要區(qū)域。從內存回收的角度來看,由于現(xiàn)在的垃圾收集器采用的是分代收集算法。所以,java堆又分為新生代和老年代。從內存分配的角度來說,線程共享的java對中可能劃分出多個線程私有的fenp緩沖區(qū)(Thread Local Allocation Buffer)。
可以通過 -Xms、-Xmx分別控制堆初始化是最小堆內存和最大堆內存大小。
虛擬機棧
與程序計數(shù)器一樣,java虛擬機棧也是線程私有的,他的生命周期與線程相同。
虛擬機棧描述的是Java方法的執(zhí)行的內存模型:每個方法在執(zhí)行的同時會創(chuàng)建一個棧楨(stack frame)用于存儲局部變量表、操作數(shù)棧、動態(tài)鏈表、方法出口等信息。每個方法從調用直至執(zhí)行完成的過程,就對應著棧楨在虛擬機棧中入棧到出棧的過程。
虛擬機棧存儲的數(shù)據(jù)類型 局部變量表
存放的是編譯器可知得到各種基本數(shù)據(jù)類型
boolean、byte、char、short、int、float、long、double、對象引用(refrence類型,不等同于對象本身,一個指向對象的起始內存位置的引用指針) 操作數(shù)棧動態(tài)鏈表方法出口
常見異常在虛擬機規(guī)范中,對這個區(qū)域規(guī)定了兩種異常情況: 如果線程請求的棧深度大于虛擬機所允許的深度,將拋出StackOverflowError
如果虛擬機??梢詣討B(tài)擴展,擴展時無法申請做夠的內存,將會爬出OutOfMemorryError
本地方法棧
與虛擬機棧發(fā)揮的作用非常類似,他們之間的區(qū)別是虛擬機棧為虛擬機執(zhí)行java方法服務,而本地方法棧則為虛擬機使用到的native方法服務。與虛擬機棧一樣,本地房發(fā)展區(qū)域也會拋出StackOverflowError,OutOfMemorryError異常。
方法區(qū)(1.8后該區(qū)域被廢棄)
方法區(qū)與java堆一樣,是各個線程所共享的,它用來存儲已被虛擬機加載的類信息、常量、靜態(tài)變量、即時編譯后的代碼等數(shù)據(jù)。
方法區(qū)是jvm提出的規(guī)范,而永久代就是方法區(qū)的具體實現(xiàn)。
java虛擬機對方法區(qū)的限制非常寬松,可以像堆一樣不需要連續(xù)的內存可可選擇的固定大小外,還可以選擇不識閑垃圾收集,相對而言,垃圾收集行為在這邊區(qū)域是比較少出現(xiàn)的。
在方法區(qū)會報出 永久代內存溢出的錯誤。而java1.8為了解決這個問題,就提出了meta space(元空間)的概念,就是為了解決永久代內存溢出的情況,一般來說,在不指定 meta space大小的情況下,虛擬機方法區(qū)內存大小就是宿主主機的內存大小
程序計數(shù)器
程序計數(shù)器是一塊較小的內存空間,他可以看做是當前線程所執(zhí)行字節(jié)碼的行號指示器。在虛擬機的概念模型里,字節(jié)碼解釋器工作時就是通過改變這個計數(shù)器的值來選擇下一條將要執(zhí)行的字節(jié)碼指令。
由于JAVA虛擬機的多線程是通過多線程流轉切換并分配處理器執(zhí)行時間的方式來實現(xiàn)的。在任一一個確定的時刻,一個處理器都只會執(zhí)行一條線程中的指令。因此,為了線程切換后能恢復到正確的執(zhí)行位置,每條線程都需要一個獨立的程序計數(shù)器,各個線程的計數(shù)器之間互不影響,獨立存儲,我們稱該類內存區(qū)域為線程私有
如果線程正在執(zhí)行一個Java方法,這個計數(shù)器記錄的是正在執(zhí)行的虛擬機字節(jié)碼指令的地址。
運行時常量池
運行時常量池是方法區(qū)的一部分。Class文件除了 有類的版本、字段、方法、接口等描述信息外,還有一項是常量池,用于存放編譯期生成的各種字面量和符號引用,這部分內容在類加載后進入方法區(qū)的運行時常量池。
運行時常量池相對于Class文件常量池的另外一個重要特征是具備動態(tài)性.Java語言并不要求常量一定只有在編譯器才能產(chǎn)生,依舊是并非預置入Class文件中的常量池的內容才能進入方法區(qū)運行時常量池
以上就是關于學習JVM內存模型的知識點內容總結,感謝大家對腳本之家的支持。
相關文章
SpringBoot集成SpringSecurity安全框架方式
這篇文章主要介紹了SpringBoot集成SpringSecurity安全框架方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05SpringBoot整合Lucene實現(xiàn)全文檢索的詳細步驟
全文搜索(Full-Text?Search)是指對大規(guī)模存儲在計算機系統(tǒng)中的文本數(shù)據(jù)進行檢索和匹配的技術,它允許用戶輸入關鍵字,然后從海量的文本數(shù)據(jù)中快速找到相關的信息,本文介紹了SpringBoot整合Lucene實現(xiàn)全文檢索的詳細步驟,需要的朋友可以參考下2024-03-03Java使用反射和動態(tài)代理實現(xiàn)一個View注解綁定庫
這篇文章主要介紹了Java使用反射和動態(tài)代理實現(xiàn)一個View注解綁定庫,代碼簡潔,使用簡單,擴展性強,結合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2022-05-05如何在?Spring?Boot?中使用?OpenAI?ChatGPT?API
這篇文章主要介紹了如何在Spring?Boot中使用OpenAI?ChatGPT?API,我們探索了 OpenAI ChatGPT API 以生成對提示的響應,我們創(chuàng)建了一個 Spring Boot 應用程序,它調用 API 來生成對提示的響應,需要的朋友可以參考下2023-08-08Java大數(shù)據(jù)處理的核心技術MapReduce框架
MapReduce是一種分布式計算框架,適用于大規(guī)模的數(shù)據(jù)處理。它將大數(shù)據(jù)分成多個小數(shù)據(jù)塊,通過Map和Reduce兩個階段對數(shù)據(jù)進行處理和分析。MapReduce框架具有可靠、高效、可擴展等特點,已經(jīng)成為大數(shù)據(jù)處理的核心技術2023-05-05使用Mybatis Generator結合Ant腳本快速自動生成Model、Mapper等文件的方法
這篇文章主要介紹了使用Mybatis Generator結合Ant腳本快速自動生成Model、Mapper等文件的方法的相關資料,需要的朋友可以參考下2016-06-06