메모리 문제 분석

Java 애플리케이션 메모리 문제의 원인을 식별하는 방법에 대해 알아봅니다. 원인을 식별하기 위해 힙 덤프를 자동 및 수동으로 생성하고 힙 히스토그램을 생성할 수 있습니다.

설명 description

환경

Experience Manager

문제/증상

JAVA 응용 프로그램의 실행 속도가 느려지고 최종적으로 메모리가 부족해지거나 로그나 콘솔 출력 OutOfMemoryError: Java heap space 또는 OutOfMemoryError: gc overhead limit exceeded에 오류가 표시됩니다.

해결 방법 resolution

원인
이러한 문제에는 여러 가지 원인이 있을 수 있습니다.

이 경우 CRX/CQ와 같은 Java 애플리케이션이 Java의 기본 힙 메모리 설정으로 명령줄에서 시작된 것이 문제의 한 가지 원인일 수 있습니다. jvm 매개변수 -Xmx는 지정되지 않았습니다. CRX 또는 CQ를 실행하는 데 힙을 최소 256MB 할당해야 합니다. 문제가 발생하면 명령줄에서 시작하여 힙 메모리 설정이 지정되었는지 확인합니다. 예:

java -Xmx512m -jar *.jar

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

자동으로 힙 덤프 생성

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

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

Java 프로세스에 메모리가 부족할 때마다 힙 덤프 파일(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로 바꿉니다.

    code language-none
    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) 신호를 수신하는 경우 발생하는 "사용자" 이벤트.

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

경고: 힙 덤프 파일은 크기가 크고 디스크에서 최대 힙 -Xmx jvm 매개 변수 구성과 크기가 동일할 수 있습니다. 덤프 파일이 생성되는 디렉터리에 충분한 디스크 공간이 할당되었는지 확인합니다.
힙 덤프 분석
힙 덤프를 분석하는 유용한 도구는 EclipseMAT(Eclipse Memory Analyzer)입니다.

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

전체 시스템 덤프를 분석하려면 맨 위에 설치된 Java용 IBM 모니터링 및 진단 도구 - 메모리 분석기와 함께 IBM Support Assistant Workbench를 사용하십시오. 힙 히스토그램은 Java 클래스당 라이브 오브젝트 수와 사용된 메모리를 간단하게 측정할 수 있습니다. 안타깝게도, Java 설치에 따라 필요한 도구를 사용할 수 없거나 항상 작동하지 않을 수 있습니다. 힙 히스토그램을 생성하려면 먼저 Java 프로세스의 프로세스 ID가 필요합니다. 가져오려면 ps or (if available), run:힙 히스토그램 을 실행하십시오.
힙 히스토그램은 Java 클래스당 라이브 오브젝트 수와 사용된 메모리를 간단하게 측정할 수 있습니다. 안타깝게도, Java 설치에 따라 필요한 도구를 사용할 수 없거나 항상 작동하지 않을 수 있습니다. 힙 히스토그램을 생성하려면 먼저 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 공급업체 및 버전.

참조

[ 1] Oracle 도움말 센터 > 핫스팟 VM에 대한 문제 해결 안내서
[ 2]  Oracle.com > javas > DebuggingOptions

recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f