๐ŸŒˆ [Section1] 18. Java ์‹ฌํ™”2

ํ˜„์ฃผยท2022๋…„ 9์›” 18์ผ
0

bootcamp

๋ชฉ๋ก ๋ณด๊ธฐ
18/71

๐Ÿ“• ์˜ค๋Š˜ ๋ฐฐ์šด ๋‚ด์šฉ!

  • ์Šค๋ ˆ๋“œ
  • JVM

โœ๏ธ ํ”„๋กœ์„ธ์Šค (Process)

  • ์‹คํ–‰ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
  • ๋ฐ์ดํ„ฐ, ์ปดํ“จํ„ฐ ์ž์›, ์Šค๋ ˆ๋“œ๋กœ ๊ตฌ์„ฑ

โœ๏ธ ์Šค๋ ˆ๋“œ (Thread)

  • ํ•˜๋‚˜์˜ ์ฝ”๋“œ ์‹คํ–‰ ํ๋ฆ„

โœ” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ(Main thread)

  • Main ์—์„œ ์‹คํ–‰๋˜๋Š” ์Šค๋ ˆ๋“œ

โœ” ์ž‘์—… ์Šค๋ ˆ๋“œ

  • ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์™ธ์— ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ

โœ” ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ(Multi-Thread)

  • ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒƒ -> ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ”„๋กœ์„ธ์Šค
  • ๋ฉ€ํ‹ฐ ํƒœ์Šคํ‚น(๋™์‹œ์— ์—ฌ๋Ÿฌ์ž‘์—…) ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ํ•ต์‹ฌ์ ์ธ ์—ญํ• 
    (๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ - ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ)

โœ” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ํ™œ์šฉ

  • ๊ทธ๋ƒฅ ๋ฉ”์ธ์— ์‹คํ–‰ํ•  ์ฝ”๋“œ ์“ฐ๋ฉด ๋จ

โœ๏ธ ์ž‘์—… ์Šค๋ ˆ๋“œ ํ™œ์šฉ

  1. ์ฝ”๋“œ ์ž‘์„ฑํ•  ๊ณต๊ฐ„ ๋งŒ๋“ค๊ธฐ (๋Ÿฌ๋„ˆ๋ธ” ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ / ์Šค๋ ˆ๋“œ ํด๋ž˜์Šค ์ƒ์†)
  2. ์ฝ”๋“œ ์ž‘์„ฑ
  3. ์Šค๋ ˆ๋“œ ์ƒ์„ฑ
  4. ์Šค๋ ˆ๋“œ ์‹คํ–‰ ( ์Šค๋ ˆ๋“œ ์ฐธ์กฐ๊ฐ’.start() )

    ๐Ÿ’ก start() ๋ฉ”์„œ๋“œ ์ด์šฉํ•ด์„œ ์‹คํ–‰ํ•˜๋ฉด ๋ฐ”๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‹คํ–‰ ๋Œ€๊ธฐ ์ƒํƒœ๊ฐ€ ๋˜๊ณ  ์‹คํ–‰์€ ์šด์˜์ฒด์ œ์˜ ๊ณ„ํš์— ๋”ฐ๋ผ ์šด์˜์ฒด์ œ๊ฐ€ ์‹คํ–‰ !

โœ๏ธ ์ž‘์—… ์Šค๋ ˆ๋“œ ์ƒ์„ฑ ๋ฐฉ๋ฒ• 3๊ฐ€์ง€

  1. Runnable ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์—์„œ run() ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์„œ ์žฌ์ •์˜
    (Run() ๋ฉ”์„œ๋“œ ์•ˆ์— ์ฝ”๋“œ ์ž‘์„ฑ)
    -> Thread๋ฅผ ์ƒ์†๋ฐ›์€ ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— Thread ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์ธ์Šคํ„ด์Šคํ™” ํ•˜๋ฉด์„œ Runnable์„ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„์•ผํ•จ

  2. Thread ํด๋ž˜์Šค ์ƒ์†๋ฐ›์€ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ run() ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์„œ ์žฌ์ •์˜
    (Run() ๋ฉ”์„œ๋“œ ์•ˆ์— ์ฝ”๋“œ ์ž‘์„ฑ)
    -> Thread ํด๋ž˜์Šค ์ง์ ‘ ์ธ์Šคํ„ด์Šคํ™” ํ•  ํ•„์š” ์—†๊ณ  ๋ฐ”๋กœ ๊ตฌํ˜„ํ•ด์ฃผ๋ฉด ๋จ

  3. ์ต๋ช…์˜ Runnable ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•˜์—ฌ Thread๋ฅผ ์ƒ์„ฑ ํ›„ ๊ทธ ์•ˆ์— run() ๋ฉ”์„œ๋“œ ์ ์–ด์คŒ

