..

JVM이 부팅될때 JVM을 구성하는 threads

TOC


  1. Overview
  2. JVM 내 threads
  3. main thread는 무엇인가
  4. daemon과 non-daemon
  5. JVM 내부 스레드
  6. Conclusion

Overview


본문에서는 JVM이 올라온 뒤 어떤 스레드가 구성되는지, 각 스레드가 어떤 역할을 갖는지에 대해 다룬다. 상세 설명은 main thread, user thread, daemon thread, JVM 내부 스레드로 나눠서 본다. 앞 글에서는 JVM이 뜨고 main이 시작되는 큰 흐름을 봤다. 이 글은 그 시점에 어떤 종류의 스레드가 보이는지를 정리한다.

JVM 내 threads


종류 의미 JVM 종료 영향 예시
main thread 애플리케이션 시작점 보통 영향 있음 public static void main(...)
user thread 애플리케이션 작업을 수행하는 일반 스레드 있음 요청 처리, 작업자 스레드
daemon thread 백그라운드 보조 역할의 스레드 없음 보조 작업, 모니터링, 정리 작업
JVM internal thread JVM이 내부적으로 쓰는 스레드 구현에 따라 다름 GC, JIT, Reference Handler

main threaduser thread는 애플리케이션 쪽에 가깝고, daemon thread는 종료를 막지 않는 보조 성격의 스레드다. JVM internal thread는 JVM이 자기 자신을 유지하기 위해 사용하는 별도 범주로 보면 된다.

main thread는 무엇인가


main thread는 JVM이 애플리케이션의 main 메서드를 실행하는 기본 진입 스레드다.

Java를 실행하면 JVM은 public static void main(String[] args)를 호출할 실행 흐름을 만든다. 그 실행 흐름의 중심이 보통 main이라는 이름으로 보이는 스레드다.

daemon과 non-daemon


non-daemon thread는 JVM을 계속 살아 있게 만드는 스레드다. daemon thread는 백그라운드 보조 역할을 하는 스레드다.

여기서 non-daemonmain threaduser thread를 의미한다. JVM internal thread는 별도 범주다.

  • non-daemon thread: JVM을 계속 살아 있게 만드는 일반 실행 스레드
  • daemon thread: JVM 뒤에서 보조 역할을 하는 스레드

추가로 애플리케이션 코드에서 Thread 를 다룰때 daemon 여부를 정할 수 있다.

Thread t = new Thread(() -> {
    doWork();
});
t.setDaemon(true);
t.start();

non-daemon thread가 하나라도 살아 있으면 JVM은 계속 실행된다. 반대로 non-daemon thread가 모두 종료되면 JVM은 종료를 준비한다.

JVM 내부 스레드


JVM은 애플리케이션 코드가 직접 만든 스레드 외에도 내부 작업용 스레드를 가진다.

이 스레드들은 GC, JIT 컴파일, 참조 처리, 신호 처리처럼 런타임이 자기 자신을 유지하기 위해 쓴다. 구현체와 버전에 따라 이름과 구성은 달라질 수 있지만, 핵심 역할은 비슷하다.

자주 보이는 범주는 아래와 같다.

  • GC 관련 스레드: 가비지 컬렉션 작업을 수행한다.
  • Compiler/JIT 관련 스레드: 자주 실행되는 코드를 최적화한다.
  • Reference Handler 계열: Reference 객체 처리를 돕는다.
  • Signal/Attach 계열: JVM 외부 도구와의 상호작용을 지원한다.

Conclusion


JVM에서 thread는 역할과 종료 정책으로 나눠서 보면 된다.

  • main threaduser thread는 애플리케이션 실행을 담당한다.
  • daemon thread는 JVM 종료를 막지 않는 보조 스레드다.
  • JVM internal thread는 JVM이 런타임 동작을 위해 내부적으로 사용하는 스레드다.