編寫各種OutOfMemory & StackOverflow程式

universe_ant發表於2016-11-01
自己編寫各種outofmemory,stackoverflow程式

HeapOutOfMemory
Young OutOfMemory
MethodArea OutOfMemory
ConstantPool OutOfMemory
DirectMemory OutOfMemory
Stack OutOfMemory Stack OverFlow

這是網上某篇稱為Java大牛中列出來的一條專案,下面進行簡單的自己的實現:


1、HeapOutOfMemory

堆溢位,情況多見於物件過多,存在多餘引用,不使用的物件未及時釋放。

package com.test;

import java.util.ArrayList;

/**
 * Created by littlewolf on 11/1/2016.
 */
public class Demo {
    public static void main(String[] args) throws Exception {
        ArrayList<String> strs = new ArrayList<String>(100000000);
        for ( int i = 0; i <= 100000000; i++ ) {
            strs.add(Integer.toString(i));
            if( i % 10000 == 0 ) {
                System.out.println("i: " + i);
            }
        }
    }
}
電腦風扇已經開始狂轉了~

2、Young OutOfMemory

設定XX: MaxTenuringThreshold為一個很大的值,使物件無法及時移入到年老代中,導致年輕代記憶體溢位。

3、MethodArea OutOfMemory

在經常生成大量Class的應用中,需要特別注意類的回收狀況。這類場景除了使用CGLib位元組碼增強和動態語言之外,常見的還有:大量JSP或動態產生JSP檔案的應用(JSP第一次執行時,需要編譯成Java類)、基於OSGi的應用(即使是同一個類檔案,被不同的類載入器載入也會視為不同的類)等。

4、ConstantPool OutOfMemory

一般來說是不可能的,只有專案啟動方法區記憶體很小或者專案中的靜態變數及其多時才會發生。

5、DirectMemory OutOfMemory

堆外溢位一般與NIO有關。

package com.test;

import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by littlewolf on 11/1/2016.
 */
public class Demo {
    public static void main(String[] args) throws Exception {
        List<ByteBuffer> buffers = new ArrayList<>();
        while( true ) {
            ByteBuffer buffer = ByteBuffer.allocate(1024 * 1024 * 1024);
            buffers.add(buffer);
        }
    }
}


6、StackOverflow

棧溢位一般與方法遞迴次數過多,或者方法中有產生大量資料的迴圈有關。

package com.test;

import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by littlewolf on 11/1/2016.
 */
public class Demo {
    public static void main(String[] args) throws Exception {
        new Demo().mtd();
    }

    public void mtd() {
        long time = System.currentTimeMillis();
        mtd();
    }
}



參考:點選開啟連結



相關文章