목차
- 자바의 스레드
- 데몬 스레드(Daemon Thread)
- 일반 스레드(Non-Daemon Thread)
- 좀비 프로세스와 일반 스레드의 이슈
- 참고 자료
1. 자바의 스레드
모든 자바 프로그램은 기본적으로 Thread(스레드)를 사용한다.Thread는 JVM 안에서 실행되는 실행 단위를 일컬으며, 하나의 프로세스(JVM) 안에 여러 개의 스레드가 동시에 실행될 수 있다.
예시로 API를 콜 할때 사용되는 스레드도 JVM안에서 실행되는 스레드이다.
JVM이 실행되면 main 스레드 뿐 아니라 가비지 컬렉션, 객체 종료(Object Finalization)와 같은 JVM 내부 작업을 담당할 스레드도 생성된다.
2. 데몬 스레드 (Deamon Thread)
Daemon : 사용자의 직접적인 제어를 받지 않고 백그라운드 프로세스로 실행되는 프로그램
다른 일반 스레드의 작업을 돕는 보조 역할을 하는 스레드이다. 쉽게 말해 백그라운드 서비스의 성격을 지닌다.
대표적으로 GC(가비지 컬렉션) 스레드, 로그 감시 / 모니터링 스레드 등이 있다.
JVM이 종료되기 전, 일반 스레드(Non-Daemon Thread)가 모두 종료되면 잔존하던 데몬 스레드(Daemon Thread)는 강제 종료되고, 프로세스, 즉, 어플리케이션 자체가 종료된다.
3. 일반 스레드 (Non-Daemon Thread)
일반적으로 생성하는 사용자 스레드(user thread)에 해당된다.
JVM의 종료 조건에 해당되는데, 만약 일반 스레드가 1개라도 살아 있으면 JVM은 종료되지 않는다.
일반 스레드에 해당되는 예시로는 대표적으로 main 스레드 worker thread (작업 처리용) 서버 요청 처리 스레드 등이 해당된다.
4. 좀비 프로세스와 일반 스레드의 이슈
일전에 @PostConstruct에서 초기화 콜백에 실패하여 프로세스가 정상적으로 가동되지 못했던 상황이 있었다.
이때 @PostConstruct에서 실패해 컨텍스트는 실패하지만, 그 전에 이미 만들어진 Non-Daemon Thread, 즉, 일반 스레드가 정리되지 못해 프로세스가 정상 종료되지 못했던 상황이 발생했다.
여기서 말하는 일반 스레드는, 요청 워커, 커넥션 풀, 또는 백그라운드 스레드가 해당되는데, 당시 로그에서 발생한 트레이스로 추측컨데 내 경우엔 JDBC 드라이버가 내부적으로 띄운 스레드가 문제였던것 같다.
차라리 어플리케이션 구동이 실패했다면 모니터링에서 바로 포착되었겠지만, 해당 케이스에서는 프로세스는 떠 있는데 heathl check는 실패하는 기묘한 상황이 발생하게 되었다.
5. 참고 자료
'👩🏻💻 Programming > Java' 카테고리의 다른 글
| fetch() - 2 : 적정 fetchSize 분석, 그리고 limit의 개념 (0) | 2025.09.08 |
|---|---|
| fetch() - 1 : ResultSetType 분석 (0) | 2025.08.26 |
| @EntityListener와 @PostLoad의 이슈 (0) | 2024.12.04 |
| 동기, 비동기, 그리고 Batch의 thread-pool : thread-pool은 다다익선이 아닐까? (2) (0) | 2024.11.03 |
| ThreadPoolExecutor vs ThreadPoolTaskExecutor (0) | 2024.10.29 |