前言
隔離第三天開始變得煩躁,明白了狗子的那顆想要出去撒歡的心。
雖然想出去,但是那顆愛學習的心不能斷,所以還是要繼續寫我都博客。
我想對社區阿姨說,我體溫一直36度,真的沒病,讓我出去看看這個世界吧!!!
好了,言歸正傳。
昨天說到了線程的問題,線程中的synchronized關鍵字是基於JVM層面實現的,所以今天就來說說JVM,
JVM是幹嘛的呢,請看下圖,
圖片來自百度百科。(沒什麼事情是百度解決不了的,如果有那就google)!
我最煩惱的就是理解這些概念,所以說下我的理解。
我所理解的JVM,一句話概括就是:將我們所寫的代碼解析成機器可以識別的語言
。
如果沒有JVM,那我們想要執行一段java代碼,我們交給機器執行,
我:hey,man,給我輸出一段Hello world
機器:一臉懵逼,what are you talking about?
你看你說的機器聽不懂,機器說的你也看不懂,這就尷尬了!
再舉個例子來說,比如我們跟老外聊天(不懂中文的老外哈)
我說:嘿!你是煞筆!
老外說:Oh,Young man,you are my brother!
你看我們說的他根本不懂,他還以爲我說的是好話呢,但是呢,此時如果有一款翻譯軟件呢,比如谷歌翻譯,於是對話就變成了:
我:hey,you are foolish.
老外:Don't talk to me like that!然後一個沙包大的拳頭招呼過來!
你看有了谷歌翻譯我們說的話老外就全部能聽懂了,最後還給了我們一個拳頭的迴應。所以呢JVM就扮演着谷歌翻譯的角色,幫我們翻譯我們的代碼給機器。
有了JVM我們執行一段hello world,JVM給我們翻譯好交給機器,機器收到了,給我們輸出hello world,你看這不就完美了。
但是問題又來了,我們都在用JVM,然後呢我想輸出hello world,你想輸出hello china,結果呢卻給我輸出hello china,這不就扯犢子了,跟我們想要的結果不一樣啊,
所以呢JVM對於數據的存儲要是有一定的規則的,比如我們輸出hello world交給jvm,然後呢jvm給我們一個密碼,說這是到時候取數據的,然後我們取數據的時候輸入這個密碼,好了我們想要的hello world就出來了,數據也不會錯了!所以這就要說到JVM的內存模型。
那JVM的內存模型怎麼解釋呢,這個我很來勁,其實吧,我理解的JVM模型其實就是我們住的兩室一廳一廚一衛的房子,不信看我怎麼給你解釋。
- 先說咱們的客廳,客廳是進來房子人人都能進的對吧,然後還是一片空間共享的區域,進來的人跟房子主人聊完天交流完信息,然後就被房子主人趕出去了,所以這是不是就是jvm中的堆。一樣的線程共享,一樣的進來和出去。
- 再說我們的衛生間,衛生間需要人人都能進的對吧,不然人家想上廁所你不讓人家上,那人家不打人啊。所以這個衛生間是不是可以比喻成JVM中的方法區,也是一樣的線程共享。
- 再來說廚房,廚房是人家房子的主人管的,人家想讓誰進就讓誰進,人家房子的主人說了算,再說了廚房就那麼大點地方,人人都往裏擠還不爆了啊,所以這個廚房是不是就是JVM中的虛擬機棧。
- 再來說主臥,這主臥是人家房子的主人的,一個外人不能隨便進去住吧,不然房子的主人不直接轟走你啊,所以主臥是不是就是本地方法棧呢。
- 最後說次臥,次臥更簡單了,房子的主人想讓誰進去住就進去住,人家說的算,你硬闖人家直接讓你滾呢。所以這是不是就是JVM的程序計數器呢。
最後誰是房子的主人呢,當然是JVM本身了。
所以我嚴重懷疑jvm的作者是不是當初就住在一個兩室一廳一廚一衛的房子裏開發的JVM,想到了這個模型(哈哈哈哈哈,此處純屬YY)
更好玩的來了!
那就是JVM中的GC,你看哈,如果一羣人進入房子,然後在客廳了聊天、打牌、吃飯…,
然後房子的主人說好了好了,你們的消息我都知道了,趕緊滾趕緊滾,然後一羣人就被請出去了,
然後又進來一羣人…以此往復是不是就是GC的過程.
創建對象和清理對象是不是就是進入房子和出去房子的人的過程。而GC就是清理的在這個房子的客廳裏沒有消息價值的人
但是你又跟我擡槓了
說方法的執行怎麼解釋?
這個更簡單啊,你看JVM中的方法的執行實在虛擬機棧中,而虛擬機棧對應的廚房,那方法的執行不就是在廚房做飯的過程
,方法中的變量以及各種信息不就是做的菜嗎,吃完了不就沒有了嗎。
所以啊,面試的時候遇到面試官讓你回答JVM的內存模型就想想自己的房子,就知道各個區域存放什麼了。