java代碼實現JVM棧溢出,堆溢出


參考博客:http://www.cnblogs.com/tv151579/p/3647238.html
背景知識:

  1. 棧存放什么:棧存儲運行時聲明的變量——對象引用(或基礎類型, primitive)內存空間, 棧的實現是先入后出的。
  2. 堆存放什么:堆分配每一個對象內容(實例)內存空間。
  3. 棧溢出:java.lang.StackOverflowError
  4. 堆溢出:java.lang.OutOfMemoryError: Java heap space
  5. 棧溢出實現,可以遞歸調用方法,這樣隨着棧深度的增加,JVM 維持着一條長長的方法調用軌跡。
  6. 堆溢出實現,可以循環創建對象或大的對象

直到內存不夠分配,產生棧溢出。

一、棧溢出

兩種情況:

  1. 線程請求的棧深度大於虛擬機允許的最大深度 StackOverflowError
  2. 虛擬機在擴展棧深度時,無法申請到足夠的內存空間 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

出現溢出解決方案:http://outofmemory.cn/c/java-outOfMemoryError


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM