폰이라서 자세한 방법을 알려드리지 못해 죄송합니다.
2011. 12. 23. 오후 7:37 "전정철" <cut...@gmail.com> 작성:
> Grails web application을 톰켓에 올려돌릴 때 톰켓의 매니져 어플리케이션에서 reload. 또는 stop,
> start 등을 수행하면 memory leak 관련오류로 실행이 안되는데 혹시 해결 방법 아시는 분 도움 좀 주세요~
> 1.3.7 및 2.0 모두에서 그렇네요
>
> --
> "한국 Groovy & Grails 사용자 그룹" 에 가입하셨기에 이 메시지를 보내드립니다
> 이 그룹에 게시하려면 다음 주소로 이메일을 보내주십시오.
> KG...@googlegroups.com
> 이 그룹에서 탈퇴하시려면 다음으로 이메일을 보내주십시오.
> KGGUG+un...@googlegroups.com
> 추가 옵션을 보려면 http://groups.google.com/group/KGGUG?hl=ko의 그룹을
> 방문하세요.
Grails 2.0 으로 프로젝트를 생성후(추가코딩없이) 바로 war로 만들어서
Apache Tomcat 7.0.22 의 manager 웹프로그램으로 deploy 하여
start되면 reload 버튼 클릭하였을 때의
톰켓 로그는 다음과 같습니다.
Dec 29, 2011 11:28:40 AM org.apache.catalina.core.StandardContext
reload
INFO: Reloading Context with name [/g20sample1-0.1] has started
Dec 29, 2011 11:28:41 AM org.apache.catalina.loader.WebappClassLoader
clearReferencesThreads
SEVERE: The web application [/g20sample1-0.1] appears to have started
a thread named [Timer-1] but has failed to stop it. This is very
likely to create a memory leak.
Dec 29, 2011 11:28:59 AM org.apache.catalina.core.StandardContext
reload
INFO: Reloading Context with name [/g20sample1-0.1] is completed
테스트 환경:
JVM버전 : 1.7.0_01-b08
OS : Linux(Centos 6.0)
출처는 http://burtbeckwith.com/blog/?p=73 입니다.
간단하게 Bootstrap 의 destroy 클로져 에 다음처럼 한 line을 추가 하면 해결 되네요.
(리스너를 만들어 WEB.INF에 추가되도록 하는 방법도 가능할 듯)
class BootStrap {
def init = { servletContext ->
}
def destroy = {
DomainClassGrailsPlugin.PROPERTY_INSTANCE_MAP.get().clear()
}
}
이렇게 했더니
Timer-1 thread 건은 해결되었는 데 새로운 SEVERE 로그가 뜹니다ㅠ
그렇기 하지만,
Tomcat Manager 어플의 Find Leak 버튼으로는Memory Leak으로 탐지되지 않네요.
(Timer-1 건의 경우에는 탐지됨)