1.大體來講java虛擬機分爲:堆 棧java
棧在數據結構就是那個先進後出的棧。堆...這名字我一聽就以爲大..畢竟咱們形容東西多又沒什麼大多的組織的時候就是一堆一堆的....(原諒我發散性的思惟,我是妹子...這樣能理解個人思惟麼?)數據結構
棧是跟着線程走的。一個線程一個棧。一個方法一個棧幀(搞個這麼專業的名字,其實就是一個方法的元數據包,好比記錄了這個方法的名字,哪一行,參數,返回。。等等等,你就想象下,你是虛擬機,你要執行個方法你要寫什麼信息。。。)。棧的特色就是先進後出,正好跟方法的執行是匹配的,每隻執行棧頂的方法,遇到方法中的方法就入棧再執行棧頂的方法,執行完了就出棧...匹配的完美。。。而後一個線程無非要作的就是讀取指令執行指令而後讀取下一個指令。。。咦,你咋知道下一個指令在哪裏?若是是我我也會搞個東西記住我要執行的下一個指令在哪裏啊。全部每一個線程都有一個程序計數器指向下一行代碼在哪裏。嚴格來講,程序計數器跟棧沒啥干係。。。又不須要先進後出的特色。。。。因此它既不是堆也不是棧,並且佔的內存還小...沒什麼份量線程
棧還有特殊的東西,叫本地方法棧...幹嗎的?名字都這麼清楚了,執行本地方法的棧唄,啥叫本地方法?。。。。本身百度去。我只是個妹子又不是大牛。。。指針
還有一個大的東西,堆...就是一堆內存你們都能用。何時會用到呢?地方這麼大那確定是耗用內存比較多又不太能預計的就很好啦。至關於棧是本身家,裝修要精緻又整潔可是面積不大啊。那麼分分鐘要建個對象出來,佔內存又大怎麼辦?放家太。。。擠了。那隻能去外面了你們都能用的空地上了,而後栓根繩子在家了,方便後面能找到本身的對象。或者登記一下。有兩種登記的方法,第一:堆裏面有個區域專門登記地址。想當於一本的目錄。有規律的記錄了這一推內存的使用狀況。須要找到某個對象的時候,從這個目錄就就找到。。。而一個變量就在棧裏面指向這個目錄。。這個叫句柄。。。哎呀也就是指針的指針啦。。。還有一種就是建個對象丟堆裏面,在棧裏面弄個變量指向這個推裏面的地址。就是引用,c叫指針(我更喜歡這個名字。。。很形象啊,一下就記住了。指向別人的一根針。。。。)這兩種登記方式有什麼區別呢?額,這個在垃圾回收的時候就有用啦。垃圾回收就是把沒用的對象給清除了,不能佔着茅坑不拉屎呀,對吧。怎麼清除呢?好多辦法。。。我記得有的就是把對象都搬到一塊兒去。。而後空出一大片。。這個時候問題就來了,你把對象都搬家了。。。那我在棧裏面的指針是否是也要變一下,指向新的地方。若是是第一種句柄的方式就不用,由於我指向的就只是個目錄,,你家本身發生了變更關我啥事。。。你本身變變目錄指向的值不就好了。。。第二種引用的方式就。。必須變了。誰叫我須要你呢,你走我也跟着走。。。。堆無非就是這麼個東東。。。你們都能用的。。。倉庫。。。。對象
內存還有幾塊。。。方法區 運行時常量 直接內存。。。總歸都是有用的東西,可是我看了幾遍也沒啥影響,爲何?由於我感受我沒啥用啊。。。等我感受我用的到了再說。。。內存