gpt4 book ai didi

Java 线程在处理结束时变慢

转载 作者:搜寻专家 更新时间:2023-11-01 03:25:07 24 4
gpt4 key购买 nike

我有一个 Java 程序,它接受一个包含文本文件列表的文本文件并分别处理每一行。为了加快处理速度,我使用带有 24 个线程的 FixedThreadPool 的 ExecutorService 的线程。该机器有 24 个内核和 48GB RAM。

我正在处理的文本文件有 250 万行。我发现前 230 万行左右的代码在 CPU 使用率很高的情况下运行良好。然而,超过某个点(大约 2.3 行),性能下降,只使用一个 CPU,我的程序几乎停止运行。

我调查了很多原因,确保我所有的文件句柄都已关闭,并增加了提供给 JVM 的内存量。然而,无论我改变什么,性能总是会下降到最后。我什至尝试过包含较少行的文本文件,但在处理文件结束时性能再次下降。

除了标准的 Java 并发库外,该代码还使用 Lucene 库进行文本处理和分析。

当我不对这段代码进行线程化时,性能是恒定的,并且不会在最后退化。我知道这是在黑暗中开枪,很难描述发生了什么,但我想我只想看看是否有人对最终导致性能下降的原因有任何想法。

编辑

收到评论后,我粘贴了堆栈跟踪 here .如您所见,似乎没有任何线程正在阻塞。此外,在分析时,当事情变慢时,GC 不是 100%。事实上,大部分时间 CPU 和 GC 利用率都为 0%,CPU 偶尔会出现峰值以处理一些文件然后再次停止。

线程执行代码

 BufferedReader read = new BufferedReader(new FileReader(inputFile));
ExecutorService executor = Executors.newFixedThreadPool(NTHREADS);
String line;
while ((line = read.readLine()) != null) { //index each line
Runnable worker = new CharikarHashThreader(line, bits, minTokens);
executor.execute(worker);
}
read.close();

最佳答案

这听起来很像垃圾回收/内存问题。

当垃圾收集运行时,它会暂停所有线程,以便 GC 线程可以在不改变任何事情的情况下进行“这是可收集的垃圾”分析。当 GC 运行时,您会看到只有 1 个线程处于 100%,其他线程将停留在 0%。

我会考虑添加一些 Runtime.freeMemory() 调用(或使用分析器)以查看在 GC 期间是否发生“停止”。

我还会尝试仅在文件的前 10k 行上运行您的程序,看看是否可行。

我还会查看您的程序是否在应该使用 StringBuilder 时构建了过多的中间字符串。

我觉得您需要分析内存使用情况。

关于Java 线程在处理结束时变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16064544/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com