Java常量池是Java虛擬機中的一塊內存區域,用于存放編譯期間生成的各種字面量和符號引用,包括字符串常量、數字常量、類型常量、常量對象等。常量池是JVM運行時數據區的一部分,被所有線程共享,其目的在于減少常量的重復存儲,提高內存利用率。
public class ConstantPoolTest {
public static void main(String[] args) {
// 字符串常量
String str1 = "HelloWorld";
String str2 = "HelloWorld";
System.out.println(str1 == str2); // true
// new String()對象
String str3 = new String("HelloWorld");
System.out.println(str1 == str3); // false
// intern()方法
String str4 = str3.intern();
System.out.println(str1 == str4); // true
}
}
Java堆是Java虛擬機中的另一塊內存區域,用于存放對象實例和數組。Java堆是各個線程共享的內存區域,由垃圾回收器進行管理,可以動態擴展和收縮。Java堆內存的分配和回收都是自動的,不需要程序員手動管理。
public class HeapTest {
public static void main(String[] args) {
Listlist = new ArrayList<>();
for (int i = 0; i< 100000; i++) {
list.add(i);
}
System.out.println("List size: " + list.size());
}
}
在以上示例中,我們創建了一個ArrayList對象并往里面添加了100000個元素。由于Java堆內存可以動態擴展,所以在程序運行時,JVM會自動申請足夠的內存來存儲ArrayList對象和其中的元素。同時,由于我們沒有手動釋放內存,JVM會在對象不再被引用時自動回收其所占用的內存。