2013-06-20 1 views
1

Tomcat 응용 프로그램에서 "OutOfMemoryError : GC 오버 헤드 한도를 초과했습니다."라는 메시지가 표시됩니다. Runtime.getRuntime().freeMemory()보고 576 메가 바이트는 무료입니다.OutOfMemoryError (GC 오버 헤드 한도를 초과했지만) 여유 공간이 많습니다.

어떻게 이런 일이 발생할 수 있습니까?

SQL Server JDBC 드라이버에서 오류가 발생합니다.이 오류로 인해 한 메모리 요청에서 수백 메가 바이트가 할당됩니다. 그리고 "PS Scavenge"에 대한 GarbageCollectorMXBean의 카운트와 "PS MarkSweep"은 오류가 발생하기 몇 분 전에 크게 증가하지 않았습니다.

Runtime.getRuntime().maxMemory()Runtime.getRuntime().totalMemory()보고 4.5GB. 이것은 Java 7 용 64 비트 Sun JVM에서 실행 중입니다.

+0

stacktrace please –

+0

전체 스택 추적을 붙여 넣으십시오. 힙 고갈 또는 perm gen으로 인해 메모리가 부족합니다. 또는 뭔가 다른 ... – Scorpion

+2

이 답변을 도움이 될 수 있습니다 : http://stackoverflow.com/a/1393503 -이 특정 OutOfMemoryError의 의미를 설명합니다 – konradstrack

답변

5

"GC 오버 헤드 한계를 초과했습니다"는 것은 힙이 고갈되지는 않았지만 가비지 수집에 소비 된 CPU 시간이 미리 정의 된 한계를 초과했음을 의미합니다. 기본적으로 JVM은 쓰레기 수거 외에 다른 일을 거의하지 않습니다. 이것은 여러 가지 이유로 인해 발생할 수 있습니다. 가장 일반적인 힙은 입니다. 그러나 모든 주요 GC는 할당 요청을 충족시키기에 충분할 정도로 꽉 잡아서 관리합니다.

큰 GC와 함께 엄청난 힙 크기와 같은 다른 원인이있을 수 있습니다. 진단 도구를 사용하여 상황을 조사해야합니다. 나는 매우 추천한다 visualgc.

+0

나는 그것이 512 MB 이상의 무료로 선언 된 일이 일어날 수 있다고 생각한다./ – fge

+0

그래, 그건 거짓말이거나 매우 특이한 일이다. –

+0

@fge 동의하지만 그럼에도 불구하고 대답과 추천 일부 진단 도구를 사용하는 것이 정확합니다 :) –

관련 문제