๐ŸŒŸ ์ž๋ฐ”๋Š” ์–ด๋–ป๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ํ•˜๋Š”๊ฐ€?

์ „์ฃผ์€ยท2022๋…„ 11์›” 17์ผ
7
post-thumbnail

Java ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

๐Ÿค” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณ ๋ คํ•ด์•ผํ•˜๋Š” ์ด์œ ?


์ž‘์—…๊ด€๋ฆฌ์ž๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด ํ”„๋กœ๊ทธ๋žจ๋งˆ๋‹ค ์ฐจ์ง€ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ ์œ ์œจ์ด ์˜ฌ๋ผ๊ฐ€๋ฉด ๋ฉ”์ธ๋“œ๋ผ์ด๋ธŒ์— ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์„ค์ •ํ•˜๊ณ  ๊ฑฐ๊ธฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์ฒ˜๋Ÿผ ์”๋‹ˆ๋‹ค. ์ด๊ฒŒ ๋งŒ์•ฝ HDD์— ์žกํ˜€์žˆ์œผ๋ฉด ๊ต‰์žฅํ•œ ์„ฑ๋Šฅ์ €ํ•˜๋ฅผ ๋ถˆ๋Ÿฌ์ผ์œผํ‚ค๊ณ  SSD๋„ ์ €์žฅ์žฅ์น˜์˜ ์—‘์„ธ์Šค์†๋„ ํŠน์„ฑ์ƒ ์ž‘์—…์ด ๋”๋””๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋Š” ์พŒ์ ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ  ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๊ผญ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ์ข‹์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.๐Ÿ˜Š

โœ” JVM(Java Virtual Machine)

์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋‹ฌ๋ฆฌ Java ํ”„๋กœ๊ทธ๋žจ์€ byte-code์™€ OS์‚ฌ์ด์— JVM์ด ์žˆ์–ด ์—ฌ๋Ÿฌ ์šด์˜์ฒด์ œ์—์„œ ๋™์ผํ•œ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.


์‚ฌ์ง„ ์ถœ์ฒ˜ ๋งํฌ

1. ํŒŒ์ผ์ด๋ฆ„.java : source file : ์‚ฌ๋žŒ์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” java ์–ธ์–ด๋กœ ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋œ ํŒŒ์ผ
2. ํŒŒ์ผ์ด๋ฆ„.class: byte code : java compiler(javac)๋ฅผ ํ†ตํ•ด ๋ณ€ํ™˜๋œ ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” 2์ง„๋ฒ•์œผ๋กœ ์ž‘์„ฑ๋œ ํŒŒ์ผ
byte code๋Š” JVM์˜ Class Loader๋กœ ๋ณด๋‚ด์ง€๊ฒŒ ๋˜์–ด OS์— ๋งž๊ฒŒ Native machine code๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

โœ” Java Memory Area ๊ตฌ์กฐ


์‚ฌ์ง„ ์ถœ์ฒ˜ ๋งํฌ

  • Class Loader๋Š” Class ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์™€์„œ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • Execution Engine ์€ Class Loader์„ ํ†ตํ•ด JVM ๋‚ด์˜ Runtime Data Area์— ๋ฐฐ์น˜๋œ Byte Code๋ฅผ ๋ช…๋ น์–ด ๋‹จ์œ„๋กœ ๋ถ„๋ฅ˜ํ•˜์—ฌ ์‹คํ–‰์‹œํ‚ค๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. Interpreter๋ฐฉ์‹๊ณผ JIT compiler ๋ฐฉ์‹์„ ํ˜ผํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Garbage Collector ๋Š” ํž™ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋“ค ์ค‘์—์„œ ์ฐธ์กฐ๋˜์ง€ ์•Š์€ ๊ฐ์ฒด๋“ค(null pointer)์„ ํƒ์ƒ‰ ํ›„ ์ œ๊ฑฐํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, GC๊ฐ€ ์—ญํ• ์„ ํ•˜๋Š” ์‹œ๊ฐ„์€ ์–ธ์ œ์ธ์ง€ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Garbage Collector์— ๋Œ€ํ•œ ์ž์„ธํ•œ ํฌ์ŠคํŒ…
  • Runtime Data Area (JVM Memory Area) ๋Š” JVM์ด ํ”„๋กœ๊ทธ๋žจ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ์œ„ํ•ด ์šด์˜์ฒด์ œ๋กœ๋ถ€ํ„ฐ ํ• ๋‹น๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค. ์ด ์˜์—ญ์€ ํฌ๊ฒŒ Method Area, Heap Area, Stack Area, PC Register, Native Method Stack๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1. Method Area

