OutOfMemory 测试

/**
 *  可以触发内存溢出的类,生成headdump文件,分析溢出原因
 * 
 *  jvm参数:-Xmx100m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\logs
 *  -XX:+HeapDumpOnOutOfMemoryError:在内存溢出时输出 headdump日志。
 *  -XX:HumpDumpPath=D:\logs dump文件路径,文件名为:java_pid${进程号}.hprof
 *
 *  输出的文件可以通过visualvm 或 EclipseMemoryAnalyzer 分析
 *
 */
public class OOM implements Runnable {
    byte [] data = null;
    public OOM(){
        data = new byte[1024*1024];
    }
    @Override
    public void run() {
        LockSupport.park();
    }

    public static void testOOM(){
        FixedThreadPool fixedThreadPool =  new  FixedThreadPool(1);
        //FixThreadPool内部是ThreadPoolExecutor
        for(int i=0;i<1000;i++){
            fixedThreadPool.execute(new OOM());
        }
    }
    public static void main(String args []){
        OOM.testOOM();
    }

}

  输出:

  

java.lang.OutOfMemoryError: Java heap space
Dumping heap to D:\logs\java_pid9344.hprof ...
Heap dump file created [98084663 bytes in 0.095 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at code.example.base.oom.OOM.<init>(OOM.java:10)
	at code.example.base.oom.OOM.testOOM(OOM.java:20)
	at code.example.base.oom.OOM.main(OOM.java:24)

  visualvm分析:

    

  

 

EclipseMemoryAnalyzer分析:



 

   分析结果:线程池中的队列占用空间过大导至内存溢出。

猜你喜欢

转载自java12345678.iteye.com/blog/2406014