nyximos.log

[JAVA] JVM์€ ๋ฌด์—‡์ด๋ฉฐ ์ž๋ฐ” ์ฝ”๋“œ๋Š” ์–ด๋–ป๊ฒŒ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ธ๊ฐ€ ๋ณธ๋ฌธ

Programming/JAVA

[JAVA] JVM์€ ๋ฌด์—‡์ด๋ฉฐ ์ž๋ฐ” ์ฝ”๋“œ๋Š” ์–ด๋–ป๊ฒŒ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ธ๊ฐ€

nyximos 2022. 1. 8. 23:54

๐Ÿ‘ฉ‍๐Ÿš€ ๋ชฉํ‘œ

์ž๋ฐ” ์†Œ์Šค ํŒŒ์ผ(.java)์„ JVM์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ณผ์ • ์ดํ•ดํ•˜๊ธฐ

๐Ÿ‘ฉ‍๐Ÿ’ป ํ•™์Šตํ•  ๊ฒƒ

  • JVM์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€
  • JVM ๊ตฌ์„ฑ ์š”์†Œ
  • ์ปดํŒŒ์ผ ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ž€ ๋ฌด์—‡์ธ๊ฐ€
  • JIT ์ปดํŒŒ์ผ๋Ÿฌ๋ž€ ๋ฌด์—‡์ด๋ฉฐ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€
  • JDK์™€ JRE์˜ ์ฐจ์ด

 

๐Ÿค” JVM์ด๋ž€?

Java virtual machine

์ž๋ฐ”๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์ƒ ๊ธฐ๊ณ„(์ปดํ“จํ„ฐ)

๐Ÿค  ์™ธ๊ตญ์—์„œ๋Š” ์ปดํ“จํ„ฐ๋ฅผ ๋จธ์‹ ์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค๊ณ  ํ•œ๋‹ค~

์ž๋ฐ”๋กœ ์ž‘์„ฑ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ชจ๋‘ JVM์—์„œ๋งŒ ์‹คํ–‰๋œ๋‹ค.

์ž๋ฐ” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ JVMํ•˜๊ณ ๋งŒ ํ†ต์‹ ํ•˜๊ณ 

JVM์ด ์ž๋ฐ” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ๋ช…๋ น์„ ์šด์˜์ฒด์ œ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ณ€ํ™˜ํ•ด์„œ ์ „๋‹ฌํ•œ๋‹ค.

์ตœ๊ทผ์—๋Š” Scala, Kotlin, Groovy ๋“ฑ ์—ฌ๋Ÿฌ ์–ธ์–ด๋“ค์ด JVM์„ ์ด์šฉํ•˜๊ณ  ์žˆ๋‹ค.

 

์˜ค๋ฅธ์ชฝ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์ผ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ฝ”๋“œ๊ฐ€ OS๋งŒ ๊ฑฐ์น˜๊ณ  ํ•˜๋“œ์›จ์–ด๋กœ ์ „๋‹ฌ๋œ๋‹ค.

๋”ฐ๋ผ์„œ OS์— ์ข…์†์ ์ด๋‹ค.

→ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ OS์— ๋งž๊ฒŒ ๋ณ€๊ฒฝํ•ด์•ผ ํ•จ!!

 

Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ JVM์„ ํ•œ๋ฒˆ ๋” ๊ฑฐ์ณ์„œ OS์— ๋”ฐ๋ผ ํ•ด์„ํ•ด์ค€๋‹ค.

๋•๋ถ„์—  Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ OS๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ JVM์€ OS์— ์ข…์†์ ์ด๋‹ค.

์šด์˜์ฒด์ œ์— ๋งž๋Š” JVM์„ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค.

 

 

๐Ÿ“Œ ๊ฐ€์ƒ ๊ธฐ๊ณ„ virtual machine

์†Œํ”„ํŠธ์›จ์–ด๋กœ ๊ตฌํ˜„๋œ ํ•˜๋“œ์›จ์–ด

์ปดํ“จํ„ฐ์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์œผ๋กœ ์ธํ•ด ๋” ๋งŽ์€ ํ•˜๋“œ์›จ์–ด๋“ค์ด ์†Œํ”„ํŠธ์›จ์–ดํ™”๋˜๊ณ  ์žˆ๋‹ค.

