본문 바로가기

신입사원 일기

[Java] HeapDump 파일 경로 지정하기 openjdk환경, IBM환경

반응형
프로세스에 문제가 생겨 프로세스가 돌고 있는 경로에 heapdump, core 파일, javacore 파일이 생성되었고, 하필이면 그 경로가 할당되어있는 디스크 메모리가 작아서 프로세스를 결국 중단하고 재기동해야하는 상황에 놓였습니다. 해당 현상을 해결하기 위해서 heapdump가 생성되는 경로를 지정하는 JVM 옵션이 무엇일까 찾아보게 되었습니다.

 

현재 테스트한 환경은 Mac M1 air 이고 설치되어있는 java version은 openjdk 11 입니다. 

 

무한 루프 소스

public class InfiniteLoopProcess {

    public static void main(String[] args) {
        startInfiniteLoop();
    }

    private static void startInfiniteLoop() {
        while (true) {
            // 무한 루프에서 수행할 작업
            System.out.println("Running...");
            try {
                // 일부 지연을 추가하여 CPU 소비를 줄임
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

 

OutOfMemoryError를 발생할 소스

import java.util.*;

public class OutOfMemoryErrorCreate {

    public static void main(String[] args) {
        startInfiniteLoop();
    }

    private static void startInfiniteLoop() {
        List<byte[]> list = new ArrayList<>();
        int index = 1;

        while (true) {
            // 1MB each loop, 1 x 1024 x 1024 = 1048576
            byte[] b = new byte[1048576];
            list.add(b);
            Runtime rt = Runtime.getRuntime();
            System.out.printf("[%d] free memory: %s%n", index++, rt.freeMemory());
        }
	}
}

 

구글에 돌아다니는 위 두가지 예제를 활용해서 테스트를 진행하였습니다. 특정 경로에 위의 java 소스를 서버에 위치시킨 다음 javac 명령어를 통해 컴파일시켜 class 파일로 생성해줬습니다.

 

1. 무한루프 소스를 통해 hs_err_pid[pid].log 파일 생성위치 지정하기

java -XX:ErrorFile:[경로]/hs_err_pid%p.log InfiniteLoopProcess

 

-XX:ErrorFile : 위 코드와 같이 지정해주면 원하는 위치에 파일을 생성할 수 있었습니다.

 

2. OutOfMemory를 발생하는 소스를 통해 heapdump 위치 지정하기

java -Xmx50m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=[경로] OutOfMemoryErrorCreate

 

 위처럼 경로를 지정해주면 소스를 실행하고 OutOfMemoryError가 발생했을 때 원하는 곳에 heapdump 파일이 생성됩니다.

 

 

그런데.. 여기서 초대박 반전이 있었는데 실제 적용해야하는 서버는 java 1.7 IBM 환경이었던 것....

적용해야하는 옵션이 모두 달랐습니다.

 

export IBM_HEAPDUMP=true
export IBM_HEAP_DUMP=true
export IBM_JAVA_HEAPDUMP_TEXT=true
export IBM_HEAPDUMP_OUTOFMEMORY=true
export IBM_JAVADUMP_OUTOFMEMORY=true
export IBM_JAVADUMPDIR=[경로]
export IBM_HEAPDUMPDIR=[경로]
export IBM_COREDIR=[경로]

 

해당 옵션을 적용해서 원하는 곳에 heapdump 파일과 core 파일을 생성하게 할 수 있었습니다.

 

+ 참고

IBM 환경에서의 test

- heapdump 파일 생성 : kill -3 으로 프로세스를 죽이면 heapdump 파일이 생성됨

- core 파일 생성 : kill -11 으로 프로세스를 죽이면 core 파일이 생성됨

반응형