最近看新聞報道,很多都是關於國外動盪局勢的報道,尤其是看到裡面關於戰爭之後的受害者的照片,就會感到既難受又慶幸,難受的是剛剛出生的孩子就失去了父母,他以後的人生該是多麼的艱難,還有滿頭白髮的老人看著自己的孩子永遠的離開自己,白髮人送黑髮人的痛,做父母的人都能想象到。
每當看到這樣的新聞,我想每個人都會傷心,也正因為這樣,所以才更加的慶幸我們的祖國是多麼的偉大,可以想象,如果沒有好的領導人的決策,沒有強大的力量支撐保護,我們哪裡會有今天的幸福安康,感謝祖國吧!是祖國的強大讓我 們遠離了戰爭,讓我們能夠坐在電腦桌前安靜的工作學習,
加油啊,為了祖國的更加強大,我們還需要努力奮鬥,努力學習,讓少年更強,祖國更強!
言歸正傳,我今天給大家分享的是關於java裡面的一個重要的知識點-JVM,大家可以學習一下。
一、概念與特點:
JVM 是用於識別。class ,jar等位元組碼檔案,將位元組碼翻譯成作業系統可以識別的機器碼的虛擬機器,主要充當的是翻譯的工作。
特點:跨平臺,跨語言的。
JRE:提供了我們開發所需要的基礎類庫,也就是允許所需要的基本類庫
JDK:提供了一套工具集(如javac ,javap,javah ,javaw等工具)
二、JVM載入位元組碼檔案的執行過程:
1、執行時資料區
執行時資料區主要包括一下內容:方法區、堆、虛擬機器棧,本地方法棧、程式計數器 五部分的內容
1.1 程式計數器
由於作業系統的時間片輪轉機制,程式執行緒會在執行過程中進行切換輪流執行,這時候程式計數器就是儲存位元組碼在程式執行緒執行執行的偏移量地址(也就是在位元組碼檔案簽名的序號)
說白了,就是在作業系統切換執行緒執行時,儲存當前執行緒執行的位置,方便下次恢復執行時可以繼續執行
程式計數器是唯一不會發生OOM的記憶體區。
1.2 虛擬機器棧
儲存當前執行緒執行方法所需要的資料,指令,返回地址等資訊。虛擬機器棧大約是1M大小。
執行順序:先進後出
虛擬機器棧就像是一個子彈夾,而執行緒的方法就像是每一顆子彈,在執行過程中不停的進棧出棧,完成方法的執行。
一個方法就是一個棧幀。
棧幀包含如下內容:
A、區域性變量表:主要存放基礎資料型別
B、運算元棧:存放方式的執行,程式碼的執行, java的解釋執行就是基於運算元棧的
C、動態連結:主要是多型的支援,動態靜態分派
D、完成出口:正常返回程式計數器中的地址
1.3 本地方法棧:
用於儲存C/C++實現的本地native的方法
1.4 方法區
(元空間)
主要儲存類的資訊,常量,靜態變數,編譯期編譯生成的程式碼,該區域比較難回收。
1.5 堆
用於存放java的物件例項,陣列等內容,該區域的物件回被頻繁的回收
2、 直接記憶體:
不是虛擬機器執行時資料區的一部分,也不是java虛擬機器規範中定義的記憶體區域,NIO會使用直接記憶體,不受java堆大小的限制
3、執行時記憶體關係圖:
執行方法的記憶體關係圖。png
三、JVM允許Java類的記憶體步驟:
1)申請記憶體
2)類載入——-將。class放入到方法區
3)將常量,靜態變數放入方法區
4)虛擬機器棧:將方法加入棧幀,將new出來的物件引用加入到區域性變量表中
5)入堆:將new出來的物件加入到堆中
四、記憶體溢位的場景分析:
常見的出現記憶體溢位的場景有:
1)棧溢位:
例如方法只入棧,不出棧,類似一個永久遞迴,就會導致棧溢位
2)堆溢位:
申請記憶體時,沒有需要大小的記憶體可用時,會發生堆溢位
3)方法區溢位
4)本地直接記憶體溢位
五、虛擬機器最佳化技術:
針對記憶體溢位的場景,下面有兩種比較常見的虛擬機器最佳化技術:
1)方法內聯:
減少內聯方法的入棧,減少棧幀(簡單的方法減少呼叫)
2)棧幀之間資料共享:
上一個棧幀的區域性變量表與下一個棧幀的運算元棧質檢的資料共享,(透過引數傳遞來共享)。
六、堆和棧辨析:
1)棧:
存放方法的呼叫過程
儲存基本資料型別、物件的引用變數、變數除了作用域會自動釋放
棧記憶體屬於單個執行緒,每個執行緒都有一個棧記憶體,棧記憶體可以理解成是執行緒的私有記憶體
棧記憶體大小小於堆記憶體,可能發生棧溢位問題
2) 堆:
存放java中的物件,無論是成員變數、區域性變數,類變數,他們指向的物件都儲存在對記憶體中
堆記憶體中的物件對所有的執行緒都是可見的,可以被所有執行緒進行訪問。
關於JVM記憶體管理的一些知識點就先介紹到這裡,大家應該結合其他資料,影片教程或者書本資料繼續深入的學習一下!
真心向您推薦:專為零基礎初學者而著,總播放量超億的java教程
關於JVM記憶體管理的一些知識點就先介紹到這裡,大家應該結合其他資料,影片教程或者書本資料繼續深入的學習一下!