StackOverFlowError和OutOfMemoryError的原因和处理方法

对于现在的我而言,虚拟机就好像黑盒子一样,无法深入查看。
只会简单的通过jconsole等工具查看一下
在这里插入图片描述
从我接触的最能直接可见反馈虚拟机的异常的就只有StackOverFlowError和OutOfMemeryError这两种异常。

有可能会问,虚拟机的内存不是动态分配自动回收的吗?

是的,这只是简化了程序员写代码的复杂性,不需要每次都考虑对象的回收和内存控制,但是一样会存在内存崩溃的情况。
想想虚拟机申请内存收到物理内存的限制,如果应用产生的对象非常多,而且都非常重要不能让虚拟机回收的,那超出了内存一样会崩溃。

下面言归正传:

一、StackOverFlowError

先来分析一下StackOverFlowError异常,这个异常相对比较简单出现的概率比较低:

1、原因

1.1、发生的地方:虚拟机栈和本地方法栈
1.2、线程调用生成的栈桢深度超过了虚拟机允许的深度(比如一个方法A内调用了方法B,然后B又调用C...这样调用了1万层,就像你要去地狱十八层,但是虚拟机只提供了到九层的梯子),不过现在大多数虚拟机栈的调动深度都是可以动态扩展的,所以这个问题出现的概率非常的低。

2、办法

2.1、我还遇到什么好的解决办法

二、OutOfMemeryError

1、发生的地方:

1.1、基本上虚拟机的运行时数据区域(堆,栈,方法区)都会发生

2、发生的原因

2.1、内存不够,发生了内存溢出

3、办法

3.1、申请更多内存,调整虚拟机的启动参数
-Xms1500m -Xmx1500m -XX:PermSize=125M -XX:MaxPermSize=256M
发布了63 篇原创文章 · 获赞 8 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq125281823/article/details/104491377