Java是一門面向?qū)ο缶幊陶Z言,它有一個內(nèi)存模型,也就是對內(nèi)存分配、儲存和釋放的規(guī)范。在Java的內(nèi)存模型中,內(nèi)存被劃分為棧和堆兩個部分。
堆是Java應(yīng)用程序運(yùn)行的主要內(nèi)存區(qū)域,用于存儲所有使用new關(guān)鍵字創(chuàng)建的對象以及數(shù)組等數(shù)據(jù)結(jié)構(gòu)。堆空間大小的設(shè)置取決于具體的JVM實(shí)現(xiàn),但是在實(shí)際應(yīng)用中,我們可以使用-Xmx或-Xms選項(xiàng)來設(shè)置Java堆的大小。注意,堆的大小不應(yīng)該超過可用內(nèi)存的一半,因?yàn)橐粋€Java應(yīng)用程序還需要使用其他內(nèi)存部分。
public class MyClass { private int[] arr = new int[10000]; } public static void main(String[] args) { MyClass obj1 = new MyClass(); MyClass obj2 = new MyClass(); }
上述代碼通過new關(guān)鍵字創(chuàng)建兩個MyClass對象,這兩個對象都會被分配到Java堆空間中。而且在堆空間中,兩個對象的內(nèi)存是分開的,它們的內(nèi)存區(qū)域是不同的。這兩個對象分別屬于不同的引用,并且在創(chuàng)建時,它們各自有自己的構(gòu)造函數(shù)執(zhí)行。
相對于堆空間,棧空間是用來存儲程序執(zhí)行中的方法和局部變量等,棧空間的分配和操作方式十分簡單快捷。方法執(zhí)行之前就可以在棧中分配好內(nèi)存空間,方法執(zhí)行結(jié)束后會自動釋放空間。棧空間大小一般都比較小,因?yàn)樗鼈兊纳芷诜浅6虝骸?/p>
public static void main(String[] args) { int a = 10; int b = 20; int result = a + b; }
上述代碼中,我們在棧中創(chuàng)建了三個局部變量a、b和result,它們的資源是不會與其他變量共享的。在這個例子中,棧中的內(nèi)存只用于執(zhí)行代碼,一旦代碼執(zhí)行結(jié)束,這些內(nèi)存就會被自動釋放。
總結(jié)一下,Java的內(nèi)存模型將內(nèi)存劃分成棧和堆兩個部分,這兩個部分分別用于存儲方法和對象等。堆空間大小一般由JVM自動管理,但也可以使用-Xmx或-Xms選項(xiàng)來設(shè)置;棧空間大小一般比較小,并且在程序執(zhí)行結(jié)束后就自動釋放。