๐Ÿ’ก Runnerble ์ธํ„ฐํŽ˜์ด์Šค

  • ์ถ”์ƒ๋ฉ”์„œ๋“œ๋กœ ์ •์˜๋˜์–ด ์žˆ์Œ
    (์Šค๋ ˆ๋“œ์—๊ฒŒ ์ž‘์—… ๋งก๊ธฐ๋ ค๋ฉด ๋ฌด์กฐ๊ฑด ์ด ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ํ•ด์•ผํ•จ)
  • Thread ํด๋ž˜์Šค๋„ Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์ž„

โœ”๏ธ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์™€ ์ž‘์—… ์Šค๋ ˆ๋“œ๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•œ ๊ฒฝ์šฐ

๋‘ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ณ‘๋ ฌ๋กœ ๋™์‹œ ์‹คํ–‰๋˜์–ด ๋‘ ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜๊ฐ’๋“ค์ด ๋žœ๋ค์˜ ์ˆœ์„œ๋กœ ์ถœ๋ ฅ๋จ
-> ์ˆœ์„œ๋ฅผ ์ •ํ•ด์ค„ ํ•„์š”๊ฐ€ ์žˆ์Œ !

๐Ÿ’ก ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๊ฒฝ์šฐ ํ™•์ธ์„ ์œ„ํ•ด ๋งŽ์ด ์“ฐ์ด๋Š” ๋ฉ”์„œ๋“œ

  • ์Šค๋ ˆ๋“œ ์ด๋ฆ„ ์กฐํšŒ - ์Šค๋ ˆ๋“œ ์ฐธ์กฐ๊ฐ’.getName()
    -> ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์˜ ์ด๋ฆ„ : Main
    -> ์ž‘์—… ์Šค๋ ˆ๋“œ์˜ ์ด๋ฆ„ : Thread - ์ˆซ์ž
    โ €
  • ์Šค๋ ˆ๋“œ ์ด๋ฆ„ ์„ค์ • - ์Šค๋ ˆ๋“œ ์ฐธ์กฐ๊ฐ’.setName()
    โ €
  • ์Šค๋ ˆ๋“œ ์ธ์Šคํ„ด์Šค์˜ ์ฃผ์†Œ๊ฐ’ ์–ป๊ธฐ - Thread.currentThread()
    -> ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ๊ทธ ์œ„์น˜์˜ Thread๋ฅผ ๋ฆฌํ„ด
    โ €
  • ์Šค๋ ˆ๋“œ ์ƒํƒœ ํ™•์ธ - ์Šค๋ ˆ๋“œ ์ฐธ์กฐ๊ฐ’.getState()
    -> start() ๋ฉ”์„œ๋“œ๋กœ ์‹คํ–‰ํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” new ์ƒํƒœ
    -> ์‹คํ–‰ ํ›„์—๋Š” runnable ์ƒํƒœ
    -> Thread๊ฐ€ ๋ชจ๋‘ ์ข…๋ฃŒ๋œ ํ›„์—๋Š” terminate ์ƒํƒœ

โœ๏ธ ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”

  • ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ”„๋กœ์„ธ์Šค ์ƒํ™ฉ์—์„œ ์ˆœ์„œ๊ฐ€ ์ •ํ•ด์ ธ ์žˆ์ง€ ์•Š๊ณ  ๋‘ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉด์„œ ๋‚˜๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ
    -> ์ž„๊ณ„์˜์—ญ์„ ์„ค์ •ํ•ด์ค˜์•ผํ•จ

๋™๊ธฐํ™” ๋ธ”๋Ÿญ์—๋Š” ๊ทธ๋ƒฅ this๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค ์ƒ๊ฐํ•ด ๋‹ค๋ฅธ ๊ฑฐ ๋“ค์–ด๊ฐ€๋Š” ๊ฑฐ ๊ฑฐ์˜ ๋ชป๋ดค๋Œ€

