1.业务场景介绍:
使用Springboot项目进行activityMQ的接入。把消息分发到另外两个地方:rocketMQ和DataHub。实现数据的传输。并保证数据的一致性。
2.问题介绍
代码写完。运行后。发现没过多久项目就报错。java.lang.OutOfMemoryError: unable to create new native thread
3.问题排查
使用工具jvisualvm进行排查.工具是安装jdk后自带的。
我的Mac路径是在/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/bin/jvisualvm
找不到可以用find命令进行查询:find / -name jvisualvm
双击启动后的页面如下。
然后找到需要排查的本地项目进程。open it.
从上图可以看到问题有哪些?
a.cpu占用比较高。一直不停的在使用cpu资源。40%到55%左右。
b.使用的内存也很好。jvm回收不过来。
c.线程数量也在不断增加。开始1000多到2000+。这是很不合理的。
4.优化结果
这样我们就可以看到是多线程的问题引起的。经过一两个小时的优化。具体代码不好展示。😄我们来看看优化后的monitor监控情况如何:
对比不难看出来。优化的结果还是很棒的。已经达到了我们想要的效果。
a.cpu也不会占用太高。
b.也没有报java.lang.OutOfMemoryError: unable to create new native thread异常了。
c.线程数量也是比较小的数量。稳定在一个水平下。
5.排查工具jvisualvm的其他功能分享
查看jvm 的参数
也可以看线程查问题原因。
当然还可以打heap dump 和Thread dump.用来分析dump文件来定位问题的原因。
最后感谢大家的支持。希望能帮助到大家。。