吹毛:“吹毛光”面試JVM棧和堆為啥分開?如果你是java創始人你怎辦

hi,大家好,我是"吹毛",本人現在新出了一個系列叫做"吹毛光"系列,全稱"吹毛光速講解"

相信大家用頭條看這篇知識文章也是喜歡利用零碎的時間來學習把,

各位勤勉的同胞相信可能都在地鐵,公交,排隊,或者空餘時間才看到頭條的這篇文章吧.

如果是零碎的時間,長篇大論誰會看?誰能看得完?

所以,"吹毛光"系列來了!"吹毛"本人會吧一些複雜難懂,高深糊塗的概念和長篇大論的文章進行總結歸納,

再用生動形象的例子來為大家獻上乾貨,短小卻不失內涵,精簡而不失要領.

所有內容均為“吹毛”作者親自整理製作,瞭解一個原理勝過看百道面試題!

喜歡本人的作品請點擊關注呦.

廢話不多說,下面開始簡單粗暴.

吹毛:“吹毛光”面試JVM棧和堆為啥分開?如果你是java創始人你怎辦

java之父

想要深刻理解jvm內部運行與原理,最實際有效的方法是什麼呢?沒錯,就是角色扮演呀!

先給大家一個問題:

如果,java是你寫的,jvm虛擬機是你發明的,如果你是那個禿頂的老頭,你會怎麼做?你會把jvm設計成什麼樣子呢?


當然真正的格式已經有了,在上篇文章中我細緻的講解了每個模塊的構造和作用,想知道的小夥伴可以一會去看看哦

名字叫《吹毛:“吹毛光”系列之jvm運行數據區-面試必備,高手必會,光速掌握

好了回到問題,讓“吹毛”我想想如果真的是我自己創建的jvm虛擬機,我會怎樣做呢?

首先,寫程序,寫程序,我一定會有先後順序,代碼從前往後,運行,該調用的地方就調用,調用完就返回。

如果沒有這個基礎,那程序怎麼運行,對吧?

所以呢,符合我這個要求的正好有一種東西 叫“棧”。

棧:先進後出,後進先出,它的特點符合我這個程序與正常邏輯的要求

所以我要先向電腦申請內存:“我要一片內存”

電腦“用來幹嘛?”

我“用來放我的程序,我的程序在棧裡。”

電腦“好,給你!”

於是我有了內存,內存裡有了棧,棧中有了我各式各樣調用的程序,這個棧內有我程序的運行邏輯

可是問題來了,邏輯是保存了,數據也同樣保存了,如果我調用一個方法一億次,那這些相同的數據難道都要存一億遍嗎?這很明顯,別的不說,電腦不願意了啊,老子沒那麼多地方給你折騰的。

吹毛:“吹毛光”面試JVM棧和堆為啥分開?如果你是java創始人你怎辦

電腦:“md,我要冷靜”

那怎麼辦呢?我需要把這些數據單獨拿出來,放到一個地方,放在哪呢?

現在,又有一個現成的數據模型:堆

堆的特點就是無序的,適合存儲大量數據的地方。

嗯,不錯,那我就把所有數據都放到堆裡吧,然後我弄一個引用,棧裡如果要是想要這個類型的數據,那我就去堆裡拿,這樣如果我被調用一億次,也只是引用了一億次堆裡的一條數據而已,這樣很不錯哦!

於是,大概的jvm運行時數據區就已經出來了,那就是堆和棧,不過還有幾個小問題

  1. 堆裡的東西誰都是單獨引用的,如果我有一種數據是大家共用的,它要是修改,所有調用的地方就都同步修改了怎麼辦?

所以,方法區的概念出來了,裡面可以存放類信息,常量,靜態變量等信息。

附方法區概念:

方法區(Method Area)與Java堆一樣,是各個線程共享的內存區域,它用於存儲已被虛

擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。雖然Java虛擬機規

範把方法區描述為堆的一個邏輯部分,但是它卻有一個別名叫做Non-Heap(非堆),目的應

該是與Java堆區分開來。

2.有些方法不是java開發者編寫的,而是系統自帶的內部方法,比如自動關機,這部分方法咋辦呢?放哪裡呢?

放在“本地方法棧”裡,作用和虛擬機棧,也就是上面咱們程序鎖放的棧是差不多的。

本地方法棧概念:

本地方法棧(Native Method Stack)與虛擬機棧所發揮的作用是非常相似的,它們之間

的區別不過是虛擬機棧為虛擬機執行Java方法(也就是字節碼)服務,而本地方法棧則為虛

擬機使用到的Native方法服務。在虛擬機規範中對本地方法棧中方法使用的語言、使用方式

與數據結構並沒有強制規定,因此具體的虛擬機可以自由實現它。

3.如果我運行的是多線程,那當一個線程開啟後,另一個線程需要暫停的時候,這些判定條件信息該如何存放呢?

“程序計數器”的作用也就是這個,這也是最後一個java運行時數據區的部分。

程序計數器概念:

程序計數器(Program Counter Register)是一塊較小的內存空間,它可以看作是當前線

程所執行的字節碼的行號指示器。在虛擬機的概念模型裡(僅是概念模型,各種虛擬機可能

會通過一些更高效的方式去實現),字節碼解釋器工作時就是通過改變這個計數器的值來選

取下一條需要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能都需

要依賴這個計數器來完成。

嗯,完美了。能夠適應各種類型,各種情況了。

附上一張結構圖把,讓大家有更深刻的瞭解。

吹毛:“吹毛光”面試JVM棧和堆為啥分開?如果你是java創始人你怎辦

來自csdn

好,最後,總結一下最開始的問題,

為什麼要把jvm堆與jvm棧區分開呢?區分開有什麼好處?不區分行不行呢?

總結回答:

  1. jvm棧負責處理邏輯,jvm堆負責存儲數據,分開後,邏輯變得異常清晰。

  2. 對內存的佔用儘量做到最小,又可以不影響使用性能

  3. 模塊化思想在軟件設計的任何位置都是一件非常有意義的事情,如果你能從中學到這種思想,你將前途不可限量。

  4. jvm棧與jvm堆分離,使jvm堆中的內容可以被多個jvm棧使用與共享,收益很大,jvm堆中的共享常量可以被所有的jvm棧訪問,節省大量空間

  5. jvm堆與jvm棧的結合,就是面向對象的一個實例,這種面向對象的方式與面向對象程序非常匹配,所以有自然之美,順應時代。

  6. 這種jvm堆與jvm棧的分離思想,使得垃圾都會存在於堆部分,那就可以創建一套算法,對數據部分進行無用回收,也就是傳說中偉大的gc垃圾回收機制。這種思想讓垃圾回收變得可能。

講解結束。

怎麼樣,看完以後是不是對jvm的概念更加理解了?沒錯,我就是想讓你用最短的時間理解最深刻的原理,而且讓你學以致用

下一篇文章我準備對上面提到的,最偉大的gc垃圾回收機制進行編寫,你狠幸運,“吹毛”本人準備用最大能力對gc垃圾回收機制進行生動,簡短,全面的講解。絕對是全網最好理解的java的gc垃圾回收文章

趕快關注“吹毛”的頭條號哦,不要錯過精彩!

最後感謝大家,手動比心。

吹毛:“吹毛光”面試JVM棧和堆為啥分開?如果你是java創始人你怎辦

愛你們

相關推薦

推薦中...