โœ” ์ž„๊ณ„์˜์—ญ

  • ์˜ค๋กœ์ง€ ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ ์˜์—ญ
    (์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ์–ด๋„ ์ž„๊ณ„์˜์—ญ์—์„œ๋Š” ํ•˜๋‚˜๋งŒ ์‹คํ–‰)

โœ” ๋ฝ

  • ์ž„๊ณ„์˜์—ญ์—์„œ ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ
    (ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž„๊ณ„์˜์—ญ ๋‚ด์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์ค‘์ผ ๋•Œ, ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋“ค์€ ๋ฝ์ด ์—†์œผ๋ฉด ๊ทธ ๊ฐ์ฒด์˜ ์ž„๊ณ„์˜์—ญ ๋‚ด์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Œ --> ๊ทธ ์Šค๋ ˆ๋“œ๊ฐ€ ์˜์—ญ ๋‚ด ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ์‹คํ–‰ํ•˜๋ฉด ๋ฝ ๋ฐ˜๋‚จํ•จ --> ์ด์ œ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋“ค ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋‹ค์‹œ ๋ฝ ๊ถŒํ•œ ํš๋“ํ•˜์—ฌ ์ฝ”๋“œ ์‹คํ–‰)

โœ๏ธ ์ž„๊ณ„์˜์—ญ ์„ค์ •

-> synchronized ํ‚ค์›Œ๋“œ

  1. ๋ฉ”์„œ๋“œ ์ „์ฒด๋ฅผ ์ž„๊ณ„์˜์—ญ์œผ๋กœ
  • ๋ฉ”์„œ๋“œ ๋ฐ˜ํ™˜ํƒ€์ž… ์ขŒ์ธก์— synchronized
  1. ๋ฉ”์„œ๋“œ ๋‚ด ํŠน์ • ์˜์—ญ๋งŒ ์ž„๊ณ„์˜์—ญ์œผ๋กœ
  • ๋ฉ”์„œ๋“œ {} ๋‚ด์— synchronized(ํ•ด๋‹น ์˜์—ญ์ด ํฌํ•จ๋œ ๊ฐ์ฒด์˜ ์ฐธ์กฐ this) {์‹คํ–‰ํ•  ์ฝ”๋“œ}

โœ๏ธ ์Šค๋ ˆ๋“œ ์‹คํ–‰ ์ œ์–ด ๋ฉ”์„œ๋“œ

โœ” sleep(long milliSecond)

  • milliSecond ๋™์•ˆ ์Šค๋ ˆ๋“œ๋ฅผ ์ž ์‹œ ๋ฉˆ์ถค(์‹คํ–‰ ์ƒํƒœ์—์„œ ์ผ์‹œ ์ •์ง€(TIMED_WAITING) ์ƒํƒœ๋กœ ์ „ํ™˜)(์‹œ๊ฐ„์€ ์•ฝ๊ฐ„์˜ ์˜ค์ฐจ๋ฅผ ๊ฐ€์ง)

  • Thread์˜ ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด Thread.sleep(์‹œ๊ฐ„); ์œผ๋กœ ํ˜ธ์ถœ

  • ์ธ์ž๋กœ ์ „๋‹ฌํ•œ ์‹œ๊ฐ„๋งŒํผ์˜ ์‹œ๊ฐ„์ด ๊ฒฝ๊ณผํ•œ ๊ฒฝ์šฐ / interrupt() ํ˜ธ์ถœํ•œ ๊ฒฝ์šฐ ์‹คํ–‰๋Œ€๊ธฐ ์ƒํƒœ๋กœ ๋ณต๊ท€

  • try{ Thread.sleep(์‹œ๊ฐ„); } catch () { ์‹คํ–‰๋ฌธ } ์ด๋ ‡๊ฒŒ ๊ฐ์‹ธ์„œ ์‹คํ–‰ํ•ด์ค˜์•ผํ•จ

