1. 程式人生 > 程式設計 >Java記憶體分配多種情況的用法解析

Java記憶體分配多種情況的用法解析

這篇文章主要介紹了Java記憶體分配多種情況的用法解析,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

Java記憶體五大區

棧:用於儲存函式內部的區域性變數,函式形參,一旦超出作用域,就刪除

堆:凡是new出來的東西都是存放在堆裡,也可以說可變物件(非基本資料型別)都是儲存在這裡面。

堆裡面的東西,都有一個記憶體(16進位制),棧中存放的就是這個16進位制的記憶體值。

堆裡面存放的東西都用預設值:

整數:預設值0

浮點數:預設0.0

布林:預設false

字元:預設'\u0000‘

引用:預設null  

本地方法棧:與作業系統有關

方法區:儲存.class相關資訊,包含方法的資訊

暫存器:與CPU相關

堆中存的是物件。棧中存的是基本資料型別和堆中物件的引用。一個物件的大小是不可估計的,或者說是可以動態變化的,但是在棧中,一個物件只對應了一個4btye的引用(堆疊分離的好處:))。

為什麼不把基本型別放堆中呢?因為其佔用的空間一般是1~8個位元組——需要空間比較少,而且因為是基本型別,所以不會出現動態增長的情況——長度固定,因此棧中儲存就夠了,如果把他存在堆中是沒有什麼意義的(還會浪費空間,後面說明)。可以這麼說,基本型別和物件的引用都是存放在棧中,而且都是幾個位元組的一個數,因此在程式執行時,他們的處理方式是統一的。

引用資料型別因為大小不固定,所以會存在堆記憶體中,棧記憶體中存的是堆記憶體的地址,每次讀取值時,先找到棧記憶體中的記憶體地址,在通過記憶體地址,找到在堆記憶體中的對應的物件。

棧記憶體和堆記憶體的關係圖示

堆:程式設計師向作業系統申請一塊記憶體,當系統收到程式的申請時,會遍歷一個記錄空閒記憶體地址的連結串列,尋找第一個空間大於所申請空間的堆結點,然後將該結點從空閒結點連結串列中刪除,並將該結點的空間分配給程式。分配的速度較慢,地址不連續,容易碎片化。此外,由程式設計師申請,同時也必須由程式設計師負責銷燬,否則則導致記憶體洩露。

棧:由程式自動向作業系統申請分配以及回收,速度快,使用方便,但程式設計師無法控制。若分配失敗,則提示棧溢位錯誤。注意,const區域性變數也儲存在棧區內,棧區向地址減小的方向增長。

記憶體洩漏:我們申請了一塊記憶體空間,在使用完後,沒有即使釋放。它的一般表現方式是程式執行時間越長,佔用記憶體越多,最終用盡全部記憶體,整個系統崩潰。由程式申請的一塊記憶體,且沒有任何一個指標指向它,那麼這塊記憶體就洩露了。

記憶體洩漏解決辦法:良好的編碼習慣,使用了記憶體分配的函式,一旦使用完畢,要記得要使用其相應的函式釋放掉。malloc和delete搭配使用,new和free搭配使用

呼叫物件,記憶體分配情況

呼叫兩個物件,記憶體分配情況

物件作為返回值

static變數

繼承

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。