ex) ์œˆ๋„์šฐ ๋ฏธ๋””์–ด ํ”Œ๋ ˆ์ด์–ด(TV์™€ ๋น„๋””์˜ค), ์œˆ์•ฐํ”„(์˜ค๋””์˜ค)

 

 

๐Ÿง JVM ๊ตฌ์„ฑ ์š”์†Œ

JVM์˜ ๊ตฌ์„ฑ์š”์†Œ๋Š” ํฌ๊ฒŒ 3๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ์ˆ˜ ์žˆ๋‹ค.

  1. Class Loader
  2. Runtime Data Area
  3. Execution Engine

JVM์ด ์‹คํ–‰๋˜๋ฉด OS๊ฐ€ JVM์—๊ฒŒ ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ด ์ค€๋‹ค.

 

 

๐Ÿ“Œ Class Loader

์‹คํ–‰์‹œ์ (Runtime)์— Class ํŒŒ์ผ(์ปดํŒŒ์ผํ•œ ๋ฐ”์ดํŠธ์ฝ”๋“œ)์„ ๋กœ๋“œํ•˜๊ณ , ๋ฉ”๋ชจ๋ฆฌ(Runtime Data Area)์— ๋งํฌ๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“ˆ์ด๋‹ค.

  1. ๋กœ๋”ฉ
    1) ํด๋ž˜์Šค ๋กœ๋”๊ฐ€ .class ํŒŒ์ผ์„ ์ฝ๊ณ 
    2) ๋‚ด์šฉ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ฌ → Method ์˜์—ญ์— ์ €์žฅ
          * Method ์˜์—ญ์— ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ
             : Type์ •๋ณด(class, interface, enum), ๋ฉ”์†Œ๋“œ, ๋ณ€์ˆ˜,
               FQCN (Fully Qualified Class Name : ํด๋ž˜์Šค๊ฐ€ ์†ํ•œ ํŒจํ‚ค์ง€๋ช…์„ ๋ชจ๋‘ ํฌํ•จํ•œ ์ด๋ฆ„))
    3) ๋กœ๋”ฉ ํ›„ Class ํƒ€์ž…์˜ Class ๊ฐ์ฒด ์ƒ์„ฑHeap ์˜์—ญ์— ์ €์žฅ

  2. ๋งํฌ : Verify, Prepare, Resolve ์„ธ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ ์ง
    1) Verify : .class ํŒŒ์ผ ํ˜•์‹ ์œ ํšจํ•œ์ง€ ์ฒดํฌ → ์œ ํšจํ•˜์ง€ ์•Š์„์‹œ JVM ์—๋Ÿฌ
    2) Prepare : ํด๋ž˜์Šค๋ณ€์ˆ˜(static ๋ณ€์ˆ˜)์™€ ๊ธฐ๋ณธ๊ฐ’์— ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ค€๋น„
    3) Resolve : ์‹ฌ๋ณผ๋ฆญ ๋ฉ”๋ชจ๋ฆฌ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋ฉ”์†Œ๋“œ ์˜์—ญ์— ์žˆ๋Š” ์‹ค์ œ ๋ ˆํผ๋Ÿฐ์Šค๋กœ ๊ต์ฒด(Optional)
    public class Application{
    	Person nyximos = new Person(); 
        ...
    }
    new Person()์—์„œ ์‹ค์ œ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š๋Š”๋‹ค.
    Resolve ๋‹จ๊ณ„์—์„œ ์‹ค์ œ ํž™์— ๋“ค์–ด์žˆ๋Š” ์ธ์Šคํ„ด์Šค๋กœ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ๊ต์ฒดํ•œ๋‹ค.
  3. ์ดˆ๊ธฐํ™” : ์ค€๋น„๋œ ๋ฉ”๋ชจ๋ฆฌ์— static ๋ณ€์ˆ˜์˜ ๊ฐ’ ํ• ๋‹น, static ๋ธ”๋Ÿญ์ด ์žˆ๋‹ค๋ฉด ์‹คํ–‰

 

