我有一个JDBC程序,可以在表中插入大约50000行。我有这个程序的2个版本。第一个使用一个线程插入50000行,而第二个版本使用5个线程插入50000行(每个线程插入10000行)。
现在,当我对这两个程序进行分析时,我发现当使用5个线程时,垃圾收集会占用更多的CPU周期(一个线程为44256,5个线程为401836)。 Profiler还告诉我,每个程序创建的对象数量几乎相同。
我想知道是什么让GC在多线程程序中采取更多循环。两个程序完成的工作是相同的(插入50000行),甚至对象的数量也是相同的。
由于 的Manoj
答案 0 :(得分:0)
每个插入都可能在JVM中创建对象,以后必须对其进行垃圾回收。
如果您在多个线程中并行执行插入操作,那么您可能会获得比顺序执行插入操作时更高的“吞吐量”(每秒插入数)。
背景:这是因为每个单独的插入都需要往返数据库,但如果你并行插入,那么另一个线程可以在往返完成之前启动插入。< / em>的
多线程案例可能会在比单线程案例相同的时间内创建更多垃圾对象。
许多垃圾收集者都是generational。这意味着它们使用并发算法,这些算法不会暂停VM以从包含最近分配(和丢弃)的对象(即“eden space”)的内存池中回收内存。伊甸园的空间通常是固定的。如果此池的填充速度快于并发算法可以回收空间,那么它可以触发完整的垃圾收集(完整的GC),这会暂停整个VM。
总而言之,在多线程情况下,您可能会看到更高的GC开销,因为多线程会为您的程序提供更高的吞吐量。
作为旁注:如果您想让程序更快,请查看JDBC batch APIs。这些允许您在数据库的单次往返中批量插入许多行。