Java报错”VirtualMachineError”的原因以及解决办法

  • Post category:Java

VirtualMachineError是Java虚拟机错误的一种,它常常是由于虚拟机自身出现了无法处理的错误而导致的。这种错误通常表示Java虚拟机已经发现了一些不可恢复的系统错误,无法继续执行应用程序或者系统线程,只能让应用程序或者系统线程提早结束。

VirtualMachineError一般分为以下两种:

  1. OutOfMemoryError:表示虚拟机在申请内存时无法满足相关的要求,因此没有办法为你需要的对象分配内存空间。

  2. StackOverflowError:表示Java虚拟机栈已经满了,因为调用栈过深,导致无法继续执行。

对于OutOfMemoryError,可以通过调大jvm的内存空间来解决,示例如下:

  • 将Xms和Xmx的值调大,分别对应JVM初始化时分配给最小堆空间和最大堆空间的大小,即可解决OutOfMemoryError。
java -Xms1024m -Xmx1024m HelloWorld
  • 如果我们可能存在内存泄漏的风险,可以通过Jconsole这样的排查工具来帮助我们找到内存中的备份数据,并再次释放掉,以避免造成内存的浪费。

对于StackOverflowError,可以通过减小递归深度或调用栈的大小来解决,示例如下:

  • 减小递归深度。如果递归深度过深,在运行时就会抛出StackOverflowError,这时可以通过将递归深度改小来解决该问题。
public class StackOverflowTest {

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

    public static void test(int i) {
        if(i<10000){
            test(i+1);
        }
    }
}
  • 增大调用栈的大小。如果递归深度是无法控制或改变的,则可以通过增大调用栈的大小来扩大递归深度。
-Xss128m