ConcurrentLinkedQueue 的outofMemory错误解决方案

期项目中碰到一个问题。

      一个线程从MQ中取得数据,置于一个队列A(ConcurrentLinkedQueue类型)中,其它线程从A中取出数据进行处理。程序在低速运行时没有问题。在进行压力测试时,200万条数据以4000条/秒的速度进入A后,程序崩溃dump出core文件。

    当时百思不得其解,经某大牛指点,可能是ConcurrentLinkedQueue没有对长度进行限制,在数据高速进入时导致队列A长度暴涨,进而吃光内存,导致程序崩溃。

   后将其改成LinkedBlockingQueue可以解决程序崩溃的问题

  后在国外论坛上查到如下内容

The size of a ConcurrentLinkedQueue is unbounded, so if producers are putting in items faster than consumers can remove them, eventually it will eat up your memory indeed. If you want to limit the size of the queue, try a blocking queue, such as LinkedBlockingQueue or ArrayBlockingQueue instead. The size of the first can be optionally bounded, while the second is always bounded.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值