JVM调优常见栈异常-StackOverflowError

一、异常场景

StackOverflowError:在栈深度大于可用的栈深度时,会抛出此异常,在虚拟机设置中-Xss参数是用来设置栈大小的,该问题常见于递归中,一旦递归深度过高或者函数中局部变量过多,则有可能会出现此问题

二、影响因素

  1. 局部变量
    public static void testStackOverFlow(long a,long b,long c){
        long d=0,e=0,f=0;//占用栈空间
        testStackOverFlow(a,b,c);//相同栈大小情况下 调用次数会减少
    }
    public static void testStackOverFlow(){
        testStackOverFlow();
    }

总结:对于一个函数,它的参数越多,内部局部变量越大,它的栈帧就越大,其嵌套调用次数就越少
优化方法:递归:局部变量中的子空间是可以重用的,因为局部变量的作用方位可以不在整个方法体中例如:

   public static void testStatck1(){
        {
            byte[] a=new byte[1024*1024];
            //在方法体没运行结束前 a会一直不被释放
        }
    }
    public static void test(){
         testStatck1();
         //总是可以回收testStatck1中的 a,因为上层函数testStatck1的栈帧已经被销毁,则栈帧中的局部变量表也会被销毁,a自然会被回收
    }
   public static void testStatck(){
        {
            byte[] a=new byte[1024*1024];
            //此处注意如果作用于方法体中的变量少于此块中的局部变量 需要手动释放内存,例如方法体中没有b变量,则要设置a=null,将a的局部变量表销毁;
            //局部变量中的字会影响GC回收,如果这个字没有被后续代码复用,那么它引用的对象不会被GC释放
            //a=null;
        }
        long b=0;//b会复用a的子空间
    }
 
  1. -Xss :调大Xss参数
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值