垃圾收集器问题

tom*_*tom -2 java garbage-collection

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

Ste*_*n C 7

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

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

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

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

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

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

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