我在应用程序中追逐一些内存问题,该应用程序从kafka队列中提取文件名并对每个文件进行一些处理。这个应用程序在Docker中运行,带有一个实例/分区。
每个实例都有一个使用者句柄,用于检索下一个文件名并将其放入 ArrayBlockingQueue 。同时,有几个线程从该队列中获取下一个文件并进行处理。我使用这个辅助排队,因为每个文件可能需要一些时间来复制和处理(有#34;指数退避的实例"使用IE线程可能正在休眠)所以看起来谨慎有几个' in管道'同时进行。
我的问题是关于这样做的相对好处(w / re memory mgmt)(从共享队列中读取几个永久性线程)与为每个文件启动新线程从队列中拉出来。在这个替代轨道中,我想象一个 FixedThreadPool ,当每个文件都是从kafka中提取的时候会生成一个新线程。
一种方法与另一种方法相比有什么优势吗?
我主要担心的是最小化GC时间。我想避免任何实质性的发送给老一代。这让我觉得第二种模式是更好的方式。