在Java中,有三個重要的內存區域:棧堆、堆和方法區。其中棧堆和堆主要用來存儲對象和基本數據類型,而方法區則主要用來存儲類、常量、靜態變量等。
棧堆是一個運行時數據區,它包含了各種基本數據類型和對象的引用。當程序調用一個方法時,棧幀將被創建出來,里面包含了方法的參數、局部變量,以及方法返回值等。當方法結束時,棧幀將被銷毀。棧堆的大小是固定的,由虛擬機自動管理。
public class StackExample { public static void main(String[] args) { int x = 10; int y = 5; int z = add(x, y); System.out.println(z); } public static int add(int a, int b) { return a + b; } }
在這個例子中,整型變量x、y和z被存儲在棧堆中。當程序調用add方法時,一個新的棧幀將會被創建。在棧幀中,參數a和b被存儲在棧堆中,然后add方法執行a+b的計算操作并將結果返回。這個結果被存儲在棧堆中的z變量中。當add方法結束時,棧幀被銷毀。
堆是用于存儲對象的內存區域。當程序創建一個新的對象時,它將在堆中分配內存。當對象沒有被引用時,會被Java垃圾回收器自動回收。堆的大小也是固定的,由虛擬機自動管理。
public class HeapExample { public static void main(String[] args) { Person p1 = new Person("Tom", 20); Person p2 = new Person("Lucy", 18); System.out.println(p1.getName() + " " + p1.getAge()); System.out.println(p2.getName() + " " + p2.getAge()); } } class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } }
在這個例子中,Person類的對象p1和p2被存儲在堆中。當程序創建Person對象時,它將在堆中分配內存。當程序不再引用Person對象時,該對象將被Java垃圾回收器自動回收。
方法區用于存儲類信息、常量、靜態變量等。Java虛擬機僅有一個方法區,所有線程共享該區域。方法區大小也是固定的,由虛擬機自動管理。
public class MethodAreaExample { public static final int NUM = 5; public static void main(String[] args) { System.out.println("Hello World"); } public static class InnerClass { private static String name; static { name = "John"; } public static String getName() { return name; } } }
在這個例子中,代碼中的字符串常量、靜態變量NUM和內部類InnerClass的定義都存儲在方法區中。
下一篇css中skew的用法