๐Ÿ“Œ Runtime Data Area

Runtime Data Area๋Š” 5๊ฐœ์˜ ์˜์—ญ์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.

Method Area์™€ Heap Area๋Š” ๋ชจ๋“  Thread๊ฐ€ ๊ณต์œ ํ•˜๊ณ ,

Stack Area, PC Register, Native Method Stack์€  Thread ๋ณ„๋กœ ํ•˜๋‚˜์”ฉ ์กด์žฌํ•œ๋‹ค. 

  1. Method Area (Class Area)
  2. Stack Area
  3. Heap Area
  4. Program Counter Registers
  5. Native Internal Threads

1. Method Area (Class Area)

ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์ค‘ ํด๋ž˜์Šค ์‚ฌ์šฉ → ํด๋ž˜์Šค ํŒŒ์ผ์„ ์ฝ๊ณ  ๋ถ„์„ํ•˜์—ฌ ํด๋ž˜์Šค ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋“ค์„ Method Area์— ์ €์žฅ

 

์ €์žฅ๋˜๋Š” ์ •๋ณด

  • Type Information (Type : ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค ๋ชจ๋‘ ํ†ต์นญ) 
  • Runtime Constant Pool (Type์˜ ๋ชจ๋“  ์ƒ์ˆ˜ ์ •๋ณด)
  • Field information (Field๋Š” ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ๊ฐ€๋ฅดํ‚ด)
  • Method Information (Constructor๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ๋ฉ”์†Œ๋“œ)
  • Class Variable (static ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜)
    1) ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์— ๊ณต์œ  ๋˜๋ฉฐ ์ธ์Šคํ„ด์Šค๊ฐ€ ์—†์–ด๋„ ์ง์ ‘ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    2) ์ด ๋ณ€์ˆ˜๋Š” ์ธ์Šคํ„ด์Šค์˜ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํด๋ž˜์Šค์— ์†ํ•˜๊ฒŒ ๋œ๋‹ค.
    3) ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉ ํ•˜๊ธฐ ์ด์ „์— ์ด ๋ณ€์ˆ˜๋“ค์€ ๋ฏธ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น ๋ฐ›์•„ ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.
    4) final class ๋ณ€์ˆ˜๋Š” ์ƒ์ˆ˜๋กœ ์น˜ํ™˜ ๋˜์–ด Runtime Constant Pool์— ๊ฐ’์„ ๋ณต์‚ฌํ•œ๋‹ค.
static ๋ณ€์ˆ˜๋Š” Method Area์˜ Class Variable์— ์ €์žฅ
๊ธฐ๋ณธํ˜•์ด ์•„๋‹Œ static ํด๋ž˜์Šคํ˜• ๋ณ€์ˆ˜๋Š” ๋ ˆํผ๋Ÿฐ์Šค ๋ณ€์ˆ˜๋งŒ ์ €์žฅ๋˜๊ณ  ์‹ค์ œ ์ธ์Šคํ„ด์Šค๋Š” Heap์— ์ €์žฅ๋˜์–ด ์žˆ๋‹ค.
๊ทธ ํ›„ ์ด ์ธ์Šคํ„ด์Šค์˜ ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด Heap์— ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ™•๋ณด๊ฐ€ ๋˜๊ณ 
Heap์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ Method Area์˜ ์–ด๋Š ํด๋ž˜์Šค ์ •๋ณด์™€ ์—ฐ๊ฒฐ๋˜๋Š”์ง€ ์„ค์ • ํ•˜๊ฒŒ ๋œ๋‹ค.
- Minhyeok Jung๋‹˜ ๋ธ”๋กœ๊ทธ

 

ํด๋ž˜์Šค ๋กœ๋”ฉ์„ ์œ„ํ•œ JVM์˜ ๋กœ๋”ฉ ์ ˆ์ฐจ

1. ์–ด๋–ค ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฌธ์žฅ์„ ๋งŒ๋‚ฌ๋Š”๋ฐ ๊ทธ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง„ ํด๋ž˜์Šค ๋ฐ”์ดํŠธ๊ฐ€ ์•„์ง ๋กœ๋”ฉ๋œ ์ ์ด ์—†๋‹ค๋ฉด?
     → JRE ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํด๋”์—์„œ ํด๋ž˜์Šค ์ฐพ์Œ