โœ” interrupt()

  • ์ผ์‹œ ์ค‘์ง€ ์ƒํƒœ์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์‹คํ–‰ ๋Œ€๊ธฐ ์ƒํƒœ(Runnable)๋กœ ๋ณต๊ท€์‹œํ‚ด

  • ๋ฉˆ์ถ˜ ์Šค๋ ˆ๋“œ๋ง๊ณ  ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ๋ฉˆ์ถฐ ์žˆ๋Š” ์Šค๋ ˆ๋“œ.interrupt() ํ˜ธ์ถœํ•˜๋ฉด, ๊ธฐ์กด์— ํ˜ธ์ถœ๋˜์–ด ์Šค๋ ˆ๋“œ๋ฅผ ๋ฉˆ์ถ”๊ฒŒ ํ–ˆ๋˜ ๋ฉ”์„œ๋“œ์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ๋˜๊ณ , ๊ทธ์— ๋”ฐ๋ผ ์ผ์‹œ ์ •์ง€๊ฐ€ ํ’€๋ฆฌ๊ฒŒ ๋จ

โœ” yield()

  • ์šด์˜์ฒด์ œ์˜ ์Šค์ผ€์ค„๋Ÿฌ์—๊ฒŒ ํ• ๋‹น๋ฐ›์€ ์‹œ๊ฐ„์„ ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋‹ค๊ฐ€ yield() ํ˜ธ์ถœํ•˜๋ฉด ๋‚จ์€ ์‹œ๊ฐ„์€ ๋‹ค์Œ ์Šค๋ ˆ๋“œ์—๊ฒŒ ์–‘๋ณด

  • while๋ฌธ์—์„œ ๋ฌด์˜๋ฏธํ•œ ๋ฐ˜๋ณต์ด๋˜๊ณ  ์žˆ์„ ๋•Œ, yield() ํ˜ธ์ถœํ•˜๋ฉด ๋ฐ˜๋ณต์„ ๋ฉˆ์ถ”๊ณ  ์‹คํ–‰๋Œ€๊ธฐ ์ƒํƒœ๋กœ ๋ฐ”๋€œ -> ๋‚จ์€ ์‹คํ–‰์‹œ๊ฐ„์„ ๋Œ€๊ธฐ์—ด ์ƒ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—๊ฒŒ ์–‘๋ณด

โœ” join()

  • ํŠน์ • ์Šค๋ ˆ๋“œ๊ฐ€ ์ž‘์—…ํ•œ๋Š” ๋™์•ˆ ์ž์‹ ์„ ์ผ์‹œ์ค‘์ง€ ์ƒํƒœ๋กœ ๋งŒ๋“ค์–ด ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ
  • ์ธ์ž๋กœ ์‹œ๊ฐ„์€ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์ „๋‹ฌ ๊ฐ€๋Šฅ

join()๊ณผ sleep()
โ €
1. ๊ณตํ†ต์ 

  • ํ˜ธ์ถœํ•˜๋ฉด ์ผ์‹œ์ •์ง€ ์ƒํƒœ๊ฐ€ ๋จ
  • try...catch๋ฌธ์œผ๋กœ ๊ฐ์‹ธ์„œ ์‚ฌ์šฉ
  • interrupt()๋กœ ์‹คํ–‰๋Œ€๊ธฐ ์ƒํƒœ๋กœ ๋ณต๊ท€
  1. ์ฐจ์ด์ 
  • sleep() - Thread ํด๋ž˜์Šค์˜ static ๋ฉ”์„œ๋“œ
  • join() - ํŠน์ • ์Šค๋ ˆ๋“œ์—๋Œ€ํ•ด ๋™์ž‘ํ•˜๋Š” ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ
  • wait(), notify()
    -> ๋‘ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ต๋Œ€๋กœ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ด์•ผํ•  ๋•Œ ์‚ฌ์šฉ
    -> ์Šค๋ ˆ๋“œ1์ด ์ž๊ธฐ ์ž‘์—… ์™„๋ฃŒ -> ์Šค๋ ˆ๋“œ1์ด notify() ํ˜ธ์ถœ (๋„ˆ ํ•ด๋ผ) -> ์Šค๋ ˆ๋“œ2๊ฐ€ ์‹คํ–‰ ๋Œ€๊ธฐ ์ƒํƒœ๋จ -> ๊ณง ์Šค๋ ˆ๋“œ2 ์‹คํ–‰ -> ์Šค๋ ˆ๋“œ1์ด wait() ํ˜ธ์ถœ (๋‚˜ ๋ฉˆ์ถฐ์„œ ๊ธฐ๋‹ค๋ฆด๊ฒŒ) -> ์ž๊ธฐ ์ž์‹ ์ด ์ผ์‹œ์ •์ง€ ์ƒํƒœ๊ฐ€ ๋จ -> ์Šค๋ ˆ๋“œ2๊ฐ€ ์ž๊ธฐ ์ž‘์—… ์™„๋ฃŒ -> notify(),wait() ๋ฐ˜๋ณต

