參考博客:http://www.cnblogs.com/tv151579/p/3647238.html
背景知識:
- 棧存放什么:棧存儲運行時聲明的變量——對象引用(或基礎類型, 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