Threads

์Šค๋ ˆ๋“œ๋Š” ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‹คํ–‰๋˜๋Š” ์Šค๋ ˆ๋“œ์ž…๋‹ˆ๋‹ค. JVM์„ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ์—ฌ๋Ÿฌ ์‹คํ–‰ ์Šค๋ ˆ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Hotspot JVM์—๋Š” Java ์Šค๋ ˆ๋“œ์™€ ๊ธฐ๋ณธ ์šด์˜ ์ฒด์ œ ์Šค๋ ˆ๋“œ ๊ฐ„์— ์ง์ ‘ ๋งคํ•‘์ด ์žˆ์Šต๋‹ˆ๋‹ค. Thread-local storage, allocation buffers, synchronization objects, stacks ๋ฐ program counter์™€ native thread๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. The native thread๋Š” Java thread๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ํšŒ์ˆ˜๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šด์˜ ์ฒด์ œ๋Š” ๋ชจ๋“  thread๋ฅผ schedulingํ•˜๊ณ  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ CPU๋กœ ๋ณด๋‚ด๋Š” ์ฑ…์ž„์ด ์žˆ๋‹ค. The native thread๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๋ฉด Java thread์—์„œ run() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. run() ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜๋˜๋ฉด ํฌ์ฐฉ๋˜์ง€ ์•Š์€ ์˜ˆ์™ธ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๊ณ  native thread๋Š” thread ์ข…๋ฃŒ์˜ ๊ฒฐ๊ณผ๋กœ JVM์„ ์ข…๋ฃŒํ•ด์•ผ ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค(์ฆ‰, ๋งˆ์ง€๋ง‰ non-deamon thread์ธ์ง€). Thread๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด native thread์™€ Java thread ๋ชจ๋‘์— ๋Œ€ํ•œ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.

JVM System Threads

jconsole ํ˜น์€ any debugger๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ธ ์ˆ˜๋งŽ์€ threads๊ฐ€ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ threads๋Š” purblic static void main(String[]) ํ˜ธ์ถœํ•œ part๋กœ ์ƒ์„ฑ๋˜๋Š” main thread ๋ฐ main thread์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๋ชจ๋“  thread์™€ ํ•จ๊ป˜ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. Hotspot JVM์˜ ๊ธฐ๋ณธ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹œ์Šคํ…œ ์Šค๋ ˆ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Threads
Description

VM thread

์ด ์Šค๋ ˆ๋“œ๋Š” JVM์ด safe-point์— ๋„๋‹ฌํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…์ด ๋‚˜ํƒ€๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ž‘์—…์ด ๋ณ„๋„์˜ thread์—์„œ ๋ฐœ์ƒํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ชจ๋“  ์ž‘์—…์ด JVM์ด heap์— ๋Œ€ํ•œ ์ˆ˜์ •์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์—†๋Š” safe point์— ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—… ์œ ํ˜•์€ "stop-the-world" ์ด ์Šค๋ ˆ๋“œ๋Š” ์ฃผ๊ธฐ์  ์ž‘์—…์˜ ์‹คํ–‰์„ scheduleํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํƒ€์ด๋จธ ์ด๋ฒคํŠธ(์˜ˆ: ์ธํ„ฐ๋ŸฝํŠธ)๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.garbage collections, thread stack dumps, thread suspension ๋ฐ biased locking revocation์ž…๋‹ˆ๋‹ค.

Periodic task thread

์ด ์Šค๋ ˆ๋“œ๋Š” ์ฃผ๊ธฐ์  ์ž‘์—…์˜ ์‹คํ–‰์„ scheduleํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” timer events(์˜ˆ: interrupts)๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

GC thread

์ด๋Ÿฌํ•œ ์Šค๋ ˆ๋“œ๋Š” JVM์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ garbage collection ํ™œ๋™์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Compiler threads

์ด๋Ÿฌํ•œ ์Šค๋ ˆ๋“œ๋Š” ๋Ÿฐํƒ€์ž„์— ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค.

Signal dispatcher thread

์ด ์Šค๋ ˆ๋“œ๋Š” JVM ํ”„๋กœ์„ธ์Šค๋กœ ์ „์†ก๋œ ์‹ ํ˜ธ๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ์ ์ ˆํ•œ JVM ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ JVM ๋‚ด๋ถ€์—์„œ ์‹ ํ˜ธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Per Thread

๊ฐ ์‹คํ–‰ ์Šค๋ ˆ๋“œ์—๋Š” ๋‹ค์Œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Program Counter (PC)

