3 ๋ถ„ ์†Œ์š”


1. Runtime Data Area๋ž€


์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋ฉด JVM์ด OS๋กœ๋ถ€ํ„ฐ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ• ๋‹น๋ฐ›๊ณ 
JVM์€ ํ• ๋‹น๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์šฉ๋„์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌํ•˜๊ฒŒ ๋˜๋Š”๋ฐ
๊ด€๋ฆฌํ•˜๋Š” ์ „์ฒด ์˜์—ญ์„ Runtime Data Area๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์€ Method Area, Heap Area, Stack Area, PC register, Native Method Stack์œผ๋กœ ๋‚˜๋‰œ๋‹ค.
์‚ฌ์ง„์—์„œ ๋ณด์ด๋“ฏ์ด Method Area, Heap Area ์˜์—ญ์€ ๋ชจ๋“  Thread๊ฐ€ ๊ณต์œ ํ•˜๊ณ 
Stack Area, PC register, Native Method Stack ์˜์—ญ์€ Thread ๋ณ„๋กœ ์ƒ์„ฑ๋œ๋‹ค.
์“ฐ๋ ˆ๋“œ(Thread)๋ž€?
๋ชจ๋“  Thread๊ฐ€ ๊ณต์œ ํ•˜๋Š” Method Area, Heap Area๋Š” Java Vertual Machine ์‹œ์ž‘ ์‹œ ์ƒ์„ฑ๋˜๊ณ , JVM์ด ์†Œ๋ฉธ๋  ๋–„ ์†Œ๋ฉธํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋‚˜๋จธ์ง€ ์˜์—ญ์€ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ƒ์„ฑ๋˜๊ณ , ์“ฐ๋ ˆ๋“œ ์ข…๋ฃŒ๋  ๋•Œ ์†Œ๋ฉธํ•œ๋‹ค.

2. Thread๋ณ„๋กœ ์ƒ์„ฑ๋˜๋Š” ์˜์—ญ

Native Method Stack

Java๋กœ ์ž‘์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉด์„œ, ์ˆœ์ˆ˜ํ•˜๊ฒŒ Java๋กœ ๊ตฌ์„ฑ๋œ ์ฝ”๋“œ๋งŒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์‹œ์Šคํ…œ์˜ ์ž์›์ด๋‚˜ API๊ฐ€ ์กด์žฌํ•œ๋‹ค.
์ด๋ ‡๊ฒŒ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ๋ฉ”์„œ๋“œ๋“ค์„ Native Method๋ผ๊ณ  ํ•œ๋‹ค.
Native Method Stacks๋Š” ์ด๋Ÿฐ Native Method๋ฅผ ๋‹ค๋ฃจ๋Š” ์˜์—ญ์„ ๋งํ•œ๋‹ค. โ€˜C Stacksโ€™๋ผ๊ณ ๋„ ๋ถˆ๋ฆฐ๋‹ค.

PC(Program Counter) Register

JVM์€ ํ•œ ๋ฒˆ์— ๋งŽ์€ Thread๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ , ๊ฐ Thread๋Š” ๊ฐ์ž์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
์ด ๋•Œ Thread๋ณ„๋กœ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋Š” ํ™˜๊ฒฝ์ด ๋ณด์žฅ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ PC Register๋Š” Thread์—์„œ ์‹คํ–‰ํ•  ๋‹ค์Œ ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•œ๋‹ค.

๋‹ค์Œ ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ์ด์œ  CPU๋Š” ์“ฐ๋ ˆ๋“œ ์‚ฌ์ด๋ฅผ ์ „ํ™˜ํ•˜๋ฉฐ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Context Switching์ด ์ผ์–ด๋‚˜๋Š” ์ˆœ๊ฐ„์— ์‹คํ–‰ํ•  ์œ„์น˜๋ฅผ ์•Œ์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๊ฒƒ์„ ์ด์šฉํ•ด ๋‹ค์ˆ˜์˜ ์“ฐ๋ ˆ๋“œ๋“ค์ด ๋ช…๋ น์˜ ํ๋ฆ„์„ ์žƒ์ง€ ์•Š๊ณ  ์‹คํ–‰๋œ๋‹ค.

Stack Area

