JVM內存模型知識點總結

在本篇文章裏小編給大家分享了關於JVM內存模型的學習心得以及相關知識點總結,有興趣的朋友們跟着學習下。

內存模型如下圖所示

堆是Java虛擬機所管理的內存最大一塊。堆是所有線程共享的一塊內存區域,在虛擬機啓動時創建。此內存區域唯一的目的就是存放對象實例。所有的對象實例都在這裏分配內存

Java堆是垃圾收集器管理的主要區域。從內存回收的角度來看,由於現在的垃圾收集器採用的是分代收集算法。所以,java堆又分爲新生代和老年代。從內存分配的角度來說,線程共享的java對中可能劃分出多個線程私有的fenp緩衝區(Thread Local Allocation Buffer)。

可以通過 -Xms、-Xmx分別控制堆初始化是最小堆內存和最大堆內存大小。

虛擬機棧

與程序計數器一樣,java虛擬機棧也是線程私有的,他的生命週期與線程相同。

虛擬機棧描述的是Java方法的執行的內存模型:每個方法在執行的同時會創建一個棧楨(stack frame)用於存儲局部變量表、操作數棧、動態鏈表、方法出口等信息。每個方法從調用直至執行完成的過程,就對應着棧楨在虛擬機棧中入棧到出棧的過程。

虛擬機棧存儲的數據類型 局部變量表

存放的是編譯器可知得到各種基本數據類型

boolean、byte、char、short、int、float、long、double、對象引用(refrence類型,不等同於對象本身,一個指向對象的起始內存位置的引用指針) 操作數棧動態鏈表方法出口

常見異常在虛擬機規範中,對這個區域規定了兩種異常情況: 如果線程請求的棧深度大於虛擬機所允許的深度,將拋出StackOverflowError

如果虛擬機棧可以動態擴展,擴展時無法申請做夠的內存,將會爬出OutOfMemorryError

本地方法棧

與虛擬機棧發揮的作用非常類似,他們之間的區別是虛擬機棧爲虛擬機執行java方法服務,而本地方法棧則爲虛擬機使用到的native方法服務。與虛擬機棧一樣,本地房發展區域也會拋出StackOverflowError,OutOfMemorryError異常。

方法區(1.8後該區域被廢棄)

方法區與java堆一樣,是各個線程所共享的,它用來存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯後的代碼等數據。

方法區是jvm提出的規範,而永久代就是方法區的具體實現。

java虛擬機對方法區的限制非常寬鬆,可以像堆一樣不需要連續的內存可可選擇的固定大小外,還可以選擇不識閒垃圾收集,相對而言,垃圾收集行爲在這邊區域是比較少出現的。

在方法區會報出 永久代內存溢出的錯誤。而java1.8爲了解決這個問題,就提出了meta space(元空間)的概念,就是爲了解決永久代內存溢出的情況,一般來說,在不指定 meta space大小的情況下,虛擬機方法區內存大小就是宿主主機的內存大小

程序計數器

程序計數器是一塊較小的內存空間,他可以看做是當前線程所執行字節碼的行號指示器。在虛擬機的概念模型裏,字節碼解釋器工作時就是通過改變這個計數器的值來選擇下一條將要執行的字節碼指令。

由於JAVA虛擬機的多線程是通過多線程流轉切換並分配處理器執行時間的方式來實現的。在任一一個確定的時刻,一個處理器都只會執行一條線程中的指令。因此,爲了線程切換後能恢復到正確的執行位置,每條線程都需要一個獨立的程序計數器,各個線程的計數器之間互不影響,獨立存儲,我們稱該類內存區域爲線程私有

如果線程正在執行一個Java方法,這個計數器記錄的是正在執行的虛擬機字節碼指令的地址。

運行時常量池

運行時常量池是方法區的一部分。Class文件除了 有類的版本、字段、方法、接口等描述信息外,還有一項是常量池,用於存放編譯期生成的各種字面量和符號引用,這部分內容在類加載後進入方法區的運行時常量池。

運行時常量池相對於Class文件常量池的另外一個重要特徵是具備動態性.Java語言並不要求常量一定只有在編譯器才能產生,依舊是並非預置入Class文件中的常量池的內容才能進入方法區運行時常量池

以上就是關於學習JVM內存模型的知識點內容總結,感謝大家對神馬文庫的支持。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章