2012-07-26 102 views
1

我们的上下文init从60秒跳到大约15分钟。在缓慢和快速的情况下,它最终都会成功启动。无论哪种方式都没有致命的错误。是否有特定的日志记录设置,甚至建议的类来设置断点(或添加断点记录)?缓慢的上下文初始化

我已经找到那个行为开始的版本,但不清楚是什么导致它需要更长的时间。我在整个DefaultListableBeanFactory中设置了断点。这是一个很大的应用程序,所以调用堆栈在获取和创建bean时已经有数百年的历史了,但是将其与之前的修订版本(快速完成)进行比较显示出类似的性质。在缓慢和快速修订之间没有什么不寻常的事情发生。

我已经在随机点通过“缓慢部分”暂停执行,并且堆栈跟踪看起来很合理,根据需要实例化新的bean,尽可能设置属性(这可能会导致更多的递归doCreateBean调用等) 。

我还没有打扰建立一个分析器,但怀疑它会有用。慢版本花费在其中的代码(bean factory,context init),当然也是快速修改其花费最多的代码。

+1

Spring使用log4j,你打开调试日志? – 2012-07-26 23:56:17

+0

是的,在org.springframework上调试。在一分钟内,我有几百兆字节的日志。我已经搜索了最高端,作为一个人,我发现很难消化任何有用的东西。 – 2012-07-27 16:44:38

+0

尝试一个利润可能是有用的,所以你可以分析什么是慢的部分占用的时间 – 2012-07-27 17:03:04

回答

0

您可能需要检查详细的GC日志。这可能是因为它以某种方式创建了很多对象,并且您会看到1)堆不断增长,表明“额外”豆或2)很多幼儿园GC指示创建了很多对象,但没有太多粘附(通过添加对上下文)。

对于#1,像Eclipse MAT这样的工具将帮助您分析堆内存最多的对象的堆转储。

对于#2,分析器仍然有帮助。查看所拨打电话的数量,而不是花费的时间。你会想找到构造函数或其他被称为大量次的create/init方法。从那里你可以追溯到找到有害的豆。