对于现在的我而言,虚拟机就好像黑盒子一样,无法深入查看。
只会简单的通过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