作者:温思家羽绒家纺旗舰店 | 来源:互联网 | 2023-09-12 10:56
我们将探讨触发StackOverFlowError的原因以及解决该错误的潜在解决方案。线程按执行顺序将执行的方法,原始数据类型,对象指针,返回值添加到其堆栈帧中。此信息也将推入相同
堆栈溢出错误是常见的JVM错误之一。 在这篇博客文章中,让我们学习线程堆栈的内部机制。 研究启动堆栈溢出错误的原因以及解决该错误的潜在解决方案。
为了更深入地了解堆栈溢出错误,让我们回顾一下这个简单的步骤。
publicclasssimpleexample { publicstaticvoidmain (string args [ ] ) a ); }公共静态void a () {int x=0; b (); }公共静态void b () {Car y=new Car ); c ); }公共静态void c () {float z=0f; system.out.println(Hello ); }这个程序非常简单,有以下执行代码。
首先调用main (方法main )方法来调用a ) )方法。 a (在方法中,整数变量“x”初始化为值0。 调用a (方法又是b ) )方法。 b )在方法内部,构建Car对象并将其分配给变量y。 调用b (方法又是c ) )方法。 c )在方法内部,浮点变量' z '初始化为值0。还请参见: Java的最新变化和下一步:“ OpenJDK是Java的未来”
现在,让我们回顾一下执行上述步骤时背后发生的事情。 APP应用程序中的每个线程都有自己的堆栈。 每个堆栈都有多个堆栈框架。 将线程按执行顺序执行的方法、原始数据类型、对象指针和返回值添加到堆栈框架中。
图1 :线程堆栈框架
在步骤1中,main (方法被推入APP应用程序线程的堆栈中。
在步骤2中,a (方法被推入到APP应用程序线程的堆栈中。 a ) )方法中,原始数据类型' int '被定义为值0,并赋给变量x。 此信息也被推入同一堆栈框架中。 请注意,数据“0”和变量“x”已被推入线程的堆栈框架中。
在步骤3中,b (方法被推入线程的堆栈中。 b )方法创建“汽车”对象并将其分配给变量“y”。 请注意," Car "对象是在堆中上创建的,而不是线程的堆栈。 只有对Car对象的引用y存储在线程的堆栈框架中。
步骤4:c ) )方法推入线程的堆栈。 c ) )方法中,原始数据类型' float '定义为值0f,并赋给变量z。 此信息也会推送到同一堆栈框架中。 请注意,这两个数据“0f”和变量“z”被推入线程的堆栈框架中。
每个方法执行完成后,删除方法和变量/对象指针,如图2所示。
图2 :执行方法后的线程堆栈框架
堆栈溢出错误的原因是什么? 如您所见,线程堆栈包含正在运行的方法、原始数据类型、变量、对象指针和返回值。 所有这些都消耗内存。 线程的堆栈大小超过分配的内存限制时,将发生堆栈溢出错误。 看看导致堆栈溢出错误的越野车程序。
publicclasssofdemo { publicstaticvoida () {//buggy line.it will cause method a ) } tobecalledinfinitenumberoftimes.a ); } publicstaticvoidmain (string args () a ); }此程序调用main (方法为a )方法。 a )方法递归调用自身。 此实现将导致a ) )方法调用无限次。 在这种情况下,a ) )方法将无限次添加到线程的堆栈帧中。 因此,经过成千上万次迭代后,线程的堆栈大小将超出限制。 如果超出堆栈大小限制,将发生堆栈溢出错误。
exceptioninthread ' main ' Java.lang.stackoverflowerroratcom.buggy app.stack overflow.so fdemo.a (atcom.bugy app ) com.buggy app.stack overflow.sofdemo.a ) ) so fdemo.a ) ) so atcom.buggy app.stack overflow.so fdemo.so fdemo.a ) ) sofdemo.a ) ) so atcom.buggy app.stack overflow.so fdemo.a (so fdemo.Java :7 ) atcom. ) so atcom.buggy app.stack overflow.so fdemo.a (so fdemo.Java :7 )图3 :堆栈overflow error进度
堆栈溢出错误有哪些解决方案? 解决堆栈溢出错误有两种策略。
还请参见: Java应用程序的远程调试
1 .修改代码时,线程堆栈可能会变得很大,因为它会进行不终止的递归调用,如上例所示。 在这种情况下,必须修改导致递归循环的源代码。 出现“堆栈溢出错误”时,将打印递归执行的代码的堆栈跟踪。 此代码是启动调试和解决问题的好指针。 因此,在上面的示例中,它是“a ()”方法。
2 .增加线程堆栈大小(-Xss )探索需要增加线程堆栈大小的合理原因。 线程可能需要执行许多方法,也可能是由许多局部变量/已经由该线程执行的方法创建的。 在这种情况下,可以使用JVM参数“-Xss”来增加线程的堆栈大小。 必须在启动APP应用程序时传递此参数。
示例:
-Xss2m
这将线程的堆栈大小设置为2 mb。
您可能知道,默认线程的堆栈大小是多少? 因此,默认线程堆栈大小因操作系统、Java版本和供应商而异。
3:https://从jax enter.com/stack overflow error-causes-152027.html翻译
赛车每天赚1000的方法,线程的堆栈大小将超出限制。 如果超出堆栈大小限制,将发生堆栈溢出错误。
exceptioninthread ' main ' Java.lang.stackoverflowerroratcom.buggy app.stack overflow.so fdemo.a (atcom.bugy app ) com.buggy app.stack overflow.sofdemo.a ) ) so fdemo.a ) ) so atcom.buggy app.stack overflow.so fdemo.so fdemo.a ) ) sofdemo.a ) ) so atcom.buggy app.stack overflow.so fdemo.a (so fdemo.Java :7 ) atcom. ) so atcom.buggy app.stack overflow.so fdemo.a (so fdemo.Java :7 )图3 :堆栈overflow error进度
堆栈溢出错误有哪些解决方案? 解决堆栈溢出错误有两种策略。
还请参见: Java应用程序的远程调试
1 .修改代码时,线程堆栈可能会变得很大,因为它会进行不终止的递归调用,如上例所示。 在这种情况下,必须修改导致递归循环的源代码。 出现“堆栈溢出错误”时,将打印递归执行的代码的堆栈跟踪。 此代码是启动调试和解决问题的好指针。 因此,在上面的示例中,它是“a ()”方法。
2 .增加线程堆栈大小(-Xss )探索需要增加线程堆栈大小的合理原因。 线程可能需要执行许多方法,也可能是由许多局部变量/已经由该线程执行的方法创建的。 在这种情况下,可以使用JVM参数“-Xss”来增加线程的堆栈大小。 必须在启动APP应用程序时传递此参数。
示例:
-Xss2m
这将线程的堆栈大小设置为2 mb。
您可能知道,默认线程的堆栈大小是多少? 因此,默认线程堆栈大小因操作系统、Java版本和供应商而异。
3:https://从jax enter.com/stack overflow error-causes-152027.html翻译