โœ๏ธ JVM(Java Virtual Machine)

  • ์ž๋ฐ”๋กœ ์ž‘์„ฑํ•œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•ด ์‹คํ–‰ํ•˜๋Š” ๋ณ„๋„์˜ ํ”„๋กœ๊ทธ๋žจ

โœ”๏ธ Java๊ฐ€ ์šด์˜์ฒด์ œ๋กœ๋ถ€ํ„ฐ ๋…๋ฆฝ์ ์ผ ์ˆ˜ ์žˆ๋Š” ์ด์œ 

-> JVM(Java Virtual Machine)์ด๋ผ๋Š” ์• ๊ฐ€ ์šด์˜์ฒด์ œ ๋งˆ๋‹ค Java ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์šด์˜์ฒด์ œ์— ๋งž๊ฒŒ ๋ณ€ํ™˜ํ•ด์„œ ์‹คํ–‰์‹œ์ผœ์ฃผ์–ด ์šด์˜์ฒด์ œ์™€ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•จ
(์šด์˜์ฒด์ œ์™€ Java ์‚ฌ์ด์˜ ๋‹ค๋ฆฌ๊ฐ€ JVM)
-> JVM์ด ์šด์˜์ฒด์ œํ•œํ…Œ ํ•„์š”ํ•œ ์ปดํ“จํ„ฐ ์ž์› ์ฃผ๋ฌธ -> ์šด์˜์ฒด์ œ๊ฐ€ ๊ฐ€์šฉ ์ž์› ํ™•์ธ ํ›„ JVM์—๊ฒŒ ํ• ๋‹น (์—ฌ๊ธฐ์„œ ํ• ๋‹น๋ฐ›์€ ๊ฒƒ => ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ(Runtime Data Area))

โœ๏ธ ์†Œ์Šค์ฝ”๋“œ๊ฐ€ JVM์œผ๋กœ ๋“ค์–ด๊ฐ€๋Š” ๊ณผ์ •

  1. Java๋กœ ์†Œ์Šค์ฝ”๋“œ ์ž‘์„ฑ/์‹คํ–‰

  2. ์ปดํŒŒ์ผ๋Ÿฌ ์‹คํ–‰๋˜๋ฉด์„œ ์ปดํŒŒ์ผ ์ง„ํ–‰

  3. ์ปดํŒŒ์ผ ๊ฒฐ๊ณผ๋กœ .java ํ™•์žฅ์ž ๊ฐ€์กŒ๋˜ ์†Œ์Šค์ฝ”๋“œ๊ฐ€ .class ํ™•์žฅ์ž ๊ฐ€์ง„ ๋ฐ”์ดํŠธ ์ฝ”๋“œ ํŒŒ์ผ๋กœ ๋ณ€ํ™˜๋จ

  4. JVM์ด ์šด์˜์ฒด์ œ๋กœ๋ถ€ํ„ฐ ์†Œ์Šค ์ฝ”๋“œ ์‹คํ–‰์— ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๋ฐ›์Œ

  5. ํด๋ž˜์Šค ๋กœ๋”(Class Loader)๊ฐ€ ๋ณ€ํ™˜๋œ ์ฝ”๋“œ ํŒŒ์ผ์„ JVM ๋‚ด๋ถ€๋กœ ๋ถˆ๋Ÿฌ๋“ค์—ฌ ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ(Runtime Data Area)์— ์ ์žฌ (๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ ์‹œํ‚ค๋Š” ๊ฒƒ)

  6. ์‹คํ–‰ ์—”์ง„(Execution Engine)์ด ์ ์žฌ๋œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ด(2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ)
    -> ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธํ„ฐํ”„๋ฆฌํ„ฐ(Interpreter) ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ํ•œ ์ค„์”ฉ ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญํ•˜๊ณ  ์‹คํ–‰
    -> ์ค‘๋ณต์ ์œผ๋กœ ์–ด๋–ค ๋ฐ”์ดํŠธ ์ฝ”๋“œ๊ฐ€ ๋“ฑ์žฅํ•  ๋•Œ, JIT Compiler(Just-In-Time Compiler) ํ†ตํ•ด ๋ฐ”์ดํŠธ ์ฝ”๋“œ ์ „์ฒด๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญํ•˜๊ณ  ์‹คํ–‰

