一、Java有六個(gè)地方可以存儲(chǔ)數(shù)據(jù)
1、寄存器(register):
? ? ? 這是最快的存儲(chǔ)區(qū),因?yàn)樗挥谔幚砥鲀?nèi)部,相當(dāng)于操作系統(tǒng)中訪問cache一樣。
2、棧(stack):
? ? ? ?其實(shí)就是棧只是一個(gè)抽象的詞語而已。創(chuàng)建程序時(shí)候,JAVA編譯器必須知道存儲(chǔ)在棧內(nèi)所有數(shù)據(jù)的確切大小和生命周期,因?yàn)樗仨毶上鄳?yīng)的代碼,就是說像int a=1,double b=2等八種基本數(shù)據(jù)類型為了追求速度就是存放于棧當(dāng)中。
3、堆(heap)。
? ? ? ?一種通用性的內(nèi)存池(也存在于RAM中),用于存放所有的JAVA對(duì)象。堆不同于棧的好處是:編譯器不需要知道要從堆里分配多少存儲(chǔ)區(qū) 域,也不必知道存儲(chǔ)的數(shù)據(jù)在堆里存活多長(zhǎng)時(shí)間。因此,在堆里分配存儲(chǔ)有很大的靈活性。當(dāng)你需要?jiǎng)?chuàng)建一個(gè)對(duì)象的時(shí)候,只需要new寫一行簡(jiǎn)單的代碼,當(dāng)執(zhí)行這行代碼時(shí),會(huì)自動(dòng)在堆里進(jìn)行存儲(chǔ)分配。當(dāng)然,為這種靈活性必須要付出相應(yīng)的代碼。用堆進(jìn)行存儲(chǔ)分配比用棧進(jìn)行存儲(chǔ)存儲(chǔ)需要更多的時(shí)間。
4、靜態(tài)存儲(chǔ)(static storage)。
? ? ? ?常量通常用static修飾。靜態(tài)存儲(chǔ)里存放程序運(yùn)行時(shí)一直存在的數(shù)據(jù)。
5、常量存儲(chǔ)(constant storage)。
? ? ? ?常量通常用final修飾。常量值通常直接存放在程序代碼內(nèi)部,這樣做是安全的,因?yàn)樗鼈冇肋h(yuǎn)不會(huì)被改變。在嵌入式系統(tǒng)中,常量本身會(huì)和其他部分分割離開,所以在這種情況下,可以選擇將其放在ROM中。
6、非RAM存儲(chǔ)。
? ? ? ? 如果數(shù)據(jù)完全存活于程序之外,那么它可以不受程序的任何控制,在程序沒有運(yùn)行時(shí)也可以存在。
速度相比就是:寄存器(最快) > 堆棧 > 堆 > 其他
二、堆、棧主要關(guān)系
1. 棧
? ? ? ? 函數(shù)中定義的基本類型(int,double,float,char,short,float,boolean,byte)和引用變量都在棧中分配,引用變量就相當(dāng)于是為數(shù)組或?qū)ο笃鸬囊粋€(gè)名稱,比如String str = new String("abc")中str就是一個(gè)引用變量。以后就可以在程序中使用棧中的引用變量來訪問堆中的數(shù)組或?qū)ο?/b>。棧中數(shù)據(jù)可以共享
2. 堆
? ? ? ?使用new()構(gòu)造出來的對(duì)象都是在堆中存儲(chǔ)。無論里面的值是不是一樣,都會(huì)開辟一個(gè)新的空間,即動(dòng)態(tài)的分配地址空間(即并不是編譯的時(shí)候分配,程序運(yùn)行到這里的時(shí)候再分配,所以數(shù)組對(duì)象這種就很占內(nèi)存)。
三、堆棧各自的優(yōu)缺點(diǎn)
棧的優(yōu)缺點(diǎn):
? ? ? ?存取速度快,僅次于CPU中的寄存器,并且數(shù)據(jù)可以共享。缺點(diǎn)是棧中的數(shù)據(jù)大小必須確定,缺乏靈活性。
堆的優(yōu)缺點(diǎn):
? ? ? ? 優(yōu)勢(shì)是可以動(dòng)態(tài)的分配內(nèi)存大小,生存期也不必事先告訴編譯器,Java的垃圾收集器會(huì)自動(dòng)收走這些不再使用的數(shù)據(jù)。因?yàn)橐獎(jiǎng)討B(tài)分配內(nèi)存,所以運(yùn)行時(shí)就會(huì)消耗更多的時(shí)間和空間
————————————————
轉(zhuǎn)自 原文鏈接:https://blog.csdn.net/qq_38261445/article/details/88776677