堆棧 jvm 太難懂?買房子總能理解了吧

堆棧 jvm 太難懂?買房子總能理解了吧

求關注哦~~


java零基礎入門-面向對象篇(一) 基礎類型和引用類型

友情提示:本章開始可能會有部分較深入的內容,不說又不行,說了又很難解釋清楚,因為裡面的技術細節實在太多太複雜,所以我會屏蔽部分技術細節,只展示當前需要了解的基礎知識,避免出現講了半天還是沒人懂的情況。隨著我們的知識增長,後面會逐步的將細節補充完整。

學習編程,一定要把思路放開,不能太侷限,多多進行思維能力的鍛鍊才能提高自己的內功。比如我們很常見的買房啊,哪裡修商場啊,其實跟我們的內存結構是很類似的。他們都涉及到一個資源規劃的問題,來吧,一起來鍛鍊下思維能力吧。

最近全國除了最火的搶人大戰,其實前段時間還有一個東西很火,那就是城市規劃。比如我們的首都北京,選擇了雄安進行首都功能疏解,其實很多城市都有類似的規劃,比如天津濱海新區,深圳前海新區等等。政府設立了一個即將開發的新區後,會幹嘛?招商引資,首先是大的企業進來修路蓋高樓大廈,然後修住宅,再賣給老百姓。我們來看看具體過程。

首先,政府畫了一個圈,“走過路過不要錯過哈,新鮮出爐的地塊,各種優惠政策,減稅減稅再減稅,快來看看啊~”,然後一堆大企業蜂擁而上,“給我留一塊~”,“我也要~”。然後各種大企業開始修辦公樓啊,房地產開發商開始修海景房啊,然後輪到地產開發商要喝了,“走過路過不要錯過啊,海景房值得擁有,機不可失,搶到了幸福生活,沒搶到繼續幹活~”。然後輪到搶房大軍蜂擁而上了。

堆棧 jvm 太難懂?買房子總能理解了吧

給我房!!!

再來看看電腦內存,其實我們的電腦就是政府部門,每一次一開機,就開始要喝,“內存開始大派送啦,需要的快來領啊”,然後各種開機啟動的應用程序開始搶內存,什麼聊天的啊,殺毒的啊,瀏覽器啊,當然還有系統自帶的功能,統統需要內存。當然,內存不是一開機就分完了的,還有很多是我們啟動了新的應用程序才會劃分內存給你,比如我們的java。

堆棧 jvm 太難懂?買房子總能理解了吧

應用程序和系統程序佔用內存

電腦開機進行的內存免費大派送跟我們的政府規劃很像,在座的各位都是大佬,內存要多少有多少。然後我們打開java的時候,java也成功的分到了一塊內存空間。java這個房地產商跟別的有點區別,他很牛,拿的地很大,他要自己規劃自己的地,也就是說它不僅僅要做房地產,他還要修商場,建公園,這個就厲害了~

堆棧 jvm 太難懂?買房子總能理解了吧

java虛擬機

看見沒有,系統給了一塊內存java ,然後他在自己的一畝三分地上,開始幹自己的規劃了,這是個很高級的房產開發商。java有個名詞叫java虛擬機(JVM),你就可以理解為他是一個虛擬的系統,他幹了很多和系統類似的活,系統把內存交給java以後,就由 jvm 來負責規劃內存。就像我們上面說的,政府部門劃了地給開發商,java自己也劃地分給他下面的小弟。那麼java裡面的小弟又是啥?繼續往下看

首先我們看看普通人眼裡的內存,他就是一塊綠色的板子,上面有很多電路,下面有一條金光閃閃的東西,好了,理解完了。

堆棧 jvm 太難懂?買房子總能理解了吧

普通人看內存

再來看看硬件工程師眼裡的內存,他就是各種電路啊,電容啊,門啊之類的東西,其實我也不是很懂,大概是這樣。

堆棧 jvm 太難懂?買房子總能理解了吧

硬件工程師看內存

接下來看軟件工程師眼裡的內存,這個圖是指分給java的內存,也就是jvm管理的內存。我們只看java這個開發商,自己已經分到的內存,其他軟件,系統佔用的內存我們不去管他。我們看到 jvm 劃分的內存大概有以下這麼幾個區域:本地方法棧,虛擬機棧,程序計數器,堆,方法區,這些就是 java 自己的小弟了。

