前言
其实如果你真的能写出来堆、栈溢出,那你在开发时自然地会有意识去避免这种问题的发生。
废话少说,直接切入正题。
堆溢出
堆是什么
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
最后
作者能力有限,如果有写的不对的地方可以在评论区进行交流。
如果本文对你有帮助的话不妨点个👍呦。
分享技术,稳住,我们能赢💪!