JVM学习笔记与调优实战(五):OOM测试实例与内存查看工具的使

2018-05-31  本文已影响32人  Vechace

标签: JVM


1、OOM测试实例:

package com.vechace.JVM;

import java.util.ArrayList;
import java.util.List;

/**
* 内存溢出
* -XX:+HeapDumpOutOfMemoryError
* -XX:HeapDumpPath=d:\tmp\jvm.dump
* -XX:+PrintGCDetails
* -Xms10M
* -Xmx10M
* @author vechace
*
*/
public class JVMTest3 {

    public static void main(String[] args) {
        List<Object> lists = new ArrayList<>();
        
        for(int i=0;i<100000000;i++){
            lists.add(new byte[1024*1024]);
        }

    }

}

JVM配置说明:

-XX:+HeapDumpOnOutOfMemoryError  :当发生内存溢出时,导出dump文件
-XX:HeapDumpPath=d:\tmp\jvm.dump2:设置dump文件的路径为d:\tmp\jvm.dump2
-XX:+PrintGCDetails:控制台打印详细GC信息
-Xms10M:设置虚拟机初始堆内存为10M
-Xmx10M:设置虚拟机最大堆内存为10M
dumpdump

2、StackOverflow栈溢出:

package com.vechace.JVM;

/**
* Description:查看线程栈大小
* @author vechace
*
*/
public class JVMTest4 {
    
    //计算递归调用次数
    static int count = 0;
    /**
     * 递归查看栈深度
     */
    static void foo(){
        count++;
        foo();
    }

    public static void main(String[] args) {
        try{
            foo();
        }catch(Throwable t){
            System.out.println(count);
            t.printStackTrace();//栈溢出,递归调用过深
        }

    }

}

结果1:

38084
java.lang.StackOverflowError
    at com.vechace.JVM.JVMTest4.foo(JVMTest4.java:17)
    at com.vechace.JVM.JVMTest4.foo(JVMTest4.java:17)
    at com.vechace.JVM.JVMTest4.foo(JVMTest4.java:17)
    at com.vechace.JVM.JVMTest4.foo(JVMTest4.java:17)
    at com.vechace.JVM.JVMTest4.foo(JVMTest4.java:17)
    ......



调整JVM参数-Xss512M,设置栈起始内存为512M,再运行程序。

结果2

33526899
java.lang.StackOverflowError
    at com.vechace.JVM.JVMTest4.foo(JVMTest4.java:17)
    at com.vechace.JVM.JVMTest4.foo(JVMTest4.java:17)
    at com.vechace.JVM.JVMTest4.foo(JVMTest4.java:17)
    at com.vechace.JVM.JVMTest4.foo(JVMTest4.java:17)
    at com.vechace.JVM.JVMTest4.foo(JVMTest4.java:17)
    at com.vechace.JVM.JVMTest4.foo(JVMTest4.java:17)
上一篇 下一篇

猜你喜欢

热点阅读