点击某个API时,JVM直接重启了
在开发环境和本地这个API都没问题。但是在测试环境,一点击某个API,整个服务直接重启。
JVM日志
并没有在测试环境中找到jvm日志,应该是没配置打印日志。
复制测试环境的VM 配置到本地,浮现bug
复制了JVM的VM配置到本地的idea,重启本地服务。打开JConsole监控JVM内存使用情况。
JConsole中gc异常
发现点击API时瞬时内存占用异常高(有大对象,集合)。gc数量增加2次,但是并没有效果。伊甸园区内存,总内存占用几乎不变。
这里推测是还在使用过程中,不符和gc回收对象的条件。
也就是这个API占用内存本身就多。
解决
这里分批次进行处理。每个批次处理完后,手动置空大对象。
结果
再次重启后,发现该API运行中还是存在2次gc,但是gc效果明显。gc后内存有效释放,不在堆溢出重启服务。
学习JVM参数配置
1.拿到JVM的启动参数可以从容器配置的yml中拿取;
也可以使用命令:
ps -ef|grep java
2. 拿到JVM启动参数后可以向chatgpt提问,参考参数设置是否合理,以下是gpt的建议:
在这些参数中,大部分的设定都是合理的。不过有一个参数可能需要调整,那就是-XX:ParallelGCThreads=4,因为你的机器有12核,所以这个参数可以设置为12,这样可以充分利用CPU资源进行垃圾收集。另外,元空间的大小也可能需要根据实际情况进行调整。如果你的应用有大量的类或者大量的动态生成类,可能需要增大元空间的大小。
参考文章:
https://zhuanlan.zhihu.com/p/679783776