2011-10-11 58 views
8

我想用spring insight來跟蹤我的spring mvc webapp。當啓動TC服務器2.5開發版,我的應用程序來了,但我在控制檯中看到以下消息:春季見解與「不平衡幀堆棧」崩潰

20.10.2011 09:24:24 com.springsource.insight.intercept.trace.SimpleFrameBuilder enter 
FATAL: Frame stack exceeded MAX_FRAMES_PER_TRACE limit or has been aborted limit: 3000 frameCount: 3000 aborted: false 
20.10.2011 09:24:24 com.springsource.insight.collection.errorhandling.AdviceErrorHandlingAspect ajc$around$com_springsource_insight_collection_errorhandling_AdviceErrorHandlingAspect$1$e76a6b03 
FATAL: Error swallowed in advice adviceexecution(void com.springsource.insight.collection.AbstractOperationCollectionAspect.afterReturning(Object, JoinPoint.StaticPart)) 

-

java.lang.IllegalStateException: Imbalanced frame stack! (exit() called too many times) 
com.springsource.insight.intercept.trace.ThreadLocalFrameBuilder.exit(ThreadLocalFrameBuilder.java:61) 
com.springsource.insight.collection.DefaultOperationCollector.exit(DefaultOperationCollector.java:111) 
com.springsource.insight.collection.DefaultOperationCollector.exitNormal(DefaultOperationCollector.java:67) 
com.springsource.insight.plugin.springtx.TransactionOperationCollectionAspect.ajc$afterReturning$com_springsource_insight_plugin_springtx_TransactionOperationCollectionAspect$2$e13fb3a0(TransactionOperationCollectionAspect.aj:61) 
org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:724) 
org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393) 
org.springframework.transaction.aspectj.AbstractTransactionAspect.ajc$afterReturning$org_springframework_transaction_aspectj_AbstractTransactionAspect$3$2a73e96c(AbstractTransactionAspect.aj:78) 
... 

我這個消息後調用一些控制器動作,但在某些時候,服務器拒絕處理我的請求,並將相同的堆棧跟蹤發送到瀏覽器。

有沒有人有這個問題的經驗?即使停用洞察插件annotation,hibernate,jdbcspring-tx也不會解決問題。

回答

8

Jon Travis幾乎是完全正確的,但系統屬性

-Dinsight-max-frames 

的默認值是3000所看到的洞察力截距-1.5.1.SR2.jar:com.springsource.insight.intercept.trace.FrameBuilder

的值更改爲-Dinsight-max-frames=6000固定我的問題。

+0

,因爲@ Jon-Travis在下面提到的選項不是-Dinsite.max。幀 – chrislovecnm

+0

@chrislovecnm選項是'-Dinsight-max-frames'。這與@Jon Travis寫的非常微妙的區別。注意破折號而不是點。 –

8

這些代碼中的一些在最近的版本中得到了改進。

你可能想給春天的Insight 1.5.1一試 - 它帶有TC服務器2.6.1,可通過springsource.org/insight

編輯可用:你所看到的問題是,一個單一的跟蹤試圖累積太多幀(默認情況下,它停止計數1000)。這是因爲您的應用程序在啓動時可能會執行大量的SQL調用,或者其他很多儀表化調用。一旦檢測到它,它將停止收集幀並且(當前)得到不平衡的幀堆棧。這個錯誤對你的情況非常重要。

通過設置Java sysproperty(insight.max.frames),可以將幀數增加到最大值。

在濱/ setenv.sh,只需添加到JVM_OPTS:

-Dinsight.max.frames=2000 
+0

嗨。謝謝你的提示。現在我只在應用程序啓動時出錯,但只有一次。之後,我可以不受任何限制地使用我的應用程序。也許有人可以告訴我第一個錯誤的原因,但只要我能夠洞察力,一切都很好;) – powerMicha

+0

感謝您的詳細解釋。事實上,我們在啓動時正在進行大量的SQL調用。但即使將insight.max.frames更改爲50000也不能修復該消息。我將嘗試找出哪些語句導致錯誤並嘗試優化它們。 – powerMicha

+0

Btw:更改sysproperty似乎不會影響收集的幀數。上面我可以看到這樣的信息:'幀堆棧超出MAX_FRAMES_PER_TRACE限制或已被中止限制:3000 frameCount:3000中止:false'不會隨sysproperty更改 – powerMicha