问题出现原因:在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
后续问题思考
栈内存占用过高,我发现在自己的代码中循环嵌套层数过多有关,所以也可以从代码角度处理这个问题,就不做细讲,好好再撸一下自己代码吧