更新時間:2021-08-23 11:09:25 來源:動力節(jié)點 瀏覽1159次
它是由Java虛擬機在啟動時創(chuàng)建的。只要應(yīng)用程序正在運行,就會使用內(nèi)存。Java運行時使用它為對象和Java運行時環(huán)境 (JRE) 類分配內(nèi)存。
創(chuàng)建對象時,它總是在Heap中創(chuàng)建并具有全局訪問權(quán)限。這意味著可以從應(yīng)用程序的任何地方引用所有對象。
它由兩個概念管理:垃圾收集和年輕代、年老代。
垃圾收集通過清除方法中沒有任何引用的對象來釋放內(nèi)存。這些是不再使用的對象。清除它們可確保它們不會占用堆中的空間。
年輕代、年老代通過將Java堆空間劃分為兩代來幫助確定垃圾收集對象的優(yōu)先級。
托兒所是存儲新對象的年輕一代。當(dāng)托兒所已滿時,垃圾收集會將其清理干凈。請注意,只有托兒所的內(nèi)存空間已滿。老一代還有記憶。
老年代是對象的家園,它們已經(jīng)存在了足夠長的時間。當(dāng)老年代空間用完時,垃圾回收會移除老年代空間中未使用的對象。同樣,當(dāng)舊的垃圾收集發(fā)生時,只有部分堆已滿。托兒所還有空位。
這是調(diào)用它們的方法時存儲變量值的臨時內(nèi)存。方法完成后,包含這些值的內(nèi)存將被清除,以便為新方法騰出空間。
當(dāng)調(diào)用一個新方法時,會在堆棧中創(chuàng)建一個新的內(nèi)存塊。這個新塊將存儲該方法調(diào)用的臨時值以及對存儲在該方法正在使用的堆中的對象的引用。
此塊中的任何值只能由當(dāng)前方法訪問,一旦結(jié)束將不存在。
當(dāng)該方法結(jié)束時,該塊將被擦除。調(diào)用的下一個方法將使用該空塊。
這種“后進先出”方法可以輕松找到所需的值并允許快速訪問這些值。
讓我們看一個非常簡單的Java應(yīng)用程序示例,了解如何分配內(nèi)存。
包裝融為一體。journaldev 。測試;包裝融為一體。journaldev 。測試;public class Memory { public static void main ( String [] args ) { // 第 1 行 int i=1; // 第 2 行 Object obj = new Object(); // 第 3 行 Memory mem = new Memory(); // 第 4 行 mem.foo(obj); // 第 5 行 } // 第 9 行private void foo ( Object param ) {
// 第 6 行 String str = param.toString(); //// 第 7 行 System.out.println(str); } // 第 8 行}
在上面來自JournalDev.com 的例子中,Stack 和 Heap 的使用解釋如下:
當(dāng)程序運行時,所有運行時類都被加載到堆空間中。
Java 運行時在第 1 行發(fā)現(xiàn) main() 方法線程時創(chuàng)建堆棧內(nèi)存以供其使用。在第 2 行,創(chuàng)建一個原始局部變量,該變量存儲在 main() 方法的堆棧內(nèi)存中。
因為對象是在第 3 行創(chuàng)建的,所以它是在堆內(nèi)存中創(chuàng)建的,它的引用存儲在堆棧內(nèi)存中。在第 4 行,創(chuàng)建 Memory 對象時會發(fā)生類似的過程。
在第 5 行調(diào)用 foo() 方法時,會為其創(chuàng)建 Stack 頂部的一個塊。由于 Java 是按值傳遞的,因此在第 6 行的 foo() 堆棧塊中創(chuàng)建了對 Object 的新引用。
在第 7 行,創(chuàng)建了一個字符串,它位于堆空間的字符串池中,同時在 foo() 堆棧空間中創(chuàng)建了它的引用。在第 8 行,foo() 方法被終止,堆棧中為其分配的內(nèi)存塊被釋放。
最后,在第 9 行,main() 方法終止,并銷毀為其創(chuàng)建的堆棧內(nèi)存。因為程序在這一行結(jié)束,Java Runtime 釋放所有內(nèi)存并結(jié)束程序的執(zhí)行。
Java堆空間在整個應(yīng)用程序中使用,但堆棧僅用于當(dāng)前運行的方法(或多個方法)。
堆空間包含所有創(chuàng)建的對象,但堆棧包含對這些對象的任何引用。
存儲在堆中的對象可以在整個應(yīng)用程序中訪問。原始局部變量只能訪問包含它們的方法的堆棧內(nèi)存塊。
堆空間中的內(nèi)存分配是通過一個復(fù)雜的、年輕代、年老代系統(tǒng)訪問的。堆棧是通過后進先出 (LIFO) 內(nèi)存分配系統(tǒng)訪問的。
只要應(yīng)用程序運行,堆空間就存在,并且大于堆棧,這是臨時的,但速度更快。
以上就是動力節(jié)點小編介紹的"Java堆空間與堆棧內(nèi)存",希望對大家有幫助,想了解更多可查看Java堆棧。動力節(jié)點在線學(xué)習(xí)教程,針對沒有任何Java基礎(chǔ)的讀者學(xué)習(xí),讓你從入門到精通,主要介紹了一些Java基礎(chǔ)的核心知識,讓同學(xué)們更好更方便的學(xué)習(xí)和了解Java編程,感興趣的同學(xué)可以關(guān)注一下。