0

我有一个 JDBC 程序,它在一个表中插入大约 50000 行。我有这个程序的 2 个版本。第一个使用一个线程插入 50000 行,而第二个版本使用 5 个线程插入 50000 行(每个线程插入 10000 行)。

现在,当我对这两个程序进行分析时,我发现垃圾收集在使用 5 个线程时占用了更多的 CPU 周期(一个线程为 44256,而 5 个线程为 401836)。Profiler 还告诉我每个程序创建的对象数量几乎相同。

我想知道是什么让 GC 在多线程程序中花费更多周期。两个程序所做的工作是相同的(插入 50000 行),甚至对象的数量也相同。

谢谢马诺伊

4

1 回答 1

0

每个插入都可能在 JVM 中创建对象,这些对象以后必须进行垃圾回收。

如果您在多个线程中并行执行插入,那么您可能会获得比按顺序执行插入时更高的“吞吐量”(每秒插入次数)。

背景:这是因为每个单独的插入都需要往返于数据库,但如果您并行执行插入,则另一个线程可以在其他线程完成之前开始插入。

与单线程情况相比,多线程情况可能会在相同的时间内创建更多的垃圾对象。

许多垃圾收集器是分的。这意味着他们使用不会暂停 VM 的并发算法从包含最近分配(和丢弃)对象的内存池中回收内存 - 也称为“伊甸园空间”。伊甸园空间的大小通常是固定的。如果这个池填满的速度快于并发算法回收空间的速度,那么它可能会触发完整的垃圾回收(full GC),从而暂停整个 VM。

长话短说,您可能会在多线程情况下看到更高的 GC 开销,因为多线程为您的程序提供了更高的吞吐量。

附带说明:如果您想让您的程序更快,请查看JDBC 批处理 API。这些允许您在一次往返数据库中批量插入许多行。

于 2013-08-13T15:03:47.983 回答