2. ์—†์œผ๋ฉด CLASSPATH ํ™˜๊ฒฝ๋ณ€์ˆ˜์— ์ง€์ •๋œ ํด๋”์—์„œ ํด๋ž˜์Šค ์ฐพ์Œ
3. ์ฐพ์œผ๋ฉด ๊ทธ ํด๋ž˜์Šค ํŒŒ์ผ์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ๋ฐ”์ดํŠธ์ฝ”๋“œ ๊ฒ€์ฆ
4. ์˜ฌ๋ฐ”๋ฅธ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฉด ๋ฉ”์†Œ๋“œ ์˜์—ญ์œผ๋กœ ํŒŒ์ผ์„ ๋กœ๋”ฉ
5. ํด๋ž˜์Šค ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๋ผ๋Š” ๋ช…๋ น์–ด๊ฐ€ ์žˆ์œผ๋ฉด Method Area์— ๋ณ€์ˆ˜ ์ค€๋น„
6. ํด๋ž˜์Šค ๋ธ”๋ก์ด ์žˆ์œผ๋ฉด ์ˆœ์„œ๋Œ€๋กœ ๋ธ”๋ก ์ค€๋น„
์ด๋ ‡๊ฒŒ ํด๋ž˜์Šค์˜ ๋ฐ”์ดํŠธ์ฝ”๋“œ๊ฐ€ ๋กœ๋”ฉ๋˜๋ฉด JVM์ด ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์œ ์ง€๋œ๋‹ค.
- WANZA๋‹˜ ๋ธ”๋กœ๊ทธ

 

2. Stack Area (JVM Stack)

Thread ์ œ์–ด๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„

Thread๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ์ƒ์„ฑ๋œ๋‹ค.

๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์— ํ•ด๋‹น๋˜๋Š” ์ง€์—ญ๋ณ€์ˆ˜์˜ ๋ฐ์ดํ„ฐ ๊ฐ’์ด ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„

๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋˜๊ณ  ์ข…๋ฃŒ๋˜๋ฉด ํ•ด์ œ๋จ

๋ณ€์ˆ˜์— ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ํ• ๋‹น๋˜๋ฉด ์ด์ „ ๋ฐ์ดํ„ฐ๊ฐ€ ์ง€์›Œ์ง„๋‹ค.

  • Method๊ฐ€ ํ˜ธ์ถœ
    → Method์™€ Method ์ •๋ณด๋Š” Stack์— ์Œ“์ž„
    → Method ํ˜ธ์ถœ ์ข…๋ฃŒ๋ ๋•Œ Stack point์—์„œ ์ œ๊ฑฐ
  • Method ์ •๋ณด
    ๋งค๊ฐœ๋ณ€์ˆ˜, ์ง€์—ญ๋ณ€์ˆ˜, ์ž„์‹œ๋ณ€์ˆ˜, address(๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœํ•œ ์ฃผ์†Œ) ๋“ฑ
๋ฉ€ํ‹ฐ Thread ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ์šฐ ๊ฐ Thread๊ฐ€ ์ž์‹ ์˜ Stack์„ ๊ฐ€์ง€๊ณ ๋Š” ์žˆ์ง€๋งŒ Heap ์˜์—ญ์€ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—,
ํ”„๋กœ๊ทธ๋ž˜๋ฐ์‹œ์— Thread-safe ํ•˜์ง€ ์•Š๋Š” ์ด์Šˆ์— ์ฃผ์˜ํ•˜๋ฉฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•ด์•ผ ํ•œ๋‹ค.
๊ฒฐ๋ก ์ ์œผ๋กœ Heap ์˜์—ญ ์ž์ฒด๊ฐ€ Thread-safe ํ•˜์ง€ ์•Š๋Š” ์ƒํƒœ์ด๋‹ค.
Thread-safe ํ•˜๊ฒŒ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Immutableํ•œ ๊ฐ์ฒด๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
- Minhyeok Jung๋‹˜์˜ ๋ธ”๋กœ๊ทธ

 

