面试官:你能给我写个堆、栈溢出吗?

571 阅读1分钟

前言

其实如果你真的能写出来堆、栈溢出,那你在开发时自然地会有意识去避免这种问题的发生。

废话少说,直接切入正题。

img

堆溢出

堆是什么

Java 堆是 JVM 内存管理中最大的一块,所有的线程共享这一块内容,同时该部分也是垃圾收集器的主要区域。

装什么

不存放基本类型和对象引用,全装 new 出来的对象本身,各个对象都包含一个与之对应的 class 的信息。

可调配 VM options(虚拟机参数)

-Xms60M -Xmx60M

无限新建它

public static void main(String[] args) {
    List<Object> list = new ArrayList<>();
    while(true){
        // 每循环一次会新建对象(有效范围只在循环里),并且上次的引用变量会丢失(垃圾回收机制会进行回收)。
        list.add(new Object());
        // 无限给 list 加对象
    }
}

运行报错:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

栈溢出

栈是什么

Java 虚拟机栈主要是利用栈先进后出的特性存储局部变量表,动态链接等,主要包括堆内存和栈内存。

装什么

存放局部变量和栈帧(main)。

无限使用它

public static void main(String[] args) {
    method();
}

public static void method(){
    // 栈溢出异常(方法递归,不让它出栈)
    method();
}

运行报错:Exception in thread "main" java.lang.StackOverflowError

最后

作者能力有限,如果有写的不对的地方可以在评论区进行交流。

如果本文对你有帮助的话不妨点个👍呦。

分享技术,稳住,我们能赢💪!