Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java线程和内存管理-短期与长期_Java_Multithreading_Memory Management - Fatal编程技术网

java线程和内存管理-短期与长期

java线程和内存管理-短期与长期,java,multithreading,memory-management,Java,Multithreading,Memory Management,我在一个应用程序中追踪一些内存问题,该应用程序从卡夫卡队列中提取文件名,并对每个文件名进行处理。此应用程序在Docker中运行,带有实例/分区 每个实例都有一个使用者句柄,用于检索下一个文件名并将其放入ArrayBlockingQueue。同时,有几个线程从这个队列中获取下一个文件并进行处理。我使用这个二级队列,因为每个文件可能需要一些时间来复制和处理(存在使用“指数退避”的实例,即线程可能正在休眠),因此同时有几个“在管道中”似乎是谨慎的 我的问题是这样做的相对好处(w/re内存管理)(几个“

我在一个应用程序中追踪一些内存问题,该应用程序从卡夫卡队列中提取文件名,并对每个文件名进行处理。此应用程序在Docker中运行,带有实例/分区

每个实例都有一个使用者句柄,用于检索下一个文件名并将其放入ArrayBlockingQueue。同时,有几个线程从这个队列中获取下一个文件并进行处理。我使用这个二级队列,因为每个文件可能需要一些时间来复制和处理(存在使用“指数退避”的实例,即线程可能正在休眠),因此同时有几个“在管道中”似乎是谨慎的

我的问题是这样做的相对好处(w/re内存管理)(几个“永久”线程从共享队列中读取)与从队列中取出每个文件时为其启动一个新线程相比。在这个替代路径中,我会想象一个FixedThreadPool,当每个文件都从kafka中提取时,它会生成一个新线程

一种方法与另一种方法相比有什么优势吗


编辑:
我主要关心的是最小化GC时间。我希望避免将任何实质性的内容发送给old-gen。这使我认为第二种模式是一种更好的方式。

您可能需要研究执行器和线程池实现,为每个文件生成新线程可能会使限制最大线程数变得困难,因此,您可能会耗尽内存或一次占用的CPU资源超过可接受的数量。@ammoQ使用FixedThreadPool,我可以控制活动线程的数量。哦,我错过了这一部分,很抱歉造成混淆使用FixedThreadPool几乎与“为每个文件启动新线程”完全相反