3. Heap Area

์‚ฌ์šฉ์ž๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ณต๊ฐ„

๊ฐ์ฒด๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋ฉด ์ธ์Šคํ„ด์Šค๊ฐ€ Heap ์˜์—ญ์˜ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋˜์–ด ์‚ฌ์šฉ๋จ

ํ”„๋กœ๊ทธ๋žจ์€ ์‹œ์ž‘ํ•  ๋•Œ ๋ฏธ๋ฆฌ Heap ์˜์—ญ์„ ๋งŽ์ด ํ• ๋‹นํ•˜๊ณ  ์ธ์Šคํ„ด์Šค์™€ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅ๋œ๋‹ค.

Stack Area๊ณผ ๋‹ฌ๋ฆฌ Heap Area์—์„œ ๋ณด๊ด€๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋Š”

๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์ด ๋๋‚˜๋„ GC์— ์˜ํ•ด ์ œ๊ฑฐ๋˜๊ฑฐ๋‚˜ JVM์ด ์ข…๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง€ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š”๋‹ค.

 

๐Ÿฃ A a = new A(); ํ•˜๋ฉด ์ธ์Šคํ„ด์Šค๊ฐ€ ํž™์— ์ €์žฅ๋จ

Heap Area์— ์‹ค์ œ ๊ฐ’, ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์žˆ๊ณ  new ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์˜ ์ฐธ์กฐ ๊ฐ’, ์ฃผ์†Œ๊ฐ€ ๋ฆฌํ„ด๋˜์–ด  Stack์— ์ €์žฅ !!!!

 ์ฐธ์กฐํ˜•(Reference Type)์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๊ฐ–๋Š” ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค), ๋ฐฐ์—ด ๋“ฑ์€ Heap ์˜์—ญ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ๋‹ค.
์ด๋•Œ ๋ณ€์ˆ˜(๊ฐ์ฒด, ๊ฐ์ฒด๋ณ€์ˆ˜, ์ฐธ์กฐ๋ณ€์ˆ˜)๋Š” Stack ์˜์—ญ์˜ ๊ณต๊ฐ„์—์„œ ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ Heap ์˜์—ญ์˜ ์ฐธ์กฐ๊ฐ’(reference value, ํ•ด์‹œ์ฝ”๋“œ / ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ์ฃผ์†Œ๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๊ฐ’)์„ new ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ๋ฆฌํ„ด ๋ฐ›๋Š”๋‹ค.
๋‹ค์‹œ ๋งํ•˜๋ฉด ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š” Heap ์˜์—ญ์˜ ์ฐธ์กฐ ๊ฐ’์„ Stack ์˜์—ญ์˜ ๊ฐ์ฒด๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋‹ค.
์ด๋ ‡๊ฒŒ ๋ฆฌํ„ด ๋ฐ›์€ ์ฐธ์กฐ ๊ฐ’์„ ๊ฐ–๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด์„œ๋งŒ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋ฅผ ํ•ธ๋“ค ํ•  ์ˆ˜ ์žˆ๋‹ค.
-JOKER๋‹˜ ๋ธ”๋กœ๊ทธ

 

4. Program Counter Registers

Thread๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ์ƒ๊ธฐ๋Š” ๊ณต๊ฐ„

Thread๊ฐ€ ์–ด๋–ค ๋ช…๋ น์„ ์‹คํ–‰ํ• ์ง€ ๊ธฐ๋กํ•œ๋‹ค.

CPU๋‚ด์˜ ๊ธฐ์–ต์žฅ์น˜์ธ ๋ ˆ์ง€์Šคํ„ฐ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•œ๋‹ค. → Register-base ๐Ÿ™…‍โ™€๏ธ  Stack-base ๐Ÿ™†‍โ™€๏ธ

 

5. Native Method Stacks

์ž๋ฐ” ์ด์™ธ์˜ ์–ธ์–ด์—์„œ ์ œ๊ณต๋˜๋Š” Method์˜ ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„

(C, C++, ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ์ž‘์„ฑ๋œ Native ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ์ œ๊ณต)

