JNI加载so库运行出现stack overflow

1 篇文章 0 订阅

问题出现原因:在kylin和uos的系统中通过JNI加载了在平台中编译的so库文件,Spring Boot打包通过java -jar启动测试都运行正常,在实际环境中出现报错:

An irrecoverable stack overflow has occurred. 
Please check if any of your loaded .so files has enabled executable stack (see man page execstack(8))

在一些帖子中找到了几种解决方式:

1.系统中运行ulimit -c unlimited

实际测试没有作用。

2.execstack编译,需要首先sudo apt-get install execstack安装,再执行execstack -s /usr/lib/libTest.so编译库文件

实际测试没用作用。

3.通过修改启动jvm的参数

原来的启动脚本中,参数是:

-Xms128m -Xmx1024m -XX:PermSize=64M -XX:MaxNewSize=128m -XX:MaxPermSize=128m

实际通过查找资料发现在运行中报错可能是栈内存不足,找到JVM中的-Xss参数(栈内存大小),默认是设置单个线程栈大小,一般默认512~1024kb。单个线程栈大小跟操作系统和JDK版本都有关系,-Xss = -XX:ThreadStackSize。
尝试修改参数为默认最大边界:

-Xms128m -Xmx1024m -Xss1m -XX:PermSize=64M -XX:MaxNewSize=128m -XX:MaxPermSize=128m

发现还是报错,然后再次修改1m为10m,执行成功,不再报错

-Xms128m -Xmx1024m -Xss10m -XX:PermSize=64M -XX:MaxNewSize=128m -XX:MaxPermSize=128m
后续问题思考

栈内存占用过高,我发现在自己的代码中循环嵌套层数过多有关,所以也可以从代码角度处理这个问题,就不做细讲,好好再撸一下自己代码吧

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值