我在產品環境(底部的堆棧跟蹤)上收到嚴重的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)
是的,這也出現在我的腦海裏 - 我將MaxPermSize設置爲128m,現在這個過程正在運行 - 在20-30分鐘內,我們應該有一個答案:)如果這不是很好笑 - 你還有什麼其他的內存設置建議看看? – Makavelli
@Makavelli每個線程堆棧大小都有'-Xss',但我不知道默認值是多少。您也可以查看調整server.xml中的Tomcat線程池設置。 –
好的,現在我100%確定這是缺少內存問題,但無論我如何使用調整參數,過程總是失敗。這意味着我的Grails代碼可能是錯誤的 - 我將它作爲ST上的另一個問題發佈(http://stackoverflow.com/questions/14774799/grils-controller-simple-code-consuming-too-much-memory-how-to - 優化),並會尋找一些幫助。非常感謝伊恩的幫助。 – Makavelli