RocketMQ与Dubbo相爱相杀引起的FullGC
在日常后端开发中,部分业务都是接收MQ消息,在消费消息的过程中,会调用外部的Dubbo接口,根据接口返回数据,做一些业务逻辑处理.如下图 上面会涉及两类线程,一类是MQ线程,一类是Dubbo线程. Dubbo接口调用超时也是经常会发生的事情,这篇文章中,我们模拟的情况是,让Dubbo接口调用超时,图中红线所示.然后一直向MQ消费者发送消息,我们观察线程和堆栈的变化. 仓库代码 https: //github.com/infuq/MQ-Dubbo-FullGC 如果需要运行上述代码,还需要部署Zookeeper和RocketMQ环境. 工程结构如下图 Dubbo提供者的接口超时时间设置的是5s.如下图 而在提供者的实现方法中,让线程睡眠20秒,从而达到调用者调用接口超时目的.如下图 接下来按顺序启动它们 首先启动Dubbo提供者(DubboProvider类). 接着启动MQConsumer, 同时需要给它配置VM启动参数 -Xms90M -Xmx90M -XX :+PrintGCDetails 最后启动MQProducer, 它会一直发送消息. 所有的都启动完成之后, 借助JDK自带的jvisualvm.exe工具观察MQConsumer的堆栈信息. 观察MQConsumer的堆栈信息,会发现老年代会一直增长,当老年代快增长到顶端时,手动dump堆栈信息,用于接下来分析堆的情况.