2014-12-23 2 views
4

우리 회사는 Spring (Flex Frontend) 엔터프라이즈 웹 애플리케이션을 개발하고 SAAS 스타일의 Tomcat 6 고객에게이 애플리케이션을 배포합니다.Java Spring app + Tomcat : JVM이 메모리 덤프를하지 않습니다.

최근 우리는 (겉으로보기에는) 무작위 OutOfMemory 오류로 고통 받고 있습니다. 그래서 조사가 끝나면 오류가 발생했을 때 JVM의 메모리 덤프를 검사해야한다는 것을 알았습니다. 우리가 사용하는

JVM이 1.6.18이며, 톰캣 버전은 내가 매개 변수 -XX 추가 2008 년

윈도우 서버에서 톰캣 7.0.23입니다 : (Java 탭 아래) 톰캣 모니터 패널에서 + HeapDumpOnOutOfMemoryError을하지만, 기계는 덤프를 생성하지 않습니다. 우리가 조사중인 서버에 다음과 같이

전체 자바 옵션이 설정됩니다

-Dcatalina.home=C:\Program Files\Apache Software Foundation\Tomcat 7.0 
-Dcatalina.base=C:\Program Files\Apache Software Foundation\Tomcat 7.0 
-Djava.endorsed.dirs=C:\Program Files\Apache Software Foundation\Tomcat 7.0\endorsed 
-Djava.io.tmpdir=C:\Program Files\Apache Software Foundation\Tomcat 7.0\temp 
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 
-Djava.util.logging.config.file=C:\Program Files\Apache Software Foundation\Tomcat 7.0\conf\logging.properties 
-XX:PermSize=128m 
-XX:MaxPermSize=1024m 
-Xms1024m 
-Xmx6144m 
-XX:+HeapDumpOnOutOfMemoryError 
-Dcom.sun.management.jmxremote.port=3333 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false 

당신이 최대 힙 크기가 밖으로 응용 프로그램은 particurarly 무거운 때문에 (6 연주회) 꽤 큰 볼 수 있듯이. VisualVM을 사용하여 JVM 상태를 실시간으로 볼 수 있도록 jmx 매개 변수를 테스트 할 목적으로 추가했으나보고있는 동안 발생하지 않았습니다.

java.lang.OutOfMemoryError 

oom (상관 경우 나도 몰라,하지만 그들은 OOM 전에 시간 몇 분을 기록하는 다른 오류는 제외) 그 전에 아무것도하고 다음 표준 에러를 보여줍니다 모든 것을

이있다 그 후에 아무것도.

메모리 섹션 (Java 힙 크기 또는 Permgen 공간)을보고하지 않는다고 이상하게 보입니다.

예약 된 메모리 힙이 너무 커서 JVM이 중요한 상태 (OOM)에 있기 때문에 쓰기가 불가능할 수 있습니까? 아마도 JMX 매개 변수가 엉망인 것입니까?

이 현재 실행중인 JVM의 VisualVM과 스크린 샷입니다 : VisualVM

업데이트 : 문제가 발생한있는 하나 같은 자바 옵션으로 내가 다른 Tomcat 설치에 설치

(동일한 버전) 무한 루프에서 arraylist를 무한정 채워서 수동으로 OOM을 유발하도록 수정 된 동일한 웹 애플리케이션. OOM을 실행 한 후에 메모리 덤프가 생성 되었기 때문에 테스트에서 Java 옵션 -XX : + HeapDumpOnOutOfMemoryError가 작동 함이 입증되었습니다. 그러나이 경우 오류는 다음과 같습니다.

java.lang.OutOfMemoryError: Java Heap space 

다음은 스택 추적입니다. 그래서 문제는 내 JVM args 표기법이 아니라 내가 만나는 특정 종류의 오류가있는 것 같습니다.

내 테스트에서 OOM 오류를 던진 후에도 응용 프로그램이 Tomcat에서 계속 작동한다는 점이 또 다른 특색입니다. 반면에 원래 문제의 OOM은 Tomcat 서비스를 중단시킵니다.

슬프게도 스택 추적이 중지되기 전에 잠시 시간을내어 더 자세히 조사하는 것이 어려워 보입니다.당신의 JVM의 인수에 :(

+0

가 왜 jvisualVm은 메모리 덤프 만드는 데 사용하지 않는 힙 덤프 파일의 위치를 ​​설정 (당신은 메모리 덤프에서 누수를 연구하는 매트를 사용할 수 있습니다 - 그것의 무료) 응용 프로그램을 tomcat에 배포하고 응용 프로그램을 닫을 때 모니터링하여 열면 모든 스레드가 닫혀 있는지 여부를 확인할 수 있습니다. – aurelius

+0

@aurelius 의견을 보내 주셔서 감사합니다. 현재 VisualVM을 사용 중이고 덤프를 만들 수 있다는 것을 알고 있지만 OOM이 (-XX : + HeapDumpOnOutOfMemoryError 옵션이 생각한대로해야 함) 파업 할 때 원하는 덤프가 있습니다. VisualVM을 덤프하고 매트 (mat)로보기는하지만 성공하지는 못합니다. 나는 덤프를 분석 할 곳을 정확히 알지는 못한다. 보통 의심되는 메모리 누수와 Dominator Tree를 보게된다. – frankieta

+0

확실히 확인했으나 어쨌든 그것을 말할 것이다. 공간이 여유가 있는가? (약 6GB) 힙 덤프 디스크에? – Khanna111

답변

0

추가 -XX:HeapDumpPath="/some/path/dump.out" 명시 적으로

+0

Ok, 다음에 우리는 Tomcat을 다시 열어 덤프의 경로를 명시 적으로 설정하려고 시도합니다 (그러나 이것은 로컬 시스템 밖에서 힙 덤프가 발생 했으므로 결코 문제가되지 않았습니다. 경로를 지정하지 않고도 생성됨). 감사 Amir – frankieta

+0

경로는 필수는 아닙니다. – techuser

+0

@techuser, 누가 필수라고 했습니까? –