垃圾收集器问题

时间:2010-09-27 06:08:53

标签: java garbage-collection

我有数据库连接。 问题是当我执行“next()”从DB获取数据时,为什么垃圾收集器同时运行。 GC的原因,从DB收集数据是如此之慢。 我该如何解决这个问题?

3 个答案:

答案 0 :(得分:7)

垃圾收集器正在运行,因为在没有足够的可用内存时,某些东西(在这种情况下,可能是数据库连接堆栈)正在尝试分配对象。这是正常行为,你不能完全阻止它。

第一个问题是,这个真的会导致显着放缓吗?你提出的最少证据是不能令人信服的。正如评论所指出的那样,慢查询并不是GC相关问题的证据,更不用说GC导致查询缓慢。实际上,它可能是另一种方式。查询设计不佳可能是GC活动水平高的原因;见下文第3点。

第二个问题是,为什么这会引起明显的放缓?有三种可能性:

  1. 只是你的堆可能太小了。如果你可以运行大堆,那么JVM效果最好,GC效率最高。如果使用小堆运行,则GC会更频繁地运行,并且每个对象回收的时间会相应增加。您可以使用JVM选项“-Xmx”和“-Xms”来增加堆大小;在手册中查找它们。

  2. 您的应用程序可能存在内存泄漏。随着时间的推移,这将导致越来越多的堆被无用(但不是垃圾收集)对象填充。随着堆接近满,GC将越来越频繁地运行,花费的时间越来越长。最终,应用程序将死于OutOfMemoryError。解决此问题的正确方法是查找并修复内存泄漏。有一些“bandaid”解决方案,例如增加堆,并使用某个JVM选项导致JVM在超过给定百分比的时间用于垃圾收集时退出。

  3. 您的应用程序可能只是在从数据库中获取查询结果时生成大量对象。如果是这种情况,增加堆大小将有所帮助。但是,您确实需要详细查看正在执行的数据库查询,以查看是否有某种方法可以减少从数据库中检索的数据量。你可以通过在数据库方面做更多的工作来减少它吗?

  4. 最后,一旦解决了上述三种可能性,您就可以通过启用并行GC来进一步改进。只有在多核计算机上运行时,这才有用。

答案 1 :(得分:0)

测试它是否真的是垃圾收集器:增加堆空间(-Xmx512m甚至更高,具体取决于你的实际设置),如果它是gc,那么问题很有可能得到解决。 / p>

答案 2 :(得分:0)

我认为您首先需要做的是找出GC的原因。使用一些工具(如jconsole)来查明是否有东西用尽了内存。如果需要消耗,那么必须增加堆大小。如果这是一种异常行为。使用一些分析工具来找出内存泄漏发生的位置。考虑到您正在进行一些数据库操作,请仔细检查您是否忘记在使用后释放一些数据库资源(如连接)。解决了GC的问题后,再回过头来看看“next()”是否仍然很慢。