跟我一起學JVM(一)——Java虛擬機的內存結構

Java編程語言的特性就是兼容各種平臺,這也是Java得到不斷髮展的重要因素之一。有沒有人想過爲什麼會兼容呢?

在一開始接觸Java的時候我們就需要安裝Java virtual machine(JVM)以及JDK,平臺兼容性的核心技術就在於JVM,因爲Java程序是運行在JVM上,與操作系統之間的協調通信都是由JVM幫着完成的,所以只要由JVM的地方就能運行Java。

趁着假期打算出一個對於Java虛擬機知識點以及調優的專題(看完性能今天終於開始擼JVM了!!!)。JVM的很多數據都是默認配置好的,但是當我們真的在開發過程中,隨着用戶增多,系統壓力增大,總會遇到一些OOM(out of memory)StackOverFlow,內存泄漏等線上問題,對於JVM的瞭解有助於我們診斷問題並作出相應的措施解決問題。

老規矩,先來一幅腦圖理清學習的思路
在這裏插入圖片描述
本文主要聚焦於自動內存管理中虛擬機內存劃分模塊,後面的將隨着我們學習的深入一點點進行完善。

Java虛擬機內存有幾個部分組成
1.程序計數器
2.虛擬機棧
3.本地方法棧
4.方法區
5.Java堆

程序計數器其實就是一個指向內存的指針,用來取字節碼的指令,相當於程序運行過程中的指南針。學過計算機組成與設計的同學知道程序指針PC就是指向存放指令的地方,使得程序按照指令規定的順序進行執行,不然一堆jump跳轉,branch分支指令肯定會讓程序迷失方向,不知道自己運行到什麼地方了。Java虛擬機內的程序計數器一個道理,它是線程私有的,每條獨立線程都對應一個程序計數器,這樣線程運行的時候纔不會迷路。

虛擬機棧也是線程私有的,這也就意味着和程序計數器一樣,生命週期與該線程的生命週期一樣。如果該線程結束了,那麼該線程對應的一切虛擬資源都將不復存在。虛擬機棧的作用就是存儲該線程程序中局部變量表,操作數棧,方法的出口等信息。說白了就是用來存放程序在執行Java方法時所需存儲的信息

本地方法棧,顧名思義就是用來存儲執行本地方法時候需要存的信息的地方,因爲Java的底層方法很多是用C/C++寫的,也就牽扯到對於本機操作系統相關方法的調用,Java中的native關鍵字就是用來描述本地方法的。本地方法的源代碼可以參照openJDK。

Java堆是JVM內存劃分中比較重要的一環,因爲它是內存劃分中佔空間最大的一塊,也是被所有線程共享的區域。它的作用就是用來存放Java對象實例(在JVM老版本中,Java堆只用來存放Java對象,隨着編譯器優化,現在並不是所有的對象都在Java堆中創建了,但大部分對象依舊是存在於堆中的)

Java堆空間又被分爲幾個部分,大的方面可以分爲兩部分,分別是新生代(young)和老年代(old)(其實就是根據對象存在的時間長度來判斷),往細緻方面進一步區分的話,新生代又分爲Eden(伊甸園), From Survivor, To Survivor,所以一個對象從Eden區域誕生,要進入到old需要經過所謂的“層層篩選”,從Eden到From Survivor,再到To Survivor,如果依舊存活才能進入old。能不能成爲“天選之人”就看程序員爲這個對象賦予了什麼樣的地位了,畢竟垃圾回收程序就像機器人一樣到處巡視,如果有對象不被使用,那就要被清除,並釋放所佔用的內存空間供給其他對象使用,對象中只有真正的“強者”才能升級到old區域不被清除。Java堆就和操作系統中的虛擬內存一樣,物理地址上可以不連續,只要邏輯上正確即可。

最後一塊就是方法區了,它也是線程共享的內存區域,經常用來存儲類的信息,常量,靜態變量等,因爲方法區主要存儲的是類的一些基本信息,而不是對象,所以此處的垃圾回收(可以理解爲內存空間回收)比較少見。大量的回收則是發生在Java堆空間。爲了提高效率,方法區習慣性在程序運行的過程中加載程序所需常量信息,所以方法區中有一塊區域爲“運行時常量池”(存放常量的地方)。

今天的分享主要是剖析Java虛擬機的內存組成,腦圖的其他部分將在後面幾次分享中逐步完善,如果有不妥之處也希望大家指出,歡迎交流:)喜歡的別忘了三連,謝謝~


Instagram: https://www.instagram.com/barrywzc/
Twitter: https://twitter.com/BarryWa34098316
Bilibili: https://space.bilibili.com/473161964
GitHub: https://github.com/wzcwzcwzc
Patreon: https://www.patreon.com/wzcspace
微信公衆號: wzcspace


Please leave a LIKE and SUBSCRIBE for more content!
在這裏插入圖片描述

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