โœ๏ธ JVM ๊ตฌ์กฐ

๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ(Runtime Data Area)

  • JVM์— ํ”„๋กœ๊ทธ๋žจ์ด ๋กœ๋“œ๋˜์–ด ์‹คํ–‰๋  ๋•Œ ํŠน์ • ๊ฐ’, ๋ณ€์ˆ˜ ๋“ฑ์˜ ๋ฐ์ดํ„ฐ๋“ค์ด ์ €์žฅ๋˜๋Š” ๊ณณ
  • ์œ„ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด 5๊ฐ€์ง€ ์˜์—ญ์œผ๋กœ ๊ตฌ๋ถ„๋จ
  1. Stack ์˜์—ญ
    ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ -> ๊ทธ ๋ฉ”์„œ๋“œ๋ฅผ ์œ„ํ•œ Method Frame์ด๋ผ๋Š” ๊ณต๊ฐ„ ์ƒ์„ฑ -> ๊ทธ ๊ณต๊ฐ„์— ์—ฐ์‚ฐ์‹œ ์ผ์–ด๋‚˜๋Š” ๊ฐ’๋“ค์ด ์ž„์‹œ ์ €์žฅ -> Stack์— ์ด Method Frame์ด ํ˜ธ์ถœ์ˆœ์œผ๋กœ ์Œ“์ด๊ฒŒ ๋จ (๋จผ์ € ํ˜ธ์ถœ๋˜๋ฉด ๋งจ ๋ฐ‘)(LIFO(Last In First Out)) -> ๋ฉ”์„œ๋“œ ๋™์ž‘ ์™„๋ฃŒ๋˜๋ฉด ์—ญ์ˆœ์œผ๋กœ(๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ํ˜ธ์ถœ๋œ ๊ฒƒ๋ถ€ํ„ฐ) ์ œ๊ฑฐ๋จ

    ๐Ÿ’ก LIFO(Last In First Out)๋ž€?

    • ๋งˆ์ง€๋ง‰์— ๋“ค์–ด๊ฐ„ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ๋‚˜์˜จ๋‹ค
    • Stack์˜ ๋ฐ์ดํ„ฐ ์ž…์ถœ๋ ฅ ์ˆœ์„œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์›์น™
      Ex. ํ”„๋ง๊ธ€์Šค
  2. Heap ์˜์—ญ
  • ๊ฐ์ฒด ์ƒ์„ฑ ํ›„ ๊ฐ์ฒด ์‹คํ–‰ -> Heap ์˜์—ญ์— ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๊ทธ ์œ„์น˜์˜ ์ฃผ์†Œ๊ฐ’์„ ๊ฐ์ฒด์˜ ์ฐธ์กฐ๋ณ€์ˆ˜์— ํ• ๋‹นํ•ด์คŒ (๊ทธ ์ฐธ์กฐ๋ณ€์ˆ˜๋Š” Stack ์˜์—ญ์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜)
  • Heap์˜์—ญ ๊ฐ์ฒด๋Š” ๋Œ€๋ถ€๋ถ„ ์ผํšŒ์„ฑ (๋ฉ”๋ชจ๋ฆฌ์— ๋‚จ์•„์žˆ๋Š” ๊ธฐ๊ฐ„์ด ๋Œ€๋ถ€๋ถ„ ์งง์Œ) -> ๊ทธ ๊ฐ์ฒด์˜ ์กด์žฌ ๊ธฐ๊ฐ„์— ๋”ฐ๋ผ Heap์˜์—ญ ์•ˆ์—์„œ๋„ Old์™€ Young์œผ๋กœ ์˜์—ญ์ด ๋‚˜๋‰จ
  1. Method ์˜์—ญ
  2. PC register
  3. Native Method Stack

