Java 为什么我的程序的第一部分会减慢第二部分的速度?垃圾收集慢?

Java 为什么我的程序的第一部分会减慢第二部分的速度?垃圾收集慢?,java,postgresql,Java,Postgresql,我的程序如下所示: String intermediateResult = foo(int depth, String input); String finalResult = bar(intermediateResult); ->“foo()”连接到postgres数据库,并根据输入和指定的深度构造树和图形,深度越高,foo的计算时间越长,内存使用率越高,因为将构建更复杂的数据结构 ->“bar()”接受“foo()”的输出,它类似于SQL查询,并执行更多的数据库操作,基本上验证了“foo(

我的程序如下所示:

String intermediateResult = foo(int depth, String input);
String finalResult = bar(intermediateResult);
->“foo()”连接到postgres数据库,并根据输入和指定的深度构造树和图形,深度越高,foo的计算时间越长,内存使用率越高,因为将构建更复杂的数据结构

->“bar()”接受“foo()”的输出,它类似于SQL查询,并执行更多的数据库操作,基本上验证了“foo()”的结果

问题:


为什么即使返回完全相同的中间结果,“bar()”的计算时间也会受到“foo()”计算深度的影响?Java垃圾收集是否需要更多时间来清理“foo()”留下的数据结构?还是因为数据库?

你是如何对《纽约时报》进行基准测试的?您是否在打印之前、之间和之后打印了系统时间?这需要相当多的时间,最多相差30秒。我使用计时器来对精确的时间进行基准测试,但我也有log4j输出来跟踪程序状态。你能试着用
System.currentTimeMillis()
来代替吗?性能问题的原因最好用分析器来确定。如果程序不是琐碎的,猜测性能问题的原因不是一种有效的方法。我同意你应该使用分析器。根据GC的影响,我怀疑单个GC会增加30秒。有没有可能第一阶段创建的对象在第二阶段开始时仍然处于活动状态,从而导致内存不足,导致多次调用GC?要验证这一点,请修改代码以在第一阶段之前打印自由内存量,在第1阶段之后添加强制GC,然后打印新的自由内存。如果第二次打印的内存非常低,并且非常接近可用的内存,那么这将是您的问题。