2013-02-08 64 views
0

我在產品環境(底部的堆棧跟蹤)上收到嚴重的IllegalStateException錯誤。在本地,在開發一切正常,我從來沒有遇到任何問題與本地代碼段。Grails - 嚴重IllegalStateException - 類[]上的方法在Grails應用程序之外使用

Prod和Dev配置具有相同的Tomcat 5.在dev上,我有PostgreSQL 9.2和prod 8.4。 Pord環境在某些託管上是VPS。

導致它的代碼是一個簡單的類實例創建器(GameStateTransition類) - 它可以負責初始化並保存超過370 000個實例。導致錯誤的行是save(flush:true)或hibernateSesion.flush() - 我嘗試了兩個選項。

錯誤發生的非確定性 - 創造16萬分的情況下,有時220 000後,有時300 000後sometimeas ...

我認爲這可能是內存的問題和VPS服務器查殺內存最多但是將JAVA_OPTS Xmx更改爲256m(遠低於服務器的500m限制)並沒有幫助。在本地運行應用程序並將開發數據庫更改爲生產Postgres 8.4運行正常(該過程完成且沒有錯誤),因此它必須是prod服務器上的應用程序的問題。

任何人都有任何線索,它可能是關於什麼?

stacktrace說什麼是關於mongoDB,測試和嘲笑註釋,但我沒有使用它。這是一個簡單的代碼,用於創建實例並將其保存到數據庫中。

2013-02-08 00:07:50 org.apache.coyote.AbstractProtocol pause 
INFO: Pausing ProtocolHandler ["http-bio-12200"] 
2013-02-08 00:07:50 org.apache.coyote.AbstractProtocol pause 
INFO: Pausing ProtocolHandler ["ajp-bio-8009"] 
2013-02-08 00:07:50 org.apache.catalina.core.StandardService stopInternal 
INFO: Stopping service Catalina 
2013-02-08 00:07:50 org.apache.catalina.core.StandardWrapper unload 
INFO: Waiting for 1 instance(s) to be deallocated 
2013-02-08 00:07:51 org.apache.catalina.core.StandardWrapper unload 
INFO: Waiting for 1 instance(s) to be deallocated 
2013-02-08 00:07:52 org.apache.catalina.core.StandardWrapper unload 
INFO: Waiting for 1 instance(s) to be deallocated 
2013-02-08 00:07:52 org.apache.catalina.core.StandardWrapper unload 
INFO: Waiting for 1 instance(s) to be deallocated 
2013-02-08 00:07:52,979 [http-bio-12200-exec-6] ERROR errors.GrailsExceptionResolver - IllegalStateException occurred when processing request: [GET] /gameState/initializeTransitionMatrix 
Method on class [pl.edu.caspar.analyzer.GameStateTransition] was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly.. Stacktrace follows: 
java.lang.IllegalStateException: Method on class [pl.edu.caspar.analyzer.GameStateTransition] was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly. 
    at org.grails.datastore.mapping.engine.event.AbstractPersistenceEventListener.onApplicationEvent(AbstractPersistenceEventListener.java:46) 
    at pl.edu.caspar.analyzer.GameStateController$_initializeTransitionMatrix_closure3_closure8.doCall(GameStateController.groovy:59) 
    at pl.edu.caspar.analyzer.GameStateController$_initializeTransitionMatrix_closure3.doCall(GameStateController.groovy:53) 
    at pl.edu.caspar.analyzer.GameStateController.initializeTransitionMatrix(GameStateController.groovy:52) 
    at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:195) 
    at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 

回答

0

鑑於

2013-02-08 00:07:50 org.apache.catalina.core.StandardService stopInternal 
INFO: Stopping service Catalina 
2013-02-08 00:07:50 org.apache.catalina.core.StandardWrapper unload 
INFO: Waiting for 1 instance(s) to be deallocated 

這看起來像Tomcat進程正在試圖關閉出於某種原因,當你嘗試在一個應用程序,在執行控制器動作發生異常關閉過程。

你說

我認爲這可能是內存和VPS服務器查殺內存最多耗時的過程,但改變JAVA_OPTS XMX問題爲256M是500米遠低於限制的服務器,並沒有幫助

還有更多的Java內存不僅僅是堆大小(-Xmx),另外還有PermGen的大小(-XX:MaxPermSize=...)和堆棧空間等其他設置,您可能需要限制那些以及在爲了保持整個過程低於VPS內存限制。

+0

是的,這也出現在我的腦海裏 - 我將MaxPermSize設置爲128m,現在這個過程正在運行 - 在20-30分鐘內,我們應該有一個答案:)如果這不是很好笑 - 你還有什麼其他的內存設置建議看看? – Makavelli

+0

@Makavelli每個線程堆棧大小都有'-Xss',但我不知道默認值是多少。您也可以查看調整server.xml中的T​​omcat線程池設置。 –

+0

好的,現在我100%確定這是缺少內存問題,但無論我如何使用調整參數,過程總是失敗。這意味着我的Grails代碼可能是錯誤的 - 我將它作爲ST上的另一個問題發佈(http://stackoverflow.com/questions/14774799/grils-controller-simple-code-consuming-too-much-memory-how-to - 優化),並會尋找一些幫助。非常感謝伊恩的幫助。 – Makavelli

相關問題