【问题分析】: 在 1.7.0.Final 版本之前,默认客户端最多会给每个 Topic 的每个队列缓存 1000 条消息。假设每个 Topic 的队列数是 16 个(集群 2 主 2 备,每台 broker 上 8 个队列),该 Topic 下单条消息平均大小为 64 KB,那么最终该 Topic 在客户端缓存 的消息 Size:16 * 1000 * 64 KB = 1 GB。如果用户同时订阅了 8 个 Topic 都在客 户端内存缓存消息,最终占用内存将超过用户的 JVM 配置,导致 OOM。 原因 1: 依赖 1.7.0.Final 之前的 ons-client 版本,Topic 的平均消息大小超过 4 KB, 并且消息消费较慢容易在客户端内存缓存消息。 确认方式: 在 /{user.home}/logs/ons.log 能搜索到 OutOfMemory 关键字;或者通过 jmap -dump:live,format=b,file=heap.bin 命令确认哪些对象占用了大量内存。 恢复方案: 升级 ons-client 版本至 1.7.0.Final 或以上,同时给对应的 ConsumerBean 配 合 设 置 com.aliyun.openservices.ons.api.PropertyKeyConst#MaxCachedMess ageSizeInMiB 参数,然后重启应用。 原因 2: 依赖 1.7.0.Final 及以上的 ons-client 版本,默认最大消耗内存 512 MB(Group ID 订阅的所有 Topic 缓存总和);如果应用仍然出现 OOM 现象,可在 ConsumerBean 启动时,配置: com.aliyun.openservices.ons.api.PropertyKeyConst#MaxCachedMessageSizeInMiB 参数自行定义最大消耗内存(范围在 16 MB ~ 2048 MB)。 确认方式: 确认应用依赖的 ons-client 版本,并通过 JVM 确认给进程分配的内存大小。 恢复方案: 根据应用机器的内存使用清况给对应的 ConsumerBean 设置 com.aliyun. openservices.ons.api.PropertyKeyConst#MaxCachedMessageSizeInMiB 参 数,然后重启应用。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
涵盖 RocketMQ、Kafka、RabbitMQ、MQTT、轻量消息队列(原MNS) 的消息队列产品体系,全系产品 Serverless 化。RocketMQ 一站式学习:https://rocketmq.io/