2011-09-29 4 views
1

CF 8 서버에 "OutOfMemoryError : PermGen space"오류가 있습니다. 내 응용 프로그램에서 1000 개의 템플릿이 동일한 로컬 변수 (테스트 용)에로드되었으므로 다음 매개 변수가로드되면 이전 매개 변수는 GC에 사용할 수 있어야합니다. 그러나 이는 발생하지 않습니다. 나는 메모리 덤프를 가지고 jhat와 함께 그것을 보았다. 내가 본 것은 1,000 개의 템플릿을로드하는 것이고 각각은 자체 TemplateClassLoader 인스턴스입니다. TemplateClassLoader에는 모든 TemplateClassLoader 인스턴스에 대한 정적 참조가 있습니다 (다시 jhat에서 온 것입니다). 아마도 이것 때문에 인스턴스가 메모리에 보관되므로 클래스 객체는 permgen에서 GC가 될 수 없습니다.Coldfusion TemplateClassLoader가 클래스 로더 인스턴스를 보류합니까?

이 "메모리 유지"는 템플릿에서 cfscript 함수를 호출 한 경우에만 발생합니다. 템플릿을로드하지만 함수를 호출하지 않으면 클래스 객체가 GCed되고 OOM 오류가 발생하지 않습니다.

TemplateClassLoader의 (정적 인) 정적 참조에 어떤 현상이 발생 했습니까?

답변

2

나는 그것을 알아 냈습니다. CF 관리 페이지의 서버 설정> 캐싱에 "최대 캐싱 된 템플릿 수"필드가 있습니다. LRU 캐시에 있어야하는 템플릿의 수를 제어합니다. 템플릿이 해당 캐시에 있으면 Java 클래스 객체에 대한 강력한 참조가 있으며 GCed 할 수 없습니다. 제 CF 설정에서 기본 값 1024를 사용합니다. 이것이 나의 테스트에서 1000 고유 템플릿이 GCed를 얻지 못하는 이유입니다. 여기에 좀 더 정보가

: 이클립스 MAT는 말한다 이유 http://blogs.sanmathi.org/ashwin/2006/07/12/tangling-with-the-template-cache/

+0

가 나는 이유를 찾고이 건너 온 그 ' "coldfusion.runtime.TemplateClassLoader"점유 242,105,472 바이트의 3421 개 인스턴스'. 이 템플릿 캐시 것 같습니다. 고맙습니다. –

관련 문제