关于内存溢出

内存溢出

当时蚂蚁金服电话面试打过来的时候我刚好在洗澡,我对电话里头的人说:“我在洗澡,能等下再打过来吗?”

面试这段时间真的是尬聊,原因在于这个寒假我没有好好为面试做准备。其中电话里提到一个问题:有什么方法可以让Java程序内存溢出。

Emmmmmmm...

讲道理,我以前从来没有想过这种问题,之前看过一本书,里面有讲如何制造内存溢出,我当时觉得现在硬件发展这么快,怎么会出现内存溢出嘞?所以直接翻页了。

好,我要好好研究一下内存溢出。

StackOverFlow

所谓StackOverFlow,就是栈溢出,最容易在用到方法嵌套的场景里抛出。所以也很好理解这个Stack是指哪里的Stack。

因为每个线程创建后,JVM就会给线程分配Java虚拟机栈、本地方法栈和pc寄存器。然后方法的初始化相当于在虚拟机栈内创建一个帧,方法的调用和返回参数相当于入栈出栈(方法内的局部变量的初始化就是在帧中分配内存空间)。这样一来,方法无限递归就会出现Java虚拟机栈内存溢出。

public class Test {
    public static void main(String... args) {
        Test test = new Test();
        test.hello();
        // Exception in thread "main" java.lang.StackOverflowError

    }
    
    // 递归
    public void hello() {
        hello();
    }
}

OutOfMemoryError

OutOfMemory是指内存溢出。在JVM启动项中添加-Xmx5m即可轻松抛出该异常,JVM中,-Xmx5m指的是设置JVM虚拟机运行时Java堆最大内存空间为4MB,还有一些常用的参数比如-Xss(单个线程的虚拟机栈空间大小) -Xms(JVM虚拟机运行时Java堆最小内存空间) -Xmn(设置年轻代大小)。


// JVM启动参数添加-Xmx5m
public class Test {
    public static void main(String... args) {
        
        // 用于存放实例化的对象,不然会被CG机制清理掉
        LinkedList<Test> list = new LinkedList<>();
        
        while(true) {
            list.add(new Test());
            //java.lang.OutOfMemoryError: Java heap space

        }
        
    }
}

猜你喜欢

转载自my.oschina.net/StupidZhe/blog/1786764