堆棧 jvm 太難懂?買房子總能理解了吧

jvm內存

我們看看這些顏色是咋回事,和上面的規劃圖顏色說明差不多,紅色的是 堆,可以理解成商業用地,綠色的是方法區,可以理解成公園,這兩個區域的特點是,他們是公共用地,不管哪個小區的居民,都可以來壓壓馬路,看看風景。再看上面的,本地方法棧和程序計數器是灰色,你可以理解為市政設施,每個片區都有警察局,有困難找警察叔叔,我們姑且不去管他,知道就行了。主要看看 虛擬機棧,這個下面簡稱為棧,這個很重要。我們可以理解成居民小區,每個人只能出入自己的小區,去別人小區可不行,保安不讓進。

所以總結一下,堆和方法區是公共的,每個小區的居民都可以去玩,而棧是私有的,不能隨便串門的。這個理解到這裡就行了。接下來我們講講最重要的 棧 和 堆,方法區就是個大草地,暫時不用管他。

基礎類型 和 引用類型

我們首先明確一個觀念,我們的數據都是存在內存裡的,但是不同的數據,在內存中存放的區域是不同的。有的數據存放在棧,有的數據存放在堆。具體誰放在哪,我們首先要明確數據的類型。

基礎類型(又叫值類型):我前面講的都是基礎類型,byte,short,int,long,float,double,boolean,char,基礎類型全部存在棧裡面。

引用類型:數組,類,接口,引用類型變量存在棧,對象存在堆,通過引用確定關係。

基礎類型比較好理解,創建的時候往棧裡面一丟,搞定,打完收工。而引用類型就比較複雜了,引用類型的變量就是引用,啥叫引用?來吧,話不多,懵的時候就上圖

堆棧 jvm 太難懂?買房子總能理解了吧

內存地址

好吧,肯定有同學又要問,內存地址又是個啥?

堆棧 jvm 太難懂?買房子總能理解了吧

內存地址

地址就是找人找東西時候用的,內存地址就是讓內存劃分的空間有個標記,我通過這個標記可以找到內存。所以引用類型裡面存的不是你定義給他的值,而是存的內存地址。那我定義的數組啊,數組跑哪去了?它在堆裡面,而這個棧裡面存的地址就是堆裡面放的那個數組的地址。又懵了?圖圖圖~

堆棧 jvm 太難懂?買房子總能理解了吧

地址

我們將紅色箭頭乾的事,叫做:引用變量指向內存。堆裡面的數據,只有當有引用變量指向它的時候,才能存在,如果沒人指向堆裡面的數據了,就會有一位親切的清潔工阿姨把他當垃圾處理掉。所以棧裡面的變量,紅色箭頭,堆裡面的數據這三個東西是一體的,他們不能分開。他們在一起,才是定義了一個完整的引用類型。

其實這一段對於初學者來說是有難度的,概念比較多,步驟繁瑣,圖也都是平面圖,有沒有更加通俗易懂的方式來解釋這個問題呢,來吧,本教程獨家三維圖雙手奉上。

棧是一種數據結構,他的特點就是先進後出,後進先出。只有棧頂可以操作,棧底是固定的,插入操作又叫入棧,刪除叫出棧。理解這麼多就可以了。

堆棧 jvm 太難懂?買房子總能理解了吧

棧結構

堆棧 jvm 太難懂?買房子總能理解了吧

入棧

堆棧 jvm 太難懂?買房子總能理解了吧

出棧

相對於棧的有序,堆是無序的,可以理解成隨機劃分一塊空間來儲存對象。

堆棧 jvm 太難懂?買房子總能理解了吧

堆是無序的

我們用三維圖再來看看剛才的例子

首先是基礎類型

堆棧 jvm 太難懂?買房子總能理解了吧

定義變量

堆棧 jvm 太難懂?買房子總能理解了吧

入棧

再來看引用類型

堆棧 jvm 太難懂?買房子總能理解了吧

定義變量

堆棧 jvm 太難懂?買房子總能理解了吧

開闢空間,建立引用

本篇文章為接下來的數組,類打基礎,堆和棧的理解對我們更好的學面向對象很有幫助,請好好理解,多多參悟。


分享到:


相關文章: