天天看點

JVM的記憶體結構,簡單說一下為什麼要知道JMM(開篇)

JVM的記憶體結構,簡單說一下JMM

我們為什麼要學習jmm呢?這其實是一種追本溯源的過程,對于開發人員來說,需要很清晰的控制每個對象的出生到毀滅,并且需要控制每一個對象的歸屬,而不是随波逐流。這尤其是C的開發人員。但是對于Java程式員來說,在虛拟機自動記憶體管理機制的幫助下。我們放寬了很多心,我們類似将整個項目的對象的構造,回收都托管給了第三方,也就是Java虛拟機記憶體管理模型。

如此一來,我們就不需要花重心去打理記憶體的使用,但是Jvm虛拟機記憶體模型并不是永遠不會發生錯誤,也會有記憶體溢出的情況,那麼在這個時候我們就手足無措了,因為我們對其不關心,認為他是一個助手,當助手出了問題,不會輪到我這個被輔助的人去幫助他。

就好比,我隻是一個炒菜的廚師,如果有一天,瓦斯罐沒氣了,我就一點原因都不清楚?隻會傻等着換瓦斯的師父來幫我檢查問題嗎?各司其職沒問題,但是作為一個進階廚師,我們應當有這種覺悟,我們不屑于隻做表面的功夫,我們會炒菜,也應該了解火候,而不是隻會颠勺。

那麼回到正題,如果jvm層面出了問題,那作為一名合格的Java開發人員,我們應當需要知道他的來龍去脈,以及問題産生,及方案解決。

Java記憶體模型都應該有所了解,那就貼張重繪圖檔吧

對于啟動各個區域,都會有不同的用途,并且每個區域中的對象資料都有着不同的生命周期。

JVM的記憶體結構,簡單說一下為什麼要知道JMM(開篇)

基本上司空見慣的圖檔,從上述圖檔記憶體結構分層來說,我們可以分為三個層:加載、運作資料、執行。當然還有比較細的劃分。本質上來說,jmm其實并不存在,隻是jvm将其記憶體抽象為類似的結構模型,對于我們程式員來說,更利于了解,知道他到底做了什麼。

那麼我們對這張圖檔進行細粒度的再精細一下,例如:其中的類加載子系統中到底有哪些組成?其中的執行引擎有分為哪幾部分呢?還有更關心的,我們的運作資料區中的劃分,堆中又分為哪些部分?

按照網絡上的圖檔結果,我再重繪一下一張圖檔:

JVM的記憶體結構,簡單說一下為什麼要知道JMM(開篇)

圖檔呢,都是網絡上大佬分析出來的,然後小弟我也進行了一個重繪,便于了解

當然,在深入了解JVM虛拟機這本書中也有相應的圖檔,我此處也粘一下

JVM的記憶體結構,簡單說一下為什麼要知道JMM(開篇)

此書也是将運作時資料區劃分為類似的5塊區域,并且告訴了我們:

所有線程共享的區域有:“方法區”,通常存放常量,類中繼資料等資料;還有“堆”空間,就是對象的存儲空間。

然後,線程間互相隔離的資料區域是:“虛拟機棧”:棧空間記憶體;“本地方法棧”:本地方法空間記憶體;“程式計數器”:方法的後置方法,傳回資訊等配置。

這篇文章就到這,隻是簡單分享一下我們為何需要了解JMM,他有哪些内容,然後和大家分享幾張圖檔,後面我們分别對其進行分析分享。