๐ณ๏ธโ๐ [๊ถ๊ธํ์ ]
๐[๋ชฉ์ฐจ]
| ๋ฒ์ | ์ถ์์ผ | LTS ์ฌ๋ถ | ๊ณต์ ์ง์ ์ข ๋ฃ | ์ฃผ์ ํน์ง | ๊ถ์ฅ ํ๊ฒฝ |
|---|---|---|---|---|---|
| JDK 8 | 2014-03 | Y | 2030 (Oracle ์ ๋ฃ) | ๋๋ฆฌ ์ฌ์ฉ๋จ, ๋ง์ ์์คํ ๊ณผ ํธํ | ๋ ๊ฑฐ์ ์์คํ , ๋ณด์์ ์ด์ ํ๊ฒฝ |
| JDK 11 | 2018-09 | Y | 2026-09 (๋ฌด๋ฃ), 2032 (์ ๋ฃ) | ๋ชจ๋ ์์คํ (JPMS), ZGC, TLS 1.3 | ์์ ์ ์ด์ ์์คํ , ๋ง์ด๊ทธ๋ ์ด์ ์๋ฃ ํ๊ฒฝ |
| JDK 17 | 2021-09 | Y | 2029-09 (๋ฌด๋ฃ), 2031+ (์ ๋ฃ) | Sealed classes, pattern matching, ์ฑ๋ฅ ๊ฐ์ | ์ ๊ท ์๋น์ค, ์ปจํ ์ด๋ ๊ธฐ๋ฐ ๋ฐฐํฌ |
| JDK 21 | 2023-09 | Y | 2031-09 (๋ฌด๋ฃ) | Virtual threads, record patterns, ๊ฐํ๋ GC | ๊ณ ์ฑ๋ฅ ๋ง์ดํฌ๋ก์๋น์ค, ์ต์ JVM ๊ธฐ๋ฅ ํ์ฉ |
| JDK 22 | 2024-03 | N (๋นLTS) | 6๊ฐ์ ์ง์ | Preview ๊ธฐ๋ฅ ์คํ์ฉ | ํ ์คํธ, ์ฐ๊ตฌ์ฉ |
| ์ฉ๋ | ์ถ์ฒ JDK ๋ฒ์ | ์ด์ |
|---|---|---|
| Spark (3.x ~ 4.x) | JDK 8 ๋๋ 11 | ์์ ์ฑ๊ณผ ํธํ์ฑ ๋ฉด์์ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋จ. ์ผ๋ถ ์ต์ ๋ฒ์ ์ JDK 17๋ ์ง์ํ์ง๋ง, ๋๋ถ๋ถ 11์ด ๊ฐ์ฅ ์์ ํจ. |
| Trino (>= 380) | JDK 17 | Trino๋ JDK 17 ์ด์์ ๊ณต์์ ์ผ๋ก ๊ถ์ฅํจ. JDK 21์์๋ ์ ์๋ํจ. |
| Iceberg | JDK 11 ์ด์ | Iceberg๋ Spark ๋๋ Trino์ ๋ฐ๋ผ ๋ค๋ฆ. Spark์ ํจ๊ป ์ฐ๋ฉด Spark ๊ธฐ์ค์ ๋ฐ๋ผ์ผ ํจ. |
| Flink | JDK 8 ๋๋ 11 | JDK 17๋ ์ผ๋ถ ์ง์๋์ง๋ง ๋ณด์์ ์ผ๋ก๋ 8 ๋๋ 11์ด ์ผ๋ฐ์ . |
| Hive Metastore | JDK 8 ๋๋ 11 | ์ค๋๋ ์ฝ๋๋ฒ ์ด์ค์ด๋ฏ๋ก JDK 11๊น์ง๊ฐ ๊ฐ์ฅ ์์ ํจ. |
| Kafka | JDK 11 (์ต์ ๋ฒ์ ์ JDK 17๋ ๊ฐ๋ฅ) | Kafka๋ 11์์ ์์ ์ ์ผ๋ก ๋์. ์ผ๋ถ ์ต์ ๋ฆด๋ฆฌ์ค๋ JDK 17๊น์ง๋ ์ง์. |
| ๋ฐฐํฌํ | ์ค๋ช |
|---|---|
| Temurin (Adoptium) | ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๊ณ ์์ ์ ์ธ ์คํ์์ค JDK. ๊ธฐ์ ๋ฐ ์คํ์์ค ํ๋ก์ ํธ์์ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉ๋จ. |
| OpenJDK (ํจํค์ง ๋งค๋์ ์ค์น) | ๊ณต์ JDK. ๋ค๋ง ์ผ๋ถ ํจํค์ง๋ ์ ๋ฐ์ดํธ๊ฐ ๋๋ฆด ์ ์์. |
| Amazon Corretto | AWS ๊ธฐ๋ฐ ํ๋ก์ ํธ์์ ์ฌ์ฉ ์ ์ถ์ฒ๋จ. ์ฅ๊ธฐ ์ง์(LTS) ์ ๊ณต. |
| Zulu OpenJDK (Azul) | ๋ค์ํ ํ๋ซํผ์ ๋ํ ํญ๋์ ์ง์. |
| ์ปดํฌ๋ํธ | JDK 21 ์ง์ ํํฉ (2025 ๊ธฐ์ค) | ์ฃผ์์ฌํญ |
|---|---|---|
| Trino (v466) | ๊ณต์์ ์ผ๋ก JDK 21 ์ง์ | Trino๋ ๋น ๋ฅด๊ฒ ์ต์ JDK ์ง์ํจ. |
| Apache Iceberg | Spark ๊ธฐ๋ฐ์ด๋ผ๋ฉด Spark ๊ธฐ์ค ๋ฐ๋ฆ | Spark 3.5+์์ JDK 21 ์ผ๋ถ ์ง์. Spark < 3.5๋ ์ง์ ๋ถํ์ค. |
| Apache Spark | Spark 3.5 ์ด์ ์ผ๋ถ ํธํ, ์์ ์ฑ ์ด์ ์กด์ฌ | ์์ง ์ค๋ฌด์์ Spark+JDK 21 ์กฐํฉ์ ๋๋ฌพ. |
| Hive Metastore | ๊ณต์์ ์ผ๋ก JDK 11 ์ดํ ๊ถ์ฅ | ์ค๋๋ ์ฝ๋๋ฒ ์ด์ค. JDK 21์์ ์๊ธฐ์น ์์ ์๋ฌ ๋ฐ์ ๊ฐ๋ฅ. |
| Apache Flink | JDK 21์ ์คํ์ ์์ค | ๋๋ถ๋ถ JDK 11๊น์ง ์์ . |
| Kafka | JDK 17๊น์ง ๊ด๋ฒ์ ๊ฒ์ฆ, 21์ ์คํ์ | ์ผ๋ถ JDK 21 ๋ฌธ์ ๋ณด๊ณ ๋จ. |
JDK 21์ด ๊ณ ์ฑ๋ฅ์ธ ์ด์ ๋ ์ฌ๋ฌ ๊ฐ์ง JVM ์์ค์ ํ์ ์ ๊ธฐ๋ฅ๊ณผ ์ธ์ด ๊ฐ์ ์ด ํฌํจ๋์๊ธฐ ๋๋ฌธ์ด๋ค. ํนํ ๋๊ท๋ชจ ๋ณ๋ ฌ ์ฒ๋ฆฌ๊ฐ ํ์ํ ํ๋์ ์๋น์ค ํ๊ฒฝ(API ์๋ฒ, ๋ง์ดํฌ๋ก์๋น์ค, Kafka ์๋น์ ๋ฑ)์ ๋งค์ฐ ์ ๋ง๋ค.
G1/ZGC๋ JDK 21์์ ์์ ์ฑ๊ณผ ์ฑ๋ฅ์ด ๊ทน๋ํ๋จ:GC throughput 5~10% ์ฆ๊ฐ, GC pause time์ ๋ ์งง์์ง (ํนํ ZGC)
JDK 21์ ์ปจํ ์ด๋ ๋ฐํ์(Kubernetes ๋ฑ)์ CPU/Memory limits๋ฅผ ์ ํํ ๊ฐ์งํ๊ณ JVM ํ๋ผ๋ฏธํฐ๋ฅผ ์๋ ์กฐ์
์: -XX:+UseContainerSupport๊ฐ ์๋ ํ์ฑํ
์ปจํ ์ด๋ ์ต์ ํ๋ GC ๋์๊ณผ CRaC(Coordinated Restore at Checkpoint) ๋ฑ ์ต์ ๊ธฐ๋ฅ ์ผ๋ถ๋ ์ง์ ์์
| ๊ตฌ์ฑ ์์ | JDK ๋ฒ์ | GC ์ถ์ฒ | ๋น๊ณ |
|---|---|---|---|
| Trino | JDK 17 | G1GC | ์์ ์ฑ๊ณผ ์ฑ๋ฅ ๊ท ํ. ZGC๋ ์คํ์ ์ผ๋ก ๊ฐ๋ฅ |
| Spark | JDK 17 | G1GC | Structured Streaming์์ ์์ ์ ๋์. ํนํ IcebergSink |
| Iceberg | N/A (๋ผ์ด๋ธ๋ฌ๋ฆฌ) | JVM ๊ธฐ๋ฐ ์ฑ์ ๋ฐ๋ฆ | Spark/Trino๊ฐ ๊ด๋ฆฌ |
| MinIO | Go ์ธ์ด ๊ธฐ๋ฐ | JVM ์๋ | JDK/GC์ ๋ฌด๊ด |
Virtual Thread๋ Java 19๋ถํฐ ํ๋ฆฌ๋ทฐ๋ก ๋์ ๋์๊ณ , Java 21์์ ์ ์ ๊ธฐ๋ฅ์ผ๋ก ์ฑํ๋ lightweight thread์ด๋ค. ๊ธฐ์กด์ Platform Thread์๋ ๋ค๋ฅด๊ฒ, OS ์ค๋ ๋์ ์ง์ ๋งคํ๋์ง ์์์ ์์ฒ, ์๋ง ๊ฐ์ ์ค๋ ๋๋ฅผ ์์ฑํด๋ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
๊ตฌ๋ถ Platform Thread Virtual Thread
๊ธฐ๋ฐ OS ์ค๋ ๋ Java ์ค์ผ์ค๋ฌ์ ์ํด ๊ด๋ฆฌ
์์ฑ ๋น์ฉ ๋์ ๋ฎ์
๋์ ์คํ ์ ์ ํ์ ์์ฒ~์๋ง ๊ฐ๋ ๊ฐ๋ฅ
๋ชฉ์ ์ ํต์ ๋ณ๋ ฌ ์ฒ๋ฆฌ ๋๊ท๋ชจ ๋์์ฑ ์ฒ๋ฆฌ (ex. ์น์๋ฒ ์์ฒญ ํธ๋ค๋ง ๋ฑ)
public class ManyVirtualThreads {
public static void main(String[] args) throws InterruptedException {
int threadCount = 10_000;
for (int i = 0; i < threadCount; i++) {
Thread.startVirtualThread(() -> {
try {
Thread.sleep(100); // ๋น๋๊ธฐ ์ฒ๋ฆฌ ์ ์ ์ฉ
System.out.println("Thread: " + Thread.currentThread());
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
Thread.sleep(2000); // ์ ์ฒด ์คํ ๋๊ธฐ
}
}
Virtual thread๋ ๋ธ๋กํน IO๋ณด๋ค๋ ๋น๋๊ธฐ/๋ ผ๋ธ๋กํน IO์ ํจ๊ป ์ฌ์ฉํ ๋ ๋ ํฐ ํจ๊ณผ๋ฅผ ๋ณธ๋ค.synchronized ๊ฐ์ ๊ธฐ์กด ๋ฝ ๋ฉ์ปค๋์ฆ์ virtual thread์ ์ฅ์ ์ ์ค์ผ ์ ์๋ค.
Java๊ฐ ์ด์์ฒด์ (OS) ์์ค์์์ ์ค๋ ๋ ๊ด๋ฆฌ์์ JVM ๋ด๋ถ ์ค์ผ์ค๋ง์ผ๋ก ๋ฐ๋์๋ค.
Platform Thread๋ OS ์ค๋ ๋ 1:1 ๋งคํ ๊ตฌ์กฐ์ด๋ค. new Thread()๋ก ๋ง๋ค๋ฉด JVM์ด OS์๊ฒ ์ค๋ ๋๋ฅผ ์์ฒญํด์ ์ปค๋ ๋ฆฌ์์ค๊ฐ ํ ๋น๋๋ค.
์ด๋ก ์ธํด ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ์ ์ด ์๊ธด๋ค.
Virtual Thread๋ JVM ๋ด๋ถ์ lightweight ์ค๋ ๋์ด๋ค. OS ์ค๋ ๋์ ์ง์ ์ฐ๊ฒฐ๋์ง ์๊ณ , JVM์ด ๋ช ๊ฐ์ ๊ณ ์ ๋ carrier thread๋ฅผ ํตํด ๋ง์ virtual thread๋ฅผ multiplexing ํด์ค๋ค.
Java Continuations (Continuation Stack):
์คํ ์ค์ด๋ Virtual Thread์ ์คํ ํ๋ ์์ ์ ์ฅํ๊ณ ์ค๋จํ ์ ์์.
์ฆ, Thread.sleep() ํ๋ฉด ์คํ ์ ์ฅํ๊ณ , carrier thread๋ ๋ค๋ฅธ virtual thread ์ฒ๋ฆฌํ๋ฌ ๊ฐ.
User-mode Scheduling:
OS ๋์ JVM์ด thread ์ ํ์ ๋ด๋น โ context switching์ด ๋งค์ฐ ๋น ๋ฆ.
Non-blocking APIs์์ ํตํฉ:
๊ธฐ์กด blocking I/O API (sleep, Socket.read)๋ ๋ด๋ถ์ ์ผ๋ก๋ JVM์ด ์์์ virtual thread friendlyํ๊ฒ ๋์์ํด.
Virtual Thread๋ Java ์ฝ๋ ๋ด์ ๋ธ๋กํน์ ๊ฐ์งํ๊ณ ํํผํ ์ ์์ง๋ง, JNI ํธ์ถ, ํ์ผ I/O, native socket, ๋๊ธฐ JDBC ๋ฑ์ OS ์ค๋ ๋ ์์ค์์ ๋ธ๋กํน๋์ด Virtual Thread์ ์ฅ์ ์ด ์ฌ๋ผ์ง๋ค.
virtualThreadExecutor.submit(() -> {
// ์ค๋ ๊ฑธ๋ฆฌ๋ native ๋ธ๋กํน ํจ์ ํธ์ถ ์ -> ์ค์ OS thread๊ฐ ์ ์ ๋จ
someBlockingNativeFunction();
});
๊ฐ๋ฅํ๋ฉด ๋น๋๊ธฐ I/O ์ฌ์ฉํ๋๋ก ํ๋ค.
Virtual Thread๋ thread-local์ ์ฑ๋ฅ์ ์ํด ๋ณต์ฌํ์ง ์๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฒฉ๋ฆฌํ๋ฏ๋ก ์์๊ณผ ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์๋ค.
ThreadLocal ๋์ ScopedValue ์ฌ์ฉํ๋ค. (Java 21๋ถํฐ ํ๋ฆฌ๋ทฐ)
๊ธฐ์กด APM, thread dump ๋๊ตฌ๋ค์ด ์๋ง ๊ฐ์ Virtual Thread๋ฅผ ๊ฐ๋น ๋ชป ํ๊ฑฐ๋ ์ ํํ ์ ๋ณด ์ ๊ณต ๋ชปํ๋ค.
์ต์ ๋๊ตฌ jcmd, jfr ๋ฑ์ผ๋ก ๋ถ์ํ๋ค.
Virtual Thread๋ I/O-bound ์์ ์ต์ ํ์ ํ์ํ๋ CPU-bound ์์ ์ ๋ณ๋ ฌ ์ค๋ ๋ ๊ฐ์ ๋๋ฆฐ๋ค๊ณ ์ฑ๋ฅ์ด ์ค๋ฅด์ง ์์ (์คํ๋ ค ์ปจํ ์คํธ ์ค์์นญ ๋น์ฉ ์ฆ๊ฐ ๊ฐ๋ฅ)