โœ”๏ธ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃฌ๋‹ค

=> Stack ์˜์—ญ์— ์ €์žฅ๋˜์–ด์žˆ๋Š” ์ฐธ์กฐ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด Heap ์˜์—ญ์— ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃฌ๋‹ค
(Stack์— ์ฐธ์กฐ๊ฐ’, Heap์— ๋ฐ์ดํ„ฐ -> new์—ฐ์‚ฐ์ž๋กœ Heap์— ์ €์žฅ๋œ ์ฐธ์กฐ๊ฐ’์„ ๋ฆฌํ„ดํ•จ)


โœ๏ธ Garbage Collection

  • ํ”„๋กœ๊ทธ๋žจ์—์„œ ์•„๋ฌดํ•œํ…Œ๋„ ์ฐธ์กฐ๋˜๊ณ  ์žˆ์ง€ ์•Š๋Š” ๋”์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด/๋ณ€์ˆ˜๋“ค์„ ์ฐพ์•„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ ์œ ๋ฅผ ํ•ด์ œ ์‹œํ‚ด -> ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ํ™•๋ณด, ํšจ์œจ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

โœ” Garbage Collection์˜ ๋™์ž‘ ๋ฐฉ์‹

  • Stop The World๋ฅผ ํ†ตํ•ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์‹คํ–‰ํ•˜๋Š” ์Šค๋ ˆ๋“œ ์ œ์™ธํ•˜๊ณ  ๋‹ค๋ฅธ ๋ชจ๋“  ์Šค๋ ˆ๋“œ ์ž‘์—… ์ค‘๋‹จ์‹œํ‚ด -> ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ๋ชจ๋“  ๋ณ€์ˆ˜/๊ฐ์ฒด ํƒ์ƒ‰ํ•ด์„œ ๊ฐ๊ฐ ์–ด๋–ค ๊ฐ์ฒด ์ฐธ๊ณ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธ -> ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‹๋ณ„(Mark)ํ•ด์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ œ๊ฑฐ(Sweep)
    • Minor GC - Heap ์˜์—ญ ์•ˆ Young ์˜์—ญ์—์„œ ํ™œ๋™ํ•˜๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ
    • Major GC - Heap ์˜์—ญ ์•ˆ Old ์˜์—ญ์—์„œ ํ™œ๋™ํ•˜๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ

๐ŸŒˆ ๋Š๋‚€์ 

๊ทธ๋ž˜๋„ ์˜ค๋Š˜ ํ•™์Šต์€ ์–ด์ œ ํ–ˆ๋˜ stream ๋ณด๋‹ค ๊ดœ์ฐฎ์•˜๋‹ค!! ์–ด์ œ ๋„ˆ๋ฌด ๋ฉ˜๋ถ•์ด์—ˆ์–ด์„œ,, ๊ทธ๋ž˜๋„ ์˜ค๋Š˜ ์˜ค์ „์— ํŽ˜์–ด๋ž‘ ๋ฌธ์ œ ํ’€์–ด์•ผํ•ด์„œ ์ดํ•ดํ•˜๋ ค๊ณ  ์—ด์‹ฌํžˆ ๊ณต๋ถ€ํ–ˆ๋Š”๋ฐ ๊ทธ ๊ฒฐ๊ณผ๋กœ Stream ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ  ๋‚˜๋‹ˆ ์ด๋ฒˆ ๋ฌธ์ œ๋“ค์€ ๊ทธ๋ž˜๋„ ์ˆ ์ˆ  ํ’€๋ ธ๋‹ค ใ…Žใ…Ž ๋ฌธ์ œ ํ’€๋˜ ๋‚ ๋“ค ์ค‘์— ์ œ์ผ ์‰ฌ์› ๋˜ ๋‚  ๊ฐ™๋‹ค!! ์˜ค๋Š˜์€ ๊ธฐ๋ถ„ ์ข‹์€ ๋‚ ! ์ฃผ๋ง์—๋„ ๋นก๊ณตํ•ด์•ผ์ง€ ใ…Žใ…Ž

0๊ฐœ์˜ ๋Œ“๊ธ€