๊ธฐ๋ณธ ๋ช…๋ น์–ด๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ํ˜„์žฌ ๋ช…๋ น์–ด(๋˜๋Š” opcode)์˜ ์ฃผ์†Œ์ด๋‹ค. ํ˜„์žฌ ๋ฉ”์„œ๋“œ๊ฐ€ natice์ผ ๋•Œ PC๋Š” ์ •์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  CPUs์—๋Š” PC๊ฐ€ ์žˆ์œผ๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ PC๋Š” ๊ฐ ๋ช…๋ น ํ›„์— ์ฆ๊ฐ€ํ•˜๋ฏ€๋กœ ์‹คํ–‰ํ•  ๋‹ค์Œ ๋ช…๋ น์˜ ์ฃผ์†Œ๋ฅผ ๋ณด์œ ํ•ฉ๋‹ˆ๋‹ค. JVM์€ PC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ์œ„์น˜๋ฅผ ์ถ”์ ํ•˜๋ฉฐ PC๋Š” ์‹ค์ œ๋กœ ๋ฉ”์„œ๋“œ ์˜์—ญ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

Stack

๊ฐ ์Šค๋ ˆ๋“œ์—๋Š” ํ•ด๋‹น ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฐ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ frame์„ ๋ณด์œ ํ•˜๋Š” ์ž์ฒด stack์ด ์žˆ์Šต๋‹ˆ๋‹ค. Stack์€ LIFO(Last In First Out) ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ด๋ฏ€๋กœ ํ˜„์ œ ์‹คํ–‰ ์ค‘์ธ ๋ฉ”์„œ๋“œ๊ฐ€ stack์˜ ๋งจ ์œ„์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์— ๋Œ€ํ•ด ์ƒˆ frame์ด ์ƒ์„ฑ๋˜๊ณ  stack ๋งจ ์œ„์— ์ถ”๊ฐ€(ํ‘ธ์‹œ)๋ฉ๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋ฐ˜ํ™˜๋˜๊ฑฐ๋‚˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ค‘์— ํฌ์ฐฉ๋˜์ง€ ์•Š์€ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด frame์ด ์ œ๊ฑฐ(ํŒ)๋ฉ๋‹ˆ๋‹ค. stack์€ frame ๊ฐ์ฒด๋ฅผ ํ‘ธ์‹œํ•˜๊ณ  ํŒํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ์ง์ ‘ ์กฐ์ž‘๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ frame ๊ฐ์ฒด๋Š” heap์— ํ• ๋‹น๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์—ฐ์†์ ์ผ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

Native Stack

๋ชจ๋“  JVM์ด native ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ thread ๋ณ„ native ๋ฉ”์„œ๋“œ ์Šคํƒ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. JVM์ด JNI(Java Native Invocation)์šฉ C-linkage ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋œ ๊ฒฝ์šฐ native stack์€ C stack์ด ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ธ์ˆ˜ ๋ฐ ๋ฐ˜ํ™˜ ๊ฐ’์˜ ์ˆœ์„œ๋Š” ์ผ๋ฐ˜์ ์ธ C ํ”„๋กœ๊ทธ๋žจ์˜ native stack๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. Native ๋ฉ”์„œ๋“œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ(JVM ๊ตฌํ˜„์— ๋”ฐ๋ผ) JVM์œผ๋กœ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๊ณ  Java ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ native Java ํ˜ธ์ถœ์€ stack(์ผ๋ฐ˜ Java ์Šคํƒ)์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. Thread๋Š” native stack์„ ๋– ๋‚˜ stack(์ผ๋ฐ˜ Java ์Šคํƒ)์— ์ƒˆ frame์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Stack Restrictions

Stack์€ ๋™์  ๋˜๋Š” ๊ณ ์ • ํฌ๊ธฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.Thread์— ํ—ˆ์šฉ๋œ ๊ฒƒ๋ณด๋‹ค ๋” ํฐ stack ํ•„์š”ํ•œ ๊ฒฝ์šฐ StackOverflowError๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. Thread์— ์ƒˆ frame์ด ํ•„์š”ํ•˜๊ณ  ์ด๋ฅผ ํ• ๋‹นํ•  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์œผ๋ฉด OutOfMemoryError๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์— ๋Œ€ํ•ด ์ƒˆ frame์ด ์ƒ์„ฑ๋˜๊ณ  stack ๋งจ ์œ„์— ์ถ”๊ฐ€(ํ‘ธ์‹œ)๋ฉ๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋ฐ˜ํ™˜๋˜๊ฑฐ๋‚˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ค‘์— ํฌ์ฐฉ๋˜์ง€ ์•Š์€ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด frame์ด ์ œ๊ฑฐ(ํŒ)๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ ์˜ˆ์™ธ ํ…Œ์ด๋ธ” ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.

Last updated

Was this helpful?