您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)Java中內(nèi)存分配的情況有哪些,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
Java內(nèi)存五大區(qū)
棧:用于保存函數(shù)內(nèi)部的局部變量,函數(shù)形參,一旦超出作用域,就刪除
堆:凡是new出來的東西都是存放在堆里,也可以說可變對象(非基本數(shù)據(jù)類型)都是保存在這里面。
堆里面的東西,都有一個內(nèi)存(16進(jìn)制),棧中存放的就是這個16進(jìn)制的內(nèi)存值。
堆里面存放的東西都用默認(rèn)值:
整數(shù):默認(rèn)值0
浮點數(shù):默認(rèn)0.0
布爾:默認(rèn)false
字符:默認(rèn)'\u0000‘
引用:默認(rèn)null
本地方法棧:與操作系統(tǒng)有關(guān)
方法區(qū):存儲.class相關(guān)信息,包含方法的信息
寄存器:與CPU相關(guān)
堆中存的是對象。棧中存的是基本數(shù)據(jù)類型和堆中對象的引用。一個對象的大小是不可估計的,或者說是可以動態(tài)變化的,但是在棧中,一個對象只對應(yīng)了一個4btye的引用(堆棧分離的好處:))。
為什么不把基本類型放堆中呢?因為其占用的空間一般是1~8個字節(jié)——需要空間比較少,而且因為是基本類型,所以不會出現(xiàn)動態(tài)增長的情況——長度固定,因此棧中存儲就夠了,如果把他存在堆中是沒有什么意義的(還會浪費空間,后面說明)??梢赃@么說,基本類型和對象的引用都是存放在棧中,而且都是幾個字節(jié)的一個數(shù),因此在程序運行時,他們的處理方式是統(tǒng)一的。
引用數(shù)據(jù)類型因為大小不固定,所以會存在堆內(nèi)存中,棧內(nèi)存中存的是堆內(nèi)存的地址,每次讀取值時,先找到棧內(nèi)存中的內(nèi)存地址,在通過內(nèi)存地址,找到在堆內(nèi)存中的對應(yīng)的對象。
棧內(nèi)存和堆內(nèi)存的關(guān)系圖示
堆:程序員向操作系統(tǒng)申請一塊內(nèi)存,當(dāng)系統(tǒng)收到程序的申請時,會遍歷一個記錄空閑內(nèi)存地址的鏈表,尋找第一個空間大于所申請空間的堆結(jié)點,然后將該結(jié)點從空閑結(jié)點鏈表中刪除,并將該結(jié)點的空間分配給程序。分配的速度較慢,地址不連續(xù),容易碎片化。此外,由程序員申請,同時也必須由程序員負(fù)責(zé)銷毀,否則則導(dǎo)致內(nèi)存泄露。
棧:由程序自動向操作系統(tǒng)申請分配以及回收,速度快,使用方便,但程序員無法控制。若分配失敗,則提示棧溢出錯誤。注意,const局部變量也儲存在棧區(qū)內(nèi),棧區(qū)向地址減小的方向增長。
內(nèi)存泄漏:我們申請了一塊內(nèi)存空間,在使用完后,沒有即使釋放。它的一般表現(xiàn)方式是程序運行時間越長,占用內(nèi)存越多,最終用盡全部內(nèi)存,整個系統(tǒng)崩潰。由程序申請的一塊內(nèi)存,且沒有任何一個指針指向它,那么這塊內(nèi)存就泄露了。
內(nèi)存泄漏解決辦法:良好的編碼習(xí)慣,使用了內(nèi)存分配的函數(shù),一旦使用完畢,要記得要使用其相應(yīng)的函數(shù)釋放掉。malloc和delete搭配使用,new和free搭配使用
調(diào)用對象,內(nèi)存分配情況
調(diào)用兩個對象,內(nèi)存分配情況
對象作為返回值
static變量
繼承
以上就是Java中內(nèi)存分配的情況有哪些,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。