Java是一種面向?qū)ο蟮木幊陶Z言,其執(zhí)行環(huán)境是在JVM(Java虛擬機(jī))中運(yùn)行的。Java程序的運(yùn)行涉及到進(jìn)程內(nèi)存和線程內(nèi)存。
進(jìn)程內(nèi)存是Java程序運(yùn)行時(shí)所需要的運(yùn)行空間,它是在操作系統(tǒng)級(jí)別分配的空間。Java程序啟動(dòng)時(shí),JVM進(jìn)程會(huì)向操作系統(tǒng)申請(qǐng)一塊內(nèi)存空間,這個(gè)內(nèi)存空間可以在JVM的運(yùn)行過程中不斷的調(diào)整大小,直到程序結(jié)束或者JVM Shutdown。它包含了JVM執(zhí)行需要的堆(Heap)空間、本地方法棧空間、方法區(qū)空間和操作系統(tǒng)分配的虛擬內(nèi)存空間等。
//Java代碼示例: public static void main(String[] args) { byte[] array1 = new byte[1024*1024]; byte[] array2 = new byte[1024*1024]; System.gc(); }
在上面的代碼中,首先定義了兩個(gè)byte數(shù)組,每個(gè)數(shù)組占用1MB空間,然后調(diào)用System.gc()方法,其目的是通知JVM進(jìn)行垃圾回收。在這個(gè)過程中,JVM會(huì)查找沒有引用的對(duì)象,并將其從內(nèi)存中清除。
線程內(nèi)存是Java程序中每個(gè)線程所需要的運(yùn)行空間,線程是Java程序中最小的執(zhí)行單元。每個(gè)線程都有自己的線程棧(Stack)空間,包括局部變量、方法參數(shù)、返回值等。每個(gè)線程的線程棧空間在執(zhí)行過程中會(huì)隨著方法調(diào)用的深入而不斷地?cái)U(kuò)展。當(dāng)一個(gè)方法結(jié)束時(shí),其所占用的棧空間也會(huì)釋放。
//Java代碼示例: public static void main(String[] args) { new Thread(() ->{ byte[] array3 = new byte[1024*1024]; byte[] array4 = new byte[1024*1024]; }).start(); }
在上面的代碼中,另開了一個(gè)線程,并在其中定義了兩個(gè)byte數(shù)組。這兩個(gè)數(shù)組位于該線程的線程棧空間中。當(dāng)該線程執(zhí)行結(jié)束時(shí),其線程棧空間也會(huì)被JVM自動(dòng)釋放。