簡介
本文主要以代碼的形式介紹了java出現內存溢出的情況,總結來自周志明的《深入Java虛擬機》
Java堆溢出
java堆用於存儲對象實例,也就是new出來的東東,如果不斷的創建對象,並且GC Roots 到對象之間可達的路徑,這樣對象就不會被GC回收,當對象數量到達最大堆的容量就出現內存異常。
Note : 將堆的最小值和最大值設爲相同來避免內存自動擴展 (-Xms xxxM,-Xmm xxxM)
public class HeapOOM {
static class P {
}
public static void main(String[ ] args) {
List<P> list = new ArrayList<P>();
while(true){
list.add(new P());
}
}
虛擬機棧和本地方法棧溢出
虛擬機棧描述的是Java方法執行的內存模型,每一次方法調用都會創建一個棧幀用於存儲局部變量,操作數棧,動態鏈接,方法出口地址等信息。當線程的請求的棧深度大於虛擬機允許的深度,出現棧溢出。
public class JavaVMSteakSOF {
private int stackLength = 1;
public void steakLeak(){
stackLength ++ ;
steakLeak();
}
public static void main(String[] args) throws Throwable {
JavaVMSteakSOF javaVMSteakSOF = new JavaVMSteakSOF();
try{
javaVMSteakSOF.steakLeak();
}catch(Throwable e) {
System.out.println("steak length : " +javaVMSteakSOF.stackLength);
}
}
}