In the method area, all class level information like class name, immediate parent class name, methods and variables information etc. are stored, including static variables. There is only one method area per JVM, and it is a shared resource. From java 8, static variables are now stored in Heap area.

  • ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ •๋ณด๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ž…๋‹ˆ๋‹ค.
  • JVM๋‹น ๋”ฑ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
  • class ์ •๋ณด, ๋ฉ”์†Œ๋“œ์™€ ์ „์—ญ๋ณ€์ˆ˜ ์ •๋ณด, static ๋ณ€์ˆ˜ ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค. ์ž๋ฐ”8๋ถ€ํ„ฐ๋Š” static ๋ณ€์ˆ˜๋Š” heap area์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

2. Heap Area

Information of all objects is stored in the heap area. There is also one Heap Area per JVM. It is also a shared resource.

  • ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ •๋ณด๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ž…๋‹ˆ๋‹ค.
  • JVM๋‹น ๋”ฑ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
  • Heap์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” Garbage Collector ๊ฐ€ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š”ํ•œ ์†Œ๋ฉธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Objects ์ฆ‰, new ์—ฐ์‚ฐ์ž๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด, Array, String ๊ฐ™์€ ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.

3. Stack Area

For every thread, JVM creates one run-time stack which is stored here. Every block of this stack is called activation record/stack frame which stores methods calls. All local variables of that method are stored in their corresponding frame. After a thread terminates, its run-time stack will be destroyed by JVM. It is not a shared resource.

  • ์“ฐ๋ ˆ๋“œ๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ• ๋•Œ๋งˆ๋‹ค ํ”„๋ ˆ์ž„์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ฉ”์†Œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ํ•ด๋‹น ํ”„๋ ˆ์ž„์„ ์ œ๊ฑฐํ•˜๋Š” ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ex) int/ double/ char/ boolean๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜, ์ฐธ์กฐํƒ€์ž…๋ณ€์ˆ˜(heap์˜ ์ฃผ์†Œ๊ฐ’)
    โ— String๋กœ ์„ ์–ธ๋˜๋ฉด new๊ฐ€ ์—†์–ด๋„ ๊ฐ์ฒด์ด์ง€ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค!

4. PC Register

Store address of current execution instruction of a thread. Obviously, each thread has separate PC Registers.

  • ์“ฐ๋ž˜๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด์„œ ๊ฐ๊ฐ ํ•˜๋‚˜์”ฉ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
  • JVM์ด ์‹คํ–‰ํ•˜๊ณ  ์žˆ๋Š” ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ €์žฅํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

5. Native Method Stacks

For every thread, a separate native stack is created. It stores native method information.

  • Java ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๊ตฌ์„ฑ๋œ ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰์ด ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.
profile
๋” ๋ฉ€๋ฆฌ ๋ณด๋„๋ก ํ•ด์š”. ์ง„์ฃผ๋Š” ํ•˜๋ฃจ์•„์นจ์— ์ƒ๊ฒจ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

comment-user-thumbnail
2022๋…„ 11์›” 18์ผ

ํšจ์œจ์ ์œผ๋กœ ์ฝ”๋”ฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์ž˜ ์•Œ์•„์•ผ ๋  ๊ฒƒ ๊ฐ™๋„ค์š”!

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