栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

OutOfMemoryError 与 StackOverFlow 的底层逻辑

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

OutOfMemoryError 与 StackOverFlow 的底层逻辑

        在解决java内存溢出问题之前,需要对jvm(java虚拟机)的内存管理有一定的认识。

        OutOfMemoryError 是内存溢出,jvm把所有的对象实例以及数组都要在堆上分配,如果分配不下就会报此错误。

//OutOfMemoryError 示例:
List lst = new ArrayList();
while(true) {
	Object obj = new Object();
	lst.add(obj);
} 

        那么报这样的错误,就是检查代码中是否有循环创建对象的逻辑,或检查GC的状况。而调整堆大小的参数也就是如下图:

         

        而StackOverFlow是栈溢出,与Java栈(虚拟机栈)有关。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack frame)用于存储局部变量表、操作数栈、链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出动态栈的过程。在Java虚拟机规范中,对这个区域规定了两种异常状况:
1.如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;

//栈溢出示例:
public static void main(String[] args) {
	diGui(0);
}
	
public static String diGui(int count) {
	return diGui(count);
}

        那何谓深度?就是链路的长度,比如

public static void main(String[] args) {
	diGui(0);
}
	
public static String diGui(int count) {
	count++;
	System.err.println(count);
	return diGui(count);
}

        此时的深度便是一个进程能调用方法的次数11403

2.如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。同理。

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号