반응형
프로세스에 문제가 생겨 프로세스가 돌고 있는 경로에 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 파일이 생성됨
반응형
'신입사원 일기' 카테고리의 다른 글
[TIL] 랜덤 시크릿 키 생성 (openssl rand) (0) | 2024.09.02 |
---|---|
[Linux] 터미널 색상코드 vi 에서 설정하기 (0) | 2024.02.21 |
[Linux] 특정 포트로 tcpdump 뜨기 (0) | 2023.08.05 |
[Linux] Port 번호로 PID 확인하기 (netstat, lsof) (0) | 2023.06.25 |
[Linux] 일자별로 파일 삭제하기 (mtime) (0) | 2023.06.22 |