背景知識:
棧存放什么:棧存儲運行時聲明的變量——對象引用(或基礎類型, primitive)內存空間, 棧的實現是先入后出的。
堆存放什么:堆分配每一個對象內容(實例)內存空間。
棧溢出:java.lang.StackOverflowError
堆溢出:java.lang.OutOfMemoryError: Java heap space
棧溢出實現,可以遞歸調用方法,這樣隨著棧深度的增加,JVM 維持著一條長長的方法調用軌跡。
堆溢出實現,可以循環創建對象或大的對象;
直到內存不夠分配,產生棧溢出。
兩種情況:
• 線程請求的棧深度大于虛擬機允許的最大深度 StackOverflowError
• 虛擬機在擴展棧深度時,無法申請到足夠的內存空間 OutOfMemoryError
創建對象時如果沒有可以分配的堆內存,就會出現堆溢出。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class testCode {
public void testHeap(){//堆溢出
List<byte[]> list = new ArrayList<>();
int i=0;
while (true){
list.add(new byte[5*1024*1024]);
System.out.println("count is: "+(++i));
}
}
int num = 1;
public void testStack(){ //棧溢出
num++;
this.testStack();
}
public static void main(String[] agrs){
testCode t = new testCode();
t.testHeap();
t.testStack();
}
}
運行結果:
//堆溢出:
count is: 343
count is: 344
count is: 345
count is: 346
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at testCode.testHeap(testCode.java:14)
at testCode.main(testCode.java:25)
//棧溢出:
StackOverflowError
• 1
• 2
另外,Java虛擬機的堆大小如何設置:命令行
java –Xms128m //JVM占用最小內存
–Xmx512m //JVM占用最大內存
–XX:PermSize=64m //最小堆大小
–XX:MaxPermSize=128m //最大堆大小
• 1
• 2
• 3
• 4
• 5
• 6