• nested exception is java.lang.StackOverflowError解析


    背景介绍:

    项目是微服务的,使用docker容器,使用jenkins部署。测试环境有个公共服务一直以来都能正常发布,突然有一天不行了,经常发布失败,然后多发布几次就好了。

    报错如下:

     是栈溢出了,一般是新代码有死循环会出现。但是本地启动没问题并且环境上多发几次也能成功,说明没有死循环,肯定是其他原因。

    分析问题:

    Java运行时数据区分5部分:

     从报错上来看是虚拟机栈溢出。

    虚拟机栈是属于线程私有的,每个线程都会有一个虚拟机栈,随线程的创建而创建,消失而消失。它由一个个的栈帧组成,线程每次调用一个方法,就会有一个栈帧生成,并压栈。方法调用完之后,栈帧则出栈。当栈的深度不够,即栈的大小不足以放下所有的栈帧的时候,就会抛栈溢出的异常。

    问题明确了,是栈的大小不够。

    解决问题:

    要把栈大小设置的大一点,要设置的大一点首先要知道目前是多大。项目未对虚拟机栈的大小作设定,也就是说目前的大小是默认值。

    JDK5之后每个栈大小是1M,之前是256k。我们用的是JDK8,那么大小就是1M。要把栈大小设成大于1M的值。但是又不能设置太大,因为如果单个线程栈太大,就会限制最大线程数量。

    项目没有高并发的情况,所以就先设置成2M。设置方法,在JVM启动参数里面加上 -Xss2m

    问题解决,再也没出现过问题。

  • 相关阅读:
    2020.11.21日记
    Miller-Rabin质数测试
    Deepin配置记录
    shell
    module load
    vma
    DRDI
    Android.mk
    AEE
    阿里云下配置二级域名的解析设置
  • 原文地址:https://www.cnblogs.com/sam-uncle/p/12550806.html
Copyright © 2020-2023  润新知