在Java中,變量根據其類型和生命周期存儲在不同的內存區域。Java內存主要分為以下幾個部分:
堆(Heap):堆內存是Java中最大的一塊內存區域,主要用于存儲對象實例。所有通過new關鍵字創建的對象都存儲在堆內存中。堆內存是由垃圾回收器(Garbage Collector)管理的,當對象不再被引用時,垃圾回收器會自動回收堆內存中的空間。
棧(Stack):棧內存用于存儲基本類型變量(如int、char、float、double、boolean等)和對象引用(reference)。每個線程都有一個獨立的棧,棧中的數據只能在其所屬的線程中被訪問。當一個方法被調用時,會在棧中為該方法分配一個棧幀(Stack Frame),用于存儲該方法的局部變量、操作數棧、常量池引用等。方法執行完畢后,棧幀會被銷毀,局部變量也會隨之失效。
方法區(Method Area):方法區用于存儲已加載的類信息、常量、靜態變量等數據。當一個類被加載到內存時,會在方法區中為該類分配一塊空間,用于存儲類的元數據。靜態變量和常量也存儲在方法區中。
本地方法棧(Native Method Stack):本地方法棧用于存儲本地方法(如JNI調用的方法)的調用信息。與Java棧類似,每個線程都有一個獨立的本地方法棧。
程序計數器(Program Counter Register):程序計數器是一個很小的內存區域,用于存儲當前線程正在執行的字節碼指令的地址。當線程執行到一個方法時,程序計數器會記錄該方法的字節碼指令地址,以便下一條指令執行時能正確地找到該指令。每個線程都有一個獨立的程序計數器。