JVM Stack์€ Thread์—์„œ ๋กœ์ปฌ ๋ณ€์ˆ˜, ๋ถ€๋ถ„ ๊ฒฐ๊ณผ, ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๋ฐ ๋ฐ˜ํ™˜์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

๊ฐ Thread๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค Frame์ด๋ผ๋Š” ๋‹จ์œ„๋กœ Stack Area์— ์ถ”๊ฐ€ํ•œ๋‹ค. ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜์–ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ํ•ด๋‹น Frame์€ Stack Area์—์„œ ์ œ๊ฑฐ๊ฐ€ ๋œ๋‹ค.

Frame์— ๋Œ€ํ•œ ์„ค๋ช…

Frame

ํ”„๋ ˆ์ž„์€ ๋ฐ์ดํ„ฐ ๋ฐ ๋ถ€๋ถ„ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅ, ๋™์  ์—ฐ๊ฒฐ, ๋ฉ”์„œ๋“œ ๊ฒฐ๊ณผ๊ฐ’ ๋ฐ˜ํ™˜, ์˜ˆ์™ธ ์ „๋‹ฌ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
ํ”„๋ ˆ์ž„์€ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์ด ์™„๋ฃŒ๋˜๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ์ •์ƒ์ด๋“  ๊ฐ‘์ž์Šค๋Ÿฌ์šด ์ข…๋ฃŒ(์˜ˆ์™ธ ๋ฐœ์ƒ)์ด๋“  ์ƒ๊ด€์—†์ด ์—†์–ด์ง„๋‹ค.

Frame์€ Local vaiable array, Operand Stack, Constant Pool Reference ์ด๋ ‡๊ฒŒ ์„ธ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋‰œ๋‹ค.
Local Variable : ๋ฉ”์„œ๋“œ ์•ˆ์˜ ์ง€์—ญ ๋ณ€์ˆ˜๋“ค์ด ์žˆ๋Š” ๊ณต๊ฐ„
Operand Stack : ๋ฉ”์„œ๋“œ ๋‚ด ์—ฐ์‚ฐ์„ ์œ„ํ•ด์„œ, ๋ฐ”์ดํŠธ ์ฝ”๋“œ ๋ช…๋ น๋ฌธ๋“ค์ด ๋“ค์–ด์žˆ๋Š” ๊ณต๊ฐ„
Constant Pool Reference : Constant Pool ์ฐธ์กฐ๋ฅผ ์œ„ํ•œ ๊ณต๊ฐ„

3. ๋ชจ๋“  Thread๊ฐ€ ๊ณต์œ ํ•˜๋Š” ์˜์—ญ

Method Area

Class/Interface์— ๋Œ€ํ•œ Metadata๐Ÿ’ฌ ๋ฐ์ดํ„ฐ์— ๊ด€ํ•œ ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ๋กœ, ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ์„ค๋ช…ํ•ด ์ฃผ๋Š” ๋ฐ์ดํ„ฐ ๋ฅผ ์ €์žฅํ•œ๋‹ค.

ํด๋ž˜์Šค ๋กœ๋”์— ์˜ํ•ด์„œ ๋กœ๋“œ๋œ Class์˜ ์ •๋ณด(Class์˜ Method, Field์ด๋ฆ„, Fieldํƒ€์ž…, Class ์ด๋ฆ„ ๋“ฑ)๊ฐ€ ์—ฌ๊ธฐ์— ์ €์žฅ๋œ๋‹ค.
๋˜ํ•œ, Runtime Constant Pool ๊ณผ static ๋ณ€์ˆ˜์™€ ๊ฐ™์€ ๊ฒƒ๋“ค๋„ ์ €์žฅ์ด ๋œ๋‹ค.
Method Area๋Š” Heap Area์˜ ์ผ๋ถ€์ผ ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ์ €์žฅํ•  ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์€ ์ „์ ์œผ๋กœ JVM ๊ตฌํ˜„์— ๋‹ฌ๋ ค ์žˆ๋‹ค.

PermGen, MetaSpace์— ๋Œ€ํ•œ ์„ค๋ช…

PermGen, MetaSpace