JNI(Java Native Interface)๋ฅผ ํ†ตํ•ด ํ‘œ์ค€์— ๊ฐ€๊นŒ์šด ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅ

 

๐Ÿ“Œ Excution Engine

Runtime Data Area์— ํ• ๋‹น๋œ ByteCode๋ฅผ ์‹คํ–‰

 

CPU๋Š” Java Bytecode๋ฅผ ๋ฐ”๋กœ ์‹คํ–‰ ์‹œํ‚ฌ ์ˆ˜ ์—†๋‹ค.

๊ทธ๋ž˜์„œ Execution Engine๊ฐ€ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์‹คํ–‰ํ•œ๋‹ค.

Excution Engine์€ Interpreter์™€ JIT Compiler๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

 

1. Interpreter

Java class ํŒŒ์ผ์˜ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ํ•œ์ค„์”ฉ ์ฝ์–ด์„œ native code(๊ธฐ๊ณ„์–ด)๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์‹คํ–‰ํ•œ๋‹ค.

๋ฐ˜๋ณต ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๋งค๋ฒˆ ์ธํ„ฐํ”„๋ฆฌํŒ…ํ•˜์—ฌ ๋น„ํšจ์œจ์ ์ด๋‹ค.

 

2. JIT Compiler

Interpreter์˜ ์†๋„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ์œ„ํ•ด ์ž์ฃผ ์‹คํ–‰๋˜๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์บ์‹ฑํ•˜์—ฌ ๋งค๋ฒˆ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ํ•œ๋ฒˆ์— ์ปดํŒŒ์ผํ•œ๋‹ค.

๋ฐ˜๋ณต ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ๋Š” JIT Compiler์— ์˜ํ•ด ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜๋˜์–ด Native Stack์— ์ €์žฅ๋œ๋‹ค.

 

3.  Garbage Collector

Runtime Data Area์˜ Heap Area์— ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋“ค ์ค‘ ์ฐธ์กฐ๋˜์ง€ ์•Š์€ ๊ฐ์ฒด๋“ค์„ ํƒ์ƒ‰ํ›„ ์ œ๊ฑฐํ•ด์ค€๋‹ค.

C๋‚˜ C++์˜ ๊ฒฝ์šฐ์—๋Š” ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น/์‚ฌ์šฉ ํ›„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜์—ฌ ๋‚ญ๋น„ํ•˜๊ฒŒ ๋˜์ง€๋งŒ,

JAVA์˜ ๊ฒฝ์šฐ Garbage Collector๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๊ด€๋ฆฌ, ์ตœ์ ํ™” ํ•ด์ค€๋‹ค.

 

Garbage Collector ๋™์ž‘ ์‹œ JVM ์‹คํ–‰์ด ๋ฉˆ์ถ”๊ฒŒ ๋˜๊ณ  ์ด๋ฅผ Stop The World๋ผ๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.

JAVA ๊ฐœ๋ฐœ์ž๋Š” ์ด ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด Heap ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด๋‚˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ ๋™์ž‘์— ๊ด€ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ณต๋ถ€ํ•ด์•ผํ•œ๋‹ค.

 

Stop The World๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ์Šค๋ ˆ๋“œ ์ž‘์—…์„ ์ค‘๋‹จ์‹œํ‚ค๋ฉด GC๋Š” ๋™์  ๊ฐ์ฒด์— ๋Œ€ํ•œ ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๊ฐ์ฒด๊ฐ€ ์ ์œ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ณผ์ •์„ Mark ๊ณผ์ •์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ,

Mark๊ณผ์ •์ด ๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฑด ๊ฐ์ฒด๊ฐ€ ์ ์œ ํ•˜๊ณ  ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ง์ด๋ฏ€๋กœ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

 

 

๐Ÿ‘€ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐฉ๋ฒ•

1. ๋Œ€์ถฉ JDK๋ฅผ ์„ค์น˜ํ•˜์ž

2. ์†Œ์Šค ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์ž
    ์ €์žฅํ•  ๋•Œ ๊ผญ ์†Œ์ŠคํŒŒ์ผ์˜ ํ™•์žฅ์ž๋ฅผ .java ๋กœ ํ•ด์ค˜์•ผ๋œ๋‹ค.

