在 Java 中,內(nèi)存被劃分為兩種:堆(Heap)和 棧(Stack)。兩者的用途和功能不同。在學(xué)習(xí) Java 編程時(shí),我們需要深入了解這兩種內(nèi)存存儲(chǔ)區(qū)域,對(duì)于我們編寫高質(zhì)量代碼和進(jìn)行性能優(yōu)化非常重要。
棧是內(nèi)存中的一塊區(qū)域,它存儲(chǔ) Java 方法調(diào)用和本地變量。(局部變量、方法參數(shù)、返回地址)等數(shù)據(jù)。每當(dāng)我們調(diào)用一個(gè)新的方法,系統(tǒng)就會(huì)在棧上創(chuàng)建一個(gè)新的棧幀,它包含該方法的所有變量,該方法的參數(shù)等。
在一個(gè)方法中聲明的變量名稱和生命周期只存在于該特定方法內(nèi)。每次方法被調(diào)用時(shí),該方法的變量也被重用。當(dāng)方法調(diào)用結(jié)束,棧幀也將被彈出,該方法的所有變量將被銷毀。
public static void method(){ int a = 10; int b = 20; }
在上面的方法中,整數(shù)a和b是在本地方法棧中聲明的, 它們?cè)诜椒ㄕ{(diào)用結(jié)束后將刪除。當(dāng)一個(gè)對(duì)象被實(shí)例化, 該對(duì)象以引用的方式存儲(chǔ)在堆上。所有的實(shí)例變量也存儲(chǔ)在堆上。
堆是 Java 程序保留的重要內(nèi)存空間。它是 Java 運(yùn)行時(shí)數(shù)據(jù)區(qū)域,可被所有線程共享。堆被分配用于存儲(chǔ) Java 類實(shí)例、數(shù)組、字符串?dāng)?shù)據(jù)、線程,以及它們之間相互引用的數(shù)據(jù)。在 Java 中,如果對(duì)象不再被引用,GC(垃圾收集器)將在適當(dāng)?shù)臅r(shí)候解除對(duì)象以回收內(nèi)存。
public class MyObject{ public static void main(String[] args){ MyObject obj = new MyObject(); obj.method(); } public void method(){ int[] array = new int[50]; } }
在上面的代碼中,我們創(chuàng)建了一個(gè)類的實(shí)例(MyObject obj),該實(shí)例分配了在 Heap 上的內(nèi)存使用。它的方法(method)創(chuàng)建了一個(gè)數(shù)組,該數(shù)組也分配在 Heap 上。通過這種方式,堆是 Java 對(duì)象之間交流的重要場(chǎng)所。