Java8 ๋ฒ„์ „ ์ด์ „์—์„œ๋Š” Method Area๋Š” PermGen(Permanent Generation Space)์— ํ• ๋‹น๋˜์—ˆ๋‹ค.
Java8 ๋ฒ„์ „ ์ดํ›„์—๋Š” PermGen์ด ์™„์ „ํžˆ ์ œ๊ฑฐ๋˜๊ณ  Method Area๋Š” MetaSpace์— ํ• ๋‹น๋œ๋‹ค.

PermGen์€ OS, JVM ๋ฒ„์ „๋งˆ๋‹ค ๊ฐ๊ธฐ ๋‹ค๋ฅธ default ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๊ณ , ๋Œ€๋ถ€๋ถ„ ์ž‘๊ฒŒ ํ• ๋‹น๋˜์–ด ์žˆ์—ˆ๋‹ค.
๊ทธ๋ž˜์„œ ํด๋ž˜์Šค ๋กœ๋”ฉ์„ ๋งŽ์ด ํ•˜๊ฒŒ ๋˜๋ฉด PermGen์ด ๋ถ€์กฑํ•ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.
MetaSpace๋Š” Class์˜ Metadata๋ฅผ Native ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ณ  ๋ถ€์กฑํ•  ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ๋Š˜๋ ค์ค€๋‹ค.

Heap Area

Heap Area์€ ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ฒด๋“ค์„ ์œ„ํ•œ ์˜์—ญ์œผ๋กœ new๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ ๊ฐ์ฒด, ๋ฐฐ์—ด, immutal ๊ฐ์ฒด ๋“ฑ์˜ ๊ฐ’์ด ์ €์žฅ๋œ๋‹ค.
ํ•ด๋‹น ์˜์—ญ์—์„œ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋“ค์€ JVM Stack Area์˜ ๋ณ€์ˆ˜๋‚˜ ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ํ•„๋“œ์—์„œ ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋”ฐ๋ผ์„œ, Heap ์—์„œ๋Š” ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ์ธ์Šคํ„ด์Šค์™€ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์ •๋ณด ๋˜ํ•œ ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— GC ์˜ ์ฃผ ๋Œ€์ƒ์ด ๋œ๋‹ค.

Hotspot JVM Heap์— ๋Œ€ํ•œ ์„ค๋ช…

Hotspot JVM

Hotspot JVM์€ ๋ฏธ๊ตญ์˜ Longview Technologies LLC๋ผ๋Š” ํšŒ์‚ฌ์—์„œ 1999๋…„์— ์ฒ˜์Œ ๋ฐœํ‘œ๋œ JVM์ด๋‹ค. ์ดํ›„ ์ด ํšŒ์‚ฌ๋Š” ๊ฐ™์€ ํ•ด SUN์— ์˜ํ•ด ์ธ์ˆ˜๋˜์–ด 1.3๋ฒ„์ „๋ถ€ํ„ฐ SUN์˜ ๊ธฐ๋ณธ์ ์ธ JVM์ด ๋˜์—ˆ๋‹ค. Hotspot JVM์€ ํ˜„์žฌ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ JVM ์ค‘์˜ ํ•˜๋‚˜๋กœ Windows, Linux, Solaris๋Š” ๋ฌผ๋ก  Mac OS์™€ ๊ธฐํƒ€ UJnix OS์—๋„ ํƒ‘์žฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. HP Unix์—์„œ๋„ Hotspot JVM์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๊ณ , ์‹ฌ์ง€์–ด Oracle์„ ์„ค์น˜ํ•  ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์น˜๋˜์–ด ๊ตฌ๋™๋˜๋Š” JVM ์กฐ์ฐจ Hotspot JVM์ด๋‹ค. ๋”ฐ๋ผ์„œย Sun, Oracle, HP, Windows, Linux, MacOS์—์„œ ์ œ๊ณตํ•˜๋Š” JVM์€ Hotspot JVM์œผ๋กœ ๋ช…๋ช…ํ•˜๊ณ  IBM์—์„œ ์ œ๊ณตํ•˜๋Š” JVM์€ IBM JVM์ด๋ผ ๋ถ€๋ฅด๊ธฐ๋„ย ํ•œ๋‹ค.

Hotspot JVM์˜ Heap ๊ตฌ์กฐ

Hotspot JVM์˜ Heap์€ ํฌ๊ฒŒ Young Generation๊ณผ Old Generation์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค.

Young Generation