public class Hello {
  public static void main(String args[]){
    System.out.println("Hello World!");
  }
}

3. CMD๋ฅผ ์ผœ์„œ Hello.java๋ฅผ ์ปดํŒŒ์ผํ•˜์ž
   ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋ช…๋ น์–ด ๋ฒ„์ „์ด๋ฆ„์€ javac์ด๋‹ค.
   ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํด๋ž˜์ŠคํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์ค€๋‹ค.

4. ํด๋ž˜์Šค ํŒŒ์ผ์ด ์ƒ์„ฑ๋๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž

    Hello.java ์ƒ๊น€ ! (๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ JVM์ด ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด์ด๋‹ค.)

5. ์‹คํ–‰ํ•ด๋ณด์ž
   ๊ฐ€์ƒ ๊ธฐ๊ณ„์ธ java๋ฅผ ์ด์šฉํ•˜์—ฌ ํด๋ž˜์Šค ํŒŒ์ผ ์‹คํ–‰

 

 

๐Ÿค” ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ž€?

๋ฐ”์ดํŠธ ์ฝ”๋“œ ใ„ดใ„ด ๋ฐ”์ดํŠธ์ฝ”๋“œ ใ…‡ใ…‡

๋ถ™์—ฌ์„œ ์จ์•ผ๋œ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทผ๋ฐ ์ž๊พธ ๋„์›Œ์“ฐ๊ธฐ ๋ญ”๊ฐ€ ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ..

 

๊ฐ๊ฐ์˜ ๋ช…๋ น์–ด๊ฐ€ ํ•œ ๋ฐ”์ดํŠธ๋กœ ์ด๋ฃจ์–ด์ง€๊ณ  256๊ฐœ์˜ ๋ช…๋ น์–ด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ๋ณ€ํ™˜๋˜๋Š” ์ฝ”๋“œ์˜ ๋ช…๋ น์–ด์˜ ํฌ๊ธฐ๊ฐ€ 1byte๋ผ์„œ ์ž๋ฐ” ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค๊ณ  ํ•œ๋‹ค.

์ž๋ฐ”๋Š” OS์— ์ข…์†์ ์ด์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ JVM์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด์ธ ๋ฐ”์ดํŠธ์ฝ”๋“œ ํ˜•ํƒœ๋กœ ์ œ๊ณต๋˜๊ณ 

๋ฐ”์ดํŠธ์ฝ”๋“œ์™€ JVM์ด ์žˆ์œผ๋ฉด ์–ด๋Š ์šด์˜์ฒด์ œ์— ์ข…์†์ ์ด์ง€ ์•Š๊ณ  ์‹คํ–‰๋œ๋‹ค๊ณ  ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.

๊ธฐ๊ณ„์–ด๋Š” ์•„๋‹ˆ๋‹ค.

 

javap -c Hello.class๋กœ ํ•ด์„๋œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ

๐Ÿ˜..  ๋‚˜๋„ ๋ณด์—ฌ๋„.

์„ค์น˜๋Š” ๋˜์–ด์žˆ์—ˆ๋‹ค.

 

ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •์„ ๋‹ค์‹œ ํ•ด์ฃผ์—ˆ๋”๋‹ˆ ๋๋‹ค ๐Ÿ˜

 

ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • ์ œ๋Œ€๋กœ ํ–ˆ๋Š”๋ฐ๋„ ๊ณ„์† ์•ˆ๋ผ์„œ ์‰ฌ์ต์‰ฌ์ตํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ

cmd ๋‹ค์‹œ ์•ˆ์ผœ์„œ ๊ฒฝ๋กœ ์„ค์ •์ด ์•ˆ ๋œ๊ฑฐ์˜€๋‹ค..ใ…Ž๐Ÿคฆ‍โ™€๏ธ

 

 

๐Ÿ† JIT ์ปดํŒŒ์ผ๋Ÿฌ๋ž€ ๋ฌด์—‡์ด๋ฉฐ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€

Just In Time

์ปดํŒŒ์ผ๋Ÿฌ๋กœ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญํ•ด์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ

