VirtualMachineError是Java虚拟机错误的一种,它常常是由于虚拟机自身出现了无法处理的错误而导致的。这种错误通常表示Java虚拟机已经发现了一些不可恢复的系统错误,无法继续执行应用程序或者系统线程,只能让应用程序或者系统线程提早结束。
VirtualMachineError一般分为以下两种:
-
OutOfMemoryError:表示虚拟机在申请内存时无法满足相关的要求,因此没有办法为你需要的对象分配内存空间。
-
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