Young Generation์€ ๋‹ค์‹œ Survivor ์˜์—ญ๊ณผ Eden ์˜์—ญ์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

Eden์˜์—ญ์€ Object๊ฐ€ Heap์— ์ตœ์ดˆ๋กœ ํ• ๋‹น๋˜๋Š” ์žฅ์†Œ์ด๋ฉฐ, Eden์˜์—ญ์ด ๊ฝ‰ ์ฐจ๊ฒŒ ๋˜๋ฉด Object์˜ ์ฐธ์กฐ ์—ฌ๋ถ€๋ฅผ ๋”ฐ์ ธ ์ฐธ์กฐ๊ฐ€ ๋˜์–ด์žˆ๋Š” Object๋ผ๋ฉด Survivor ์˜์—ญ์œผ๋กœ ๋„˜๊ธฐ๊ณ  ์ฐธ์กฐ๊ฐ€ ๋˜์–ด์žˆ์ง€ ์•Š์€ Garbage Object๋ผ๋ฉด ๊ทธ๋ƒฅ ๋‚จ๊ฒจ ๋†“๋Š”๋‹ค.
์ฐธ์กฐ๋˜์–ด์žˆ๋Š” ๋ชจ๋“  Object๊ฐ€ Survivor์˜์—ญ์œผ๋กœ ๋„˜์–ด๊ฐ€๋ฉด Eden์˜์—ญ์„ ๋ชจ๋‘ ์ฒญ์†Œํ•œ๋‹ค.
Young Generation์—์„œ GC๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ Minor GC๋ผ๊ณ  ํ•œ๋‹ค.

Survivor ์˜์—ญ์€ Eden ์˜์—ญ์—์„œ ๋„˜์–ด์˜จ Object๋“ค์ด ๋จธ๋ฌด๋ฅด๋Š” ์žฅ์†Œ์ด๋‹ค.
Survivor ์˜์—ญ์€ ๋‘ ๊ฐœ์˜ ์˜์—ญ(Survivor1, Survivor2)์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.
Survivor ์˜์—ญ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฝ‰ ์ฐจ๊ฒŒ ๋˜๋ฉดMinor GC๊ฐ€ ์ž‘๋™ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Survivor1์ด ๊ฐ€๋“์ฐจ์„œ GC๊ฐ€ ์ž‘๋™ํ•˜๋ฉด Survivor2๋กœ ์ด๋™ํ•˜๊ฒŒ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ์‚ด์•„๋‚จ์•„ ๋‹ค๋ฅธ Survivor ์˜์—ญ์œผ๋กœ๊ฐ€๋ฉด Object๋“ค์˜ Age๊ฐ€ ์˜ฌ๋ผ๊ฐ„๋‹ค.
(๋”ฐ๋ผ์„œ Survovir์˜ ์˜์—ญ์ค‘ ํ•œ ๊ณณ์€ ๋ฐ˜๋“œ์‹œ ๋น„์–ด์žˆ๋Š” ์ƒํƒœ์ด๋‹ค.)

์•„๋ž˜์˜ ๊ทธ๋ฆผ์œผ๋กœ ์„ค๋ช…์„ ํ™•์ธํ•ด๋ณด์ž.

Old Generation

Young Generation์—์„œ ์˜ค๋ž˜ ์‚ด์•„๋‚จ์•„ ์ผ์ • Age์ด์ƒ์ด ๋œ Object๋Š” Promotion์ด ๋ฐœ์ƒํ•ด Old Generation ์˜์—ญ์œผ๋กœ ์ด๋™ํ•œ๋‹ค.
Old Generation ์˜์—ญ์ด ์ฑ„์›Œ์ง€๋‹ค๊ฐ€ ๊ฐ€๋“์ฐจ๊ฒŒ ๋˜๋ฉด Young Generation ์—์„œ ์ฒ˜๋Ÿผ GC๊ฐ€ ๋™์ž‘ํ•˜๋Š”๋ฐ ์—ฌ๊ธฐ์„œ ๋™์ž‘ํ•˜๋Š” GC๋Š” Major GC๋ผ๊ณ  ํ•œ๋‹ค.

GC์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ

์ฐธ๊ณ ํ•œ ๋‚ด์šฉ์˜ ์ถœ์ฒ˜