javac๋ž‘ ๋‹ค๋ฅด๋‹ค.

java ์‹คํ–‰ํ•˜๋Š” ์‹œ์ ์— ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญํ•˜๋Š” ์ปดํŒŒ์ผ ๊ธฐ๋ฒ•

์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ, JIT ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ €์žฅํ•ด๋†“๊ณ  ํ•ด์„ํ•˜์ง€์•Š๊ณ  ๋ฐ”๋กœ ์‹คํ–‰ํ•จ

๋Ÿฐํƒ€์ž„ ์‹œ ํด๋ž˜์ŠคํŒŒ์ผ(๋ฐ”์ดํŠธ์ฝ”๋“œ)๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ ๊ธฐ๊ณ„์–ด๋กœ ํ•œ๋ฐฉ์— ์ปดํŒŒ์ผ ํ›„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋…

 

 

๐Ÿคจ JDK์™€ JRE์˜ ์ฐจ์ด

JDK Java Development Kit ์ž๋ฐ” ๊ฐœ๋ฐœ ๋„๊ตฌ

JRE์— ์ถ”๊ฐ€๋กœ ์ปดํŒŒ์ผ๋Ÿฌ ๋””๋ฒ„๊ฑฐ ๋“ฑ ๋ช…๋ น์–ดํ–‰ ๊ฐœ๋ฐœ ๋„๊ตฌ๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ฒƒ

JDK ์•ˆ์— JRE๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

 

JRE Java Runtime Environment ์ž๋ฐ” ์‹คํ–‰ ํ™˜๊ฒฝ

์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์ž๋ฐ” ๊ฐ€์ƒ ๊ธฐ๊ณ„, ๊ธฐํƒ€ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์ œ๊ณต

๋‹จ์ˆœํžˆ ์‹คํ–‰๋งŒ ๐Ÿ™†‍โ™€๏ธ !!! ๊ฐœ๋ฐœ์€ ์•ˆํ•˜๋Š” ์ผ๋ฐ˜์ธ๋“ค์„ ์œ„ํ•œ ํ™˜๊ฒฝ

 

 

 

์ฐธ์กฐ

1์ฃผ์ฐจ ๊ณผ์ œ: JVM์€ ๋ฌด์—‡์ด๋ฉฐ ์ž๋ฐ” ์ฝ”๋“œ๋Š” ์–ด๋–ป๊ฒŒ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ธ๊ฐ€.

๋‚จ๊ถ์„ฑ, ์ž๋ฐ”์˜ ์ •์„ ๊ธฐ์ดˆํŽธ, ๋„์šฐ์ถœํŒ, 2019

Class Loader - https://medium.com/lucky-sonnie/java-classloader-%EC%97%90-%EB%8C%80%ED%95%B4-f9972c8c4b09

Class Loader - https://goodgid.github.io/Java-Class-Loader/

Runtime Data Area - https://www.holaxprogramming.com/2013/07/16/java-jvm-runtime-data-area/ (Minhyeok Jung๋‹˜)

Runtime Data Area - https://jithub.tistory.com/40

Method Area - https://blog.wanzargen.me/16 (WANZA๋‹˜)

Excution Engine - https://wonit.tistory.com/591

JIT Comiler - https://93jpark.tistory.com/58

์Šคํƒ & ํž™ - https://m.blog.naver.com/heartflow89/220954420688 (JOKER๋‹˜)

์Šคํƒ & ํž™ - https://hanna97.tistory.com/entry/Method-Area%EC%99%80-JVM-Stack-Heap-%EB%A9%94%EB%AA%A8%EB%A6%AC%EC%9D%98-%EA%B5%AC%EC%A1%B0%EC%99%80-%EC%9A%A9%EB%8F%84

Garbage Collector - https://junhyunny.github.io/information/java/what-is-jvm/

 

javac ์˜ต์…˜ - https://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#options

 

javac - Java programming language compiler

Warn about finally clauses that cannot complete normally. For example: public static int m() { try { throw new NullPointerException(); } catch (NullPointerException e) { System.err.println("Caught NullPointerException."); return 1; } finally { return 0; }

docs.oracle.com