如何让TypeScript的Queue类无内存泄漏?Docker内存超限排查
关于TypeScript Queue类rawData数组是否会引发内存泄漏的疑问
export class Queue<T> { constructor( onNextItem: (data: T) => Promise<any>, onError: (error: Error) => void, ) { this.onNextItem = onNextItem this.onError = onError } private onNextItem: (data: T) => Promise<any> private onError: (error: Error) => void private rawData: T[] = [] private isWorking = false addToQueue(request: T) { this.rawData.push(request) if (!this.isWorking) this.initiateHandling() } getLength(): number { return this.rawData.length } private initiateHandling() { if (this.rawData.length === 0) { this.isWorking = false return } this.isWorking = true const nextRequest = this.rawData.shift() this.onNextItem(nextRequest) .then(() => { this.initiateHandling() }) .catch((err) => { this.onError(err) }) } }
我担忧上述Queue类中的rawData数组会引发内存泄漏:虽然我使用shift()移除元素,但onNextItem()执行耗时极短,数组大多为空,仅偶尔有短时间的addToQueue()调用。此外,运行该代码的Docker容器出现137错误(表示内存超限),这让我格外关注。请问我的担忧是否合理?
结论:你的担忧针对rawData数组本身并不合理,但需要排查其他可能导致内存超限的点
rawData不会引发内存泄漏:你在处理每个元素时都用shift()从数组头部移除了元素,这会让被移除的元素失去引用,最终会被JS垃圾回收机制清理。即使偶尔有批量添加,只要处理逻辑正常走完,数组里的元素都会被及时移除,不会持续占用内存。Docker 137错误的其他可能原因:
onNextItem内部可能存在内存泄漏:比如该函数里创建了未被及时清理的对象、订阅事件后未取消、或者打开了资源(如文件、网络连接)未释放,这些都会持续占用内存。- 短时间批量添加的
request对象本身过大:如果每个T类型的对象体积很大,短时间大量添加可能导致内存峰值超过Docker限制,即使后续被处理,峰值阶段也可能触发137错误。 - 错误处理逻辑的问题:当前代码中如果
onNextItem抛出错误,只会调用onError但不会继续处理队列剩余元素,这会导致rawData里未处理的元素一直留存,长此以往会占用内存。比如某次处理出错后,队列停止工作,后续添加的元素只会堆积在rawData里,最终撑爆内存。
建议排查方向
- 检查
onNextItem的实现,确认是否有未清理的资源或长期持有的引用。 - 给
onError逻辑加上继续处理队列的逻辑,比如在catch块里调用this.initiateHandling(),避免错误导致队列停滞、元素堆积。 - 监控
rawData的长度变化,如果出现持续增长的情况,说明队列处理逻辑有停滞问题。 - 检查Docker容器的内存限制是否合理,是否需要根据实际业务调整。
内容的提问来源于stack exchange,提问作者Eric Goerens
相关产品推荐
相关产品推荐

