2012-04-12 6 views
2

Spring + Hibernate를 사용하는 웹 어플리케이션에서 문제가 있습니다.java.lang.OutOfMemoryError : GC 오버 헤드 제한을 초과했습니다. Spring Hibernate Tomcat 6

나는 무작위로 오류가 무엇입니까

java.lang.OutOfMemoryError와 : GC 오버 헤드 제한은 웹 응용 프로그램이 바람둥이에서 실행 중일 때

내가 힙 덤프 얻기 위해 노력

을 초과 힙 덤프의 분석을했다 이클립스 MAT

다음

내 결과입니다

개체 org.hibernate.impl.SessionFactoryObjectFac를 사용하여 tory는 메모리의 86 %를 보유하고,이 객체의 Fashhashmap 인스턴스는 100,000 개 이상의 해시 맵을 포함합니다. 모든 해시 맵 내부 이 org.hibernate.impl.SessionFactoryImpl의 인스턴스가, org.hibernate.impl.SessionFactoryImpl가

를 여러 번로드 Fashhashmap

org.hibernate.impl.SessionFactoryObjectFactory의 내부에 저장되어 있습니다 보인다 누군가가이 문제의 근본 원인을 찾아 내고이를 해결할 수있는 해결책을 제안합니다.

+2

Spring에서 Hibernate를 구성하는 방법을 보여줄 수 있습니까? 트랜잭션과 Hibernate 쿼리의 예제를 어떻게 관리합니까? 익명화 될 수 있습니다. –

답변

1

글쎄, 비록 당신이 그걸 SessionFactoryObjectFactory holds 86% of the memory이된다고해도, 그것은 나에게 원인이되지 않는다. 우선 메모리 분석 도구에 의존하기 전에, 우리는이 도구가 outofmemory 문제를 예측하는 방법을 먼저 이해해야한다. 메모리 도구는 일단 도구를 실행하면 응용 프로그램에 나타나는 즉시 HIKES를 캡처하려고합니다. 나는 꽤 똑같은 에러 로그를 보게 될 것이라고 확신하지만, Catalina web class loader이 많은 양의 메모리에 액세스하고 있음이 분명하고 예상되는 툴에 의해 언급 된 다른 원인을 가지고 있다고 확신한다.

그래서 (특정 사례/구현에서 옳을 수도있는) 도구에 의존하는 대신 앱 소스 코드를 파헤 치고 불필요한 임시 객체가있는 곳을 찾으려고합니다. 만들어진.

디버깅을 위해 정확히 GC에서 수집하는 내용을 보려면 JVM 옵션 -을 켜야합니다. 개체를 정리하려고 프로세서 시간의 http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#Options java.lang.OutOfMemoryError: GC overhead limit exceeded

0

당신의 GC 스레드가 지출 98 % 이상 -

다음 추가 정보를 원하시면 게시물/참조를 참조하십시오.

Factory 패턴의 아이디어는 생성하려는 객체의 null이 아닌 인스턴스를 반환하는 것입니다. 일반적으로 인스턴스화 된 인스턴스는 동일한 인스턴스를 반환하여 수행됩니다.

이제는 100,000 개의 다른 세션이나 띄어쓰기가있을 수 있지만 올바른지 의심 스럽습니다. 따라서 팩토리 메서드 호출이 제대로 작동하고 있는지, 코드가 로컬 복사본이 없는지 확인해야합니다. 캐싱.

실제로 100,000 회의 세션이 있다면 그 세션을 만드는 방법을 잘 살펴보십시오. 긴 메소드를 중단하여 루프와 while 구조가 메소드 호출로 분리되어 메소드 로컬 변수가 범위 밖으로 한 번 정리 될 수 있도록하십시오.

컴파일러가 최적화 방법으로 단일 스택 프레임에 최종 메소드를 함께 스티치하므로 최종 메서드가 아닌지 확인하십시오.

관련 문제