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.