1、问题现象

img

img

2、内存分析

img

img

img

img

img

3、问题分析

3.1、问题一

根据上述内存对象分析出是同步微信客户的JOB执行时产生的数据,但是同步微信客户的JOB每天凌晨1点执行,为什么今天15:30还在执行?

根据内存快照中的数据,查询日志发现,wxfe9d9163861a7cf4(广州壳牌)公众号一共有335w+的数据,从凌晨1点一直执行到15:30

img

3.2、问题二

内存快照中显示List中有1000w+的openId,这个数据怎么来的?

img

img

img

上述代码的流程是:每次查10000个openId,然后每次根据100个openId查询微信客户信息,然后处理这100个微信客户信息。看代码似乎没有内存泄漏的地方。

img

每次处理100个公众号粉丝时,会把这些客户的openId放入redis的队列中

img

全部公众号用户处理完后,会合并公众号用户和小程序用户,此时会从redis中取出队列中的所有值,按理应该是335w+的openId,但是现在内存里有1000w+的openId。

4、问题原因

redis的key的有效期是12小时,但由于该公司同步微信客户耗费14.5个小时,一直到15:30才执行完,这就导致redis的key需要到第二天3:30才会过期,但JOB在1点就执行了,所以JOB执行的时候key没过期,造成redis重复放了数据,从12.9-12.13,每天执行1次,一共执行了4次,所以redis中有1000w的openId

img

5、处理

暂停同步微信粉丝JOB执行,影响:新授权的公众号,粉丝不会自动同步到F6系统

6、后续

1、有海量微信粉丝的客户,我们需要何时,采用何种发放同步数据?

2、是否有必要每天同步全量的微信粉丝?

3、同步微信粉丝JOB的效率如何提升?