메모리 문제 분석

설명

환경
Experience Manager

문제/증상
Java 응용 프로그램은 더 느리게 실행되며 마지막으로 메모리가 부족하거나 로그 또는 콘솔 출력에 오류가 표시됩니다 OutOfMemoryError: Java heap space 또는 OutOfMemoryError: gc overhead limit exceeded.

해상도

원인

다음 문제의 원인은 다양할 수 있습니다.

한 가지 가능한 원인은 Java 응용 프로그램이 명령줄에서 Java의 기본 heap 메모리 설정을 사용하여 CRX/CQ가 시작되었기 때문입니다. jvm 매개변수 -Xmx는 지정되지 않았습니다. CRX 또는 CQ를 실행하는 데 힙을 최소 256MB 할당해야 합니다. 문제가 발생하면 명령줄에서 시작하여 힙 메모리 설정이 지정되었는지 확인합니다. 예:

java -Xmx512m -jar *.jar

그렇지 않다면 애플리케이션은 가비지 수집에 릴리스하지 않고도 초과된 오브젝트를 유지할 수 있습니다. 이를 메모리 누출이라고 합니다. 자세한 내용은 여기를 참조하십시오. Java 애플리케이션에서 메모리 문제를 분석하는 방법에 대한 지침은 아래 섹션을 참조하십시오.

더미 덤프 만들기
자동으로 더미 덤프 생성

메모리가 부족한 상태에서 힙을 자동으로 만들려면 jvm 매개 변수를 추가할 수 있습니다 -XX:+HeapDumpOnOutOfMemoryError 응용 프로그램에서 OutOfMemoryError를 발생시킬 때 자동으로 힙덤프를 생성합니다. 예:

java -Xmx256m -XX:+HeapDumpOnOutOfMemoryError -jar *.jar

이렇게 하면 heap 덤프 파일(java_...hprof)을 입력합니다. 힙 덤프가 생성된 후에도 프로세스가 계속 실행할 수 있습니다. 일반적으로 문제를 분석하는 데 하나의 힙 덤프 파일로 충분합니다.

참고: crx-quickstart/server/start 스크립트를 사용하여 CRX 인스턴스를 시작하는 경우 -XX:+HeapDumpOnOutOfMemoryErrorCQ_JVM_OPTS 변수에 추가할 수 있습니다(변수도 주석 처리 제거되었는지 확인). 예:

CQ_JVM_OPTS='-XX:+HeapDumpOnOutOfMemoryError'

이 매개변수를 추가하고 CRX 인스턴스를 다시 시작한 후 새 jvm 옵션이 설정되어 있는지 확인하십시오. 명령줄에서 ps -ef | grep java를 실행합니다. 그런 다음 -XX:+HeapDumpOnOutOfMemoryError CRX java 프로세스의 매개 변수로 사용됩니다.

디스크 공간 제약으로 인해 다른 디렉터리를 지정하여 힙 덤프를 생성해야 하는 경우 -XX:HeapDumpPath=/path/to/generate/heapdump 매개변수를 추가하여 파일을 저장할 위치를 jvm에 전달할 수 있습니다.

디버깅 관련 jvm 매개변수에 대한 참조 자료는 여기를 참조하십시오.

수동으로 더미 덤프 생성

Sun/Oracle JVM

힙 덤프를 수동으로 생성하려면 이 명령을 실행합니다(jmap 및 jps는 jdk 홈 디렉터리의 bin 폴더에서 찾을 수 있음).

  1. 힙덤프를 생성하는 java 프로세스의 pid를 찾습니다.

    • Unix 또는 Linux에서 이 작업은 ps -ef | grep java 또는 jps -l
    • Windows에서는 작업 관리자를 열어 이 작업을 수행할 수 있습니다. Ctrl+Shift+Esc 그런 다음 보기 = 열 선택 = PID(프로세스 식별자) 또는 jps -l
  2. 아래 jmap 명령을 실행하고, /path/to/generate/heapdumpfile.hprof를 힙 덤프 파일을 생성하려는 위치로 바꾸고, 1234를 이전 단계에서 조회한 PID로 바꿉니다.

    jmap -dump:format=b,file=/path/to/generate/heapdumpfile.hprof 1234
    

IBM JVM

사용자 신호에 올바른 덤프를 생성하려면 먼저 덤프 에이전트에 대한 기본 JVM 설정을 변경해야 합니다. 몇 가지 종류의 덤프가 있지만, 일반적으로 철저한 메모리 분석을 수행하려면 전체 시스템 덤프가 필요합니다. 다음 인수 추가:

Xdump:heap:opts=PHD+CLASSIC:events=user -Xdump:system:events=user

JVM이 운영 체제에서 SIGQUIT(Linux, AIX®, z/OS® 및 i5/OS™) 또는 SIGBREAK(Windows) 신호를 수신할 때 발생하는 "사용자" 이벤트입니다.

자세한 내용은 여기에서 공급업체의 설명서를 참조하십시오.

경고: heap 덤프 파일은 크기가 크고 최대 heap -Xjvm 매개 변수 구성과 동일한 디스크 크기일 수 있습니다. 덤프 파일이 생성되는 디렉터리에 충분한 디스크 공간이 할당되었는지 확인합니다.

heap 덤프 분석

heap 덤프를 분석하는 데 유용한 도구는 EclipseMAT(Eclipse Memory Analyzer)입니다. http://www.eclipse.org/mat/

이 도구는 IBM JVM에서 생성된 덤프를 분석할 수 없습니다. 이에 대한 몇 가지 가능성이 있습니다. IBM HeapAnalyzer는 PHD 또는 Classic 형식의 힙 덤프에 적합합니다.

전체 시스템 덤프 분석의 경우 IBM 지원 Workbench, 사용 IBM Java용 모니터링 및 진단 도구 - 메모리 분석기 버전 1.2 가 설치되어 있습니다.

히스토그램 히스토그램

heap 히스토그램은 Java 클래스당 사용되는 라이브 개체 및 메모리 수를 간단하게 측정합니다. 안타깝게도 Java 설치에 따라 필요한 도구를 사용할 수 없거나 도구가 항상 작동하지 않을 수 있습니다. heap 히스토그램을 만들려면 먼저 Java 프로세스의 프로세스 ID가 필요합니다. 다운로드하려면 ps를 실행하거나 (가능한 경우) 다음을 실행합니다.

jps -l

이 Java 도구는 실행 중인 모든 Java 프로세스의 프로세스 ID를 가져옵니다. 예:

327
3332 sun.tools.jps.Jps
3313 crx-quickstart-....jar

지금 다음 명령을 실행합니다.

jmap -histo 3313

총 필수 메모리로 목록을 정렬합니다(약식: 참조된 오브젝트 제외). 출력의 첫 20줄이 가장 흥미 있는 줄입니다. 출력 예:

JVM version is 1.5.0_20-141
Iterating over heap. This may take a while...
Warning: skipping invalid TLAB for thread t@62211
Warning: skipping invalid TLAB for thread t@62467
...
SizeCountClass description
-------------------------------------------------------
1059290412916byte
1028584075255* ConstMethodKlass
628317658388char
604230414928int
4995752116201* SymbolKlass
422089675255* MethodKlass
41965126969* ConstantPoolKlass
29285606969* InstanceKlassKlass
26310086066* ConstantPoolCacheKlass
2395872149742org.apache.jackrabbit.core.query.lucene.DocId$PlainDocId
14760087003java.util.HashMap$Entry
139612858172java.lang.String
107023244593java.util.HashMap$Entry
75398410036short
73546454org.apache.jackrabbit.core.query.lucene.DocId
7201927502java.lang.Class
64070413348com.day.crx.persistence.tar.index.IndexEntry
...

추가 정보

문제를 분석하려면 다음 정보도 파악해야 합니다.

  • 설치된 모든 핫픽스 버전 번호 목록이 포함된 CRX 또는 CQ 버전.
  • 운영 체제, JVM 공급업체 및 버전.

참조

http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/memleaks.html
http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp#DebuggingOptions

이 페이지에서는