프로그래밍 38

thread - join()

1. 스레드의 상태 및 전이 과정Join() 을 알아보기 전에 스레드의 상태에 대한 이해가 필요하다.  스레드의 상태1) new (새로운 상태) : 스레드가 생성되었으나 아직 시작되지 않은 상태.2) Runnable (실행 가능 상태) : 스레드가 실행 중이거나 실행될 준비가 된 상태3) 일시 중지 상태들 (Suspended State) - Block (차단 상태) : 스레드가 동기화 락을 기다리는 상태- Waiting (대기 상태) : 스레드가 무기한으로 다른 스레드의 작업을 기다리는 상태- Time Waiting (시간 제한 대기 상태) : 스레드가 일정 시간 동안 다른 스레드의 작업을 기다리는 상태4) Terminated (종료 상태) : 스레드의 실행이 완료된 상태  자바 스레드 상태 전이 과정1..

Virtual Thread (kakao tech)

01. Virtual Tread란 무엇인가- JDK 21(LTS)에 추가된 경량스레드- OS 스레드를 그대로 사용하지 않고 JVM 내부 스케줄링을 통해 수십~수백만개의 스레드를 동시에 사용할 수 있게한다. 기존 Thread의 문제점1) 정통적인 Java의 Thread - Java의 Thread는 OS Thread를 Wrapping 한 것 (Platform Thread)- Java 어플리케이션에서 Thread를 사용하면 실제로는 OS Thread를 사용한 것- OS Thread는 생성 갯수가 제한적이고 생성, 유지하는 비용이 비싸다.- 이 때문에 애플리케이션에서는 플랫폼 스레드를 효줄적으로 사용하기 위해 Thread Pool을 사용했다.  2) Throughput  - 기본적인 Web Request 처리 ..

Virtual Thread (10분 테코톡)

1. Thread 란 위 그림은 JVM 내부 Runtime Data Area이다.  1) Heap- new 명령어로 생성된 인스턴스가 저장되는 공간  2) Method Area - 클래스, 변수, static, 정적 변수가 저장되는 공간 - 안에 있는 runtime constant pool은 클래스 정보와 같은 메타 데이터가 저장되는 공간  3) Thread- 프로세스의 작은 작업 단위를 말한다.  3-1) PC (Process Counter Register)- 스레드 작업 흐름 단위를 저장하고 있다.3-2) JVM Stack- 메소드 스택을 저장.- 메소드가 종료되면 메모리 공간에서 사라지게 된다.3-2) Native Method Stack- JNI (Java Nativce Interface) 이다. ..

Java21 Virtual Thread

1. Java 21에서 가상 스레드를 왜 도입하였을까. 1) IO 중심 작업에서 처리량(성능)을 늘리기 위함- 대표적인 IO 중심 작업은 DB를 사용하는 웹 서버를 예로 들수 있다. - DB를 사용하는 웹 서버는 DB와 통신하기 위해 IO를 사용한다.- 즉, IO 중심이 많은 서버에서 처리량을 늘리기 위해 나온 것이 가상 스레드다.  2) 트래픽이 많음 + IO가 많이 발생함 + 요청마다 쓰레드를 만드는 방식- 이 방식을 사용하게되면 스레드가 메모리를 사용하기 때문에 많은 메모리가 사용된다.- IO가 발생하면 응답 대기 (blocking) 되는 시간, 컨텍스트 스위칭에 따른 CPU 낭비가 발생함.- 위와 같은 문제 때문에 스레드를 늘리고 싶어도 늘리지 못한다. 그리고 서버들은 스레드를 pool로 관리한다..

Java Virtual Thread (13), 병목 현상(bottleneck)

Virtual Thread를 적용했을 때 운영적인 측면에 대해 생각해보자.    1) tomcat-biz 가 하나의 spring boot application이다. 즉 두 개의 서버가 있고, 하나의 db가 있다.2) client 요청이 오면 톰켓이 받고 biz 로직에 따라 db 쿼리를 처리한다.   여기에 virtual thread를 사용하여 성능을 높일 수 있다. 그리고 서버 한 대를 줄이는 것을 고민하였다.  이 경우 아무런 이슈가 생기지 않을까?   tomcat 은 200개의 요청이 400개로 늘어났다. 다만 virtual thread이기 때문에 thread의 개수 제한이 거의 없다고 볼 수 있기 때문에 이는 문제가 되지 않는다.   생각해야할 지점은 DB이다. 기존은 HikariCP를 이용해 Co..

Java Virtual Thread (12), custom Executor, Scheduler

하나의 Spring Boot Application 인데, 이 안에 주문과 배송 등이 구현되어 있다고 가정해보자.   이 때 주문은 Virtual Thread를 사용하고, 다른 비즈니스에서는 CPU를 많이 사용하기 때문에 Platform Thread 를 사용하면서 사용할 수 있다. 만약, yml에 spring-virtual-enable-true로 설정한다면 virtual thread 로 바뀌기 때문에 Platform thread를 사용할 수 없다.  @Configuration@Slf4jpublic class SchedulerConfig { @Bean public ThreadPoolTaskScheduler threadPoolTaskScheduler() { ThreadPoolTaskS..

Java Virtual Thread (11), @scheduled 어노테이션

스케줄러에서 virtual thread가 잘 종료되는지 확인해보자.  import lombok.extern.slf4j.Slf4j;import org.springframework.scheduling.annotation.Scheduled;import org.springframework.stereotype.Service;@Service@Slf4jpublic class VirtualScheduler { @Scheduled(fixedRate = 5000) public void fixedRate() { log.info("fixedRate. thread: {}", Thread.currentThread()); }}import org.springframework.boot.SpringAppli..

Java Virtual Thread (7), Virtual Thread Dump

기본적으로 인텔리제이에서는 Thread Dump와 비슷한 기능을 제공하고 있다.  현재 인텔리제이에서는 디버그 모드를 통해 Virtual Thread가 몇개 떠 있는지 정확하게 알 수 없다. (2024.01 버전 기준)   @Slf4j// jcmd Thread.dump_to_file -format=text public class VirtualThreadDump { private static final Runnable runnable = new Runnable() { @Override public void run() { log.info("1) run. thread: " + Thread.currentThread()); try { ..