Java內存溢出異常

簡介

本文主要以代碼的形式介紹了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);
              }
             }
         }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章