天天看點

【每日面試】Java關于記憶體的面試問題(3)

Java的記憶體模型和記憶體區域不是一個概念,這在之前沒有研究過,很多面試題問到記憶體的東西,也是以JVM為主,果然學無止境啊~因為關于記憶體模型的資料沒找到多少,是以這次就不深入這個方向了。準備以JVM為核心去研究各個記憶體區域的作用,再結合面試題去完善知識架構,最後比較難搞的就是JVM調優了,還沒想好怎麼學習,有建議的歡迎留言。

【每日面試】Java關于記憶體的面試問題(3)

1.

先明确Java記憶體模型和記憶體區域的差別。

1)Java記憶體模型(JMM)

啥是模型?如果說手辦可能大部分人一下就明白了,那模型看起來就是具現化的東西。模型有啥用呢?比如一個火箭模型,簡單的可以讓人知道火箭是什麼樣的,精細的可以讓人了解到火箭的結構,對學習相關知識有幫助。那這樣去想,Java的記憶體模型可能就是對Java在如何使用記憶體時的一個具象化展現,展現了相關元件的聯系。有的說是定義了線程和主記憶體之間的抽象關系,能夠幫助學習Java并發程式設計。這樣的話可以了解為:

研究Java記憶體模型可以幫助學習Java并發程式設計。等研究這一塊内容的時候,再聯系起來看看。

2)Java記憶體區域(JVM)

相比之下記憶體區域就好了解多了。區域就是指一塊地方,那Java記憶體區域就是Java程式運作時使用的區域,這一塊統稱為JVM。因為程式員主要是跟代碼打交道,是以關于JVM的内容更貼切一些,是以才會問的這麼頻繁。如果有一天JVM調優成為一項必會技能,大家估計就不會覺得有多奇怪了。還有個思考是,有沒有一種可能,根據程式的不同狀态,自動調整JVM參數以達到優化的效果,如果這樣的工具有了,那JVM優化就簡單多了。

【每日面試】Java關于記憶體的面試問題(3)

2.

關于JVM記憶體區域,先看看到底劃分為幾個區域,這裡有一點需要注意,在JDK8之後的記憶體區域劃分跟之前的劃分不同了,新增中繼資料區的概念,放兩張對比圖:

JDK8之前

【每日面試】Java關于記憶體的面試問題(3)

JDK8之後

【每日面試】Java關于記憶體的面試問題(3)

JDK版本現在更新的很快,大部分項目都在用JDK8,是以之前的就不研究了。技術發展很快,是以學習的時候會産生滞後現象,對于一些理論性知識,通過學習理論思想,隻要技術不發生本質的改變,那就沒有太大的影響。但是,對于實戰性的知識,就一定要看穩定的方式和最新的方式,學會一種,再融會貫通其它的。

【每日面試】Java關于記憶體的面試問題(3)

3.

從上圖可以看出,現在的記憶體區域有:

1)本地方法棧

2)程式計數器

3)虛拟機棧

4)堆區域

5)中繼資料區

像常問到的方法區、常量池這些概念都歸并到中繼資料區中了,這塊也是相較于之前新的内容,是以在這塊要重點研究一下。

下一章開始逐一分析每個記憶體區域的作用。

【每日面試】Java關于記憶體的面試問題(3)

梳理完這些,有一個疑問:JVM使用哪塊系統記憶體?既然是記憶體區域的劃分,那不管怎麼劃分,展現在系統層面,肯定要選擇一塊記憶體區域來使用的,那是怎麼選擇的呢?沒搞明白啊~~