本文在終於搞懂了java8的記憶體結構,再也不糾結方法區和常量池了!_java8堆中存放靜態變數和字串常量池嗎-CSDN部落格基礎上加入了一些個人思考,原文寫得就很通俗易懂,推薦
Java記憶體
Java程式在執行過程中使用的記憶體可以分成虛擬記憶體和本地記憶體兩大類。
虛擬記憶體
虛擬記憶體,就是指JVM自己管理的記憶體區域,包含執行java程式所需要的各種資料結構和執行環境。
主要包括:方法區、堆、棧、程式計數器、本地方法棧。
我們可以用個例子簡單理解這五大區域的含義:
如果把JVM記憶體比作一個巨大的遊樂場,在這個遊樂場中有五大區域,每個區域有自己特定的功能:
1.程式計數器:遊樂場裡的指南針,指示玩家(執行緒)正在玩什麼(當前執行的位元組碼指令)。
2.虛擬機器棧:遊樂場裡的桌臺,比如給娃娃塗色,每個玩家(執行緒)都有自己的桌臺,每當玩家要做某個動作時(方法呼叫),就會在桌臺上放一些需要的工具(方法的區域性變數、運算元棧等)。
3.本地方法棧:有時候玩家可能需要用到一些特別的工具(本地方法),這些工具並不是在遊樂場中提供的(非java語言),本地方法棧就是存放這些特別工具的地方。
4.堆:這是遊樂場最大的區域,有各種各樣的玩具(物件),所有的玩家(執行緒)都會在這裡建立和使用這些玩具。
5.方法區:類似於遊樂場裡的資訊板,存放類的資訊、常量、靜態變數等,每當玩家(執行緒)玩一個新遊戲(類)時,資訊板上就會記錄這個新遊戲的資訊(類的資訊)。
本地記憶體
本地記憶體,就是JVM之外的記憶體,由作業系統直接管理,java程式可以透過特定的機制和介面訪問和使用本地記憶體。
執行緒的角度看Java記憶體
透過上面的例子,可以發現使用Java記憶體的都執行緒,那麼就有執行緒私有和執行緒共享兩種分類。
- 執行緒私有
- 程式計數器:每個執行緒都有自己的程式計數器。程式計數器相對於一個標誌,用來告訴執行緒執行到哪裡了,從而實現多執行緒輪換切換。
- 虛擬機器棧:每執行一個Java方法,就會在虛擬機器棧中建立一個棧幀,執行完後出棧。
- 本地方法棧:類似於虛擬機器棧,不過是每執行一個非Java方法就會在本地方法棧中建立棧幀,執行完後出棧。
- 執行緒共享:
- 堆:這裡主要存放物件例項、字串常量池、靜態變數、執行緒分配緩衝區,所有的執行緒都可以使用。
- 方法區:這裡主要存放類元資訊(類的基本資訊等)、執行時常量池。