Skip to content

Latest commit

ย 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
ย 
ย 
ย 
ย 

README.md

JVM: Runtime Data Area

Tistory ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ… ๋ฐ”๋กœ๊ฐ€๊ธฐ

Java Virtual Machine(JVM) ๊ตฌ์กฐ๋Š” ํฌ๊ฒŒ Class Loader, Runtime Data Area, Execution ์ด๋ ‡๊ฒŒ ์„ธ ๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ธ Runtime Data Area์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

Runtime Data Area

Runtime Data Area๋ž€, JVM์ด ํ”„๋กœ๊ทธ๋žจ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด OS๋กœ๋ถ€ํ„ฐ ํ• ๋‹น๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ž…๋‹ˆ๋‹ค.

์ด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์€ 5๊ฐ€์ง€ ์˜์—ญ์œผ๋กœ ์ชผ๊ฐœ์–ด์ ธ ์žˆ์œผ๋ฉฐ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๋กœ ๋ถ„๋ฅ˜๋ฉ๋‹ˆ๋‹ค.

JVM ์‹œ์ž‘์‹œ ์ƒ์„ฑ๋˜๋ฉฐ JVM ์ข…๋ฃŒ ์‹œ ์†Œ๋ฉธ๋˜๋Š” ์˜์—ญ๋“ค๋กœ๋Š” Method Area์™€ Heap์ด ์žˆ์œผ๋ฉฐ, ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ ๊ฐ„ ์ž์›์ด ๊ณต์œ ๋ฉ๋‹ˆ๋‹ค.

๊ฐ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ƒ์„ฑ๋˜๊ณ  ํ•ด๋‹น ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ์†Œ๋ฉธ๋˜๋Š” ์˜์—ญ๋“ค์—๋Š” Stack, PC Register, Native Method Stack์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ ์ถœ์ฒ˜: https://dzone.com/articles/jvm-run-time-data-areas

1. Method Area

Method Area๋Š” JVM ๋ฒค๋”๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Oracle Hotspot JVM์˜ Method Area๋Š” JDK 7๊นŒ์ง€๋Š” Permanent Generation(PermGen)์ด๋ผ๊ณ  ๋ถˆ๋ €๊ณ , JDK 8 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” Metaspace๋กœ ์™„์ „ํžˆ ๋Œ€์ฒด๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

PermGen๊ณผ Metaspace์˜ ์ฐจ์ด๋Š” ์•„๋ž˜์—์„œ ์‚ดํŽด๋ณด๊ณ  ์šฐ์„  PermGen์ด ๋ฌด์—‡์„ ํ•˜๋Š” ๊ณต๊ฐ„์ธ์ง€์— ๋Œ€ํ•ด ๋จผ์ € ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

PermGen์€ Runtime Constant Pool(๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜ ํ’€), ํ•„๋“œ ๋ฐ ๋ฉ”์„œ๋“œ ๋ฐ์ดํ„ฐ์™€ ๊ฐ™์€ ๋ชจ๋“  ํด๋ž˜์Šค ๋ ˆ๋ฒจ ๋ฐ์ดํ„ฐ์™€ ๋ฉ”์„œ๋“œ ๋ฐ ์ƒ์„ฑ์ž์˜ ์ฝ”๋“œ๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.

์ „์—ญ ๋ณ€์ˆ˜๋‚˜ static ๋ณ€์ˆ˜๋“ค ๋˜ํ•œ ์ด ์˜์—ญ์— ์ €์žฅ๋˜๋ฉฐ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ ๋‚จ์•„์žˆ๊ฒŒ ๋˜๊ณ , ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์–ด๋””์„œ๋“  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๊ณ  ๋ชจ๋“  static ๋ณ€์ˆ˜๊ฐ€ PermGen์— ์ €์žฅ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ•ด๋‹น static ๋ณ€์ˆ˜๊ฐ€ ์–ด๋–ค object์— ๋Œ€ํ•œ ๋ ˆํผ๋Ÿฐ์Šค๋ผ๋ฉด ์ฐธ์กฐ ๋Œ€์ƒ์ด ๋˜๋Š” object๋Š” ๋‹ค๋ฅธ object๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ heap ์˜์—ญ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

(Heap ์˜์—ญ์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

public class Dog {

    private String name;
    private int age;

    public Dog(String name, int age) {

        this.name = name;
        this.age = age;
    }
}

์œ„์™€ ๊ฐ™์€ ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด, name ๊ณผ age ๊ฐ™์€ ํ•„๋“œ ๋ฐ์ดํ„ฐ์™€ ์ƒ์„ฑ์ž ์ •๋ณด๊ฐ€ ๋ฐ”๋กœ ์ด Method Area(PermGen)์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

์œ„์—์„œ ์„ค๋ช…ํ–ˆ๋“ฏ์ด Method Area๋Š” JVM ์‹œ์ž‘ ์‹œ ์ƒ์„ฑ๋˜๋ฉฐ JVM ์ข…๋ฃŒ ์‹œ ์†Œ๋ฉธ๋˜๊ณ  ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ ๊ฐ„ ์ž์›์ด ๊ณต์œ ๋˜๋ฉฐ, JVM ๋‹น Method Area๋Š” ํ•˜๋‚˜๋งŒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ Method Area์— ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ณต๊ฐ„ ํ• ๋‹น์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด OutOfMemoryError๊ฐ€ throw ๋ฉ๋‹ˆ๋‹ค.

1-1. Runtime Constant Pool

๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜ ํ’€์—๋Š” ํด๋ž˜์Šค/์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์†Œ๋“œ, ํ•„๋“œ, ๋ฌธ์ž์—ด ์ƒ์ˆ˜ ๋“ฑ์˜ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ์ €์žฅ๋˜๋ฉฐ, ์ด๋“ค์˜ ๋ฌผ๋ฆฌ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜๋ฅผ ์ฐธ์กฐํ•  ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

JVM์€ ์ด ์ƒ์ˆ˜ํ’€์— ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค๋“ค๊ณผ ์—ฐ๊ฒฐ์‹œ์ผœ์ค๋‹ˆ๋‹ค.

1-2. PermGen(JDK 7) -> Metaspace (JDK 8)

JDK 7 ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ (PermGen)

์ด๋ฏธ์ง€ ์ถœ์ฒ˜: https://docs.deistercloud.com/content/Axional%20development%20libraries.20/Studio%20J2EE%20Server.4/Tunning.xml?embedded=true

JDK 8 ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ (Metaspace)

์ด๋ฏธ์ง€ ์ถœ์ฒ˜: https://docs.deistercloud.com/content/Axional%20development%20libraries.20/Studio%20J2EE%20Server.4/Tunning.xml?embedded=true

์ด PermGen ์˜์—ญ์ด JDK 8๋ถ€ํ„ฐ๋Š” Metaspace์˜ ์™„์ „ํžˆ ๋Œ€์ฒด๋˜์—ˆ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, ์™œ ์ด๋Ÿฐ ๋ณ€ํ™”๊ฐ€ ์žˆ์—ˆ์„๊นŒ์š”?

๊ธฐ์กด PermGen ์˜์—ญ์€ ํฌ๊ธฐ๊ฐ€ ์ œํ•œ์ ์ด๋ผ OutOfMemoryError๋ฅผ ์œ ๋ฐœํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํฌ๊ธฐ๊ฐ€ ์ž‘๊ธฐ ๋•Œ๋ฌธ์— JVM์€ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(GC)์„ ์ˆ˜์‹œ๋กœ ์ˆ˜ํ–‰ํ•ด ํ•„์š”ํ•œ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•ด์•ผ ํ–ˆ๊ณ , class loader๋“ค์ด ์ œ๋Œ€๋กœ GC๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๋กœ ์ธํ•ด memory leak์ด ๋ฐœ์ƒํ•˜๊ณค ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  ์ด PermGen ์˜์—ญ์˜ ๊ณต๊ฐ„์„ ํ•„์š”์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ํŠœ๋‹์ด ์–ด๋ ค์šด ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋˜ ๊ฒƒ์ด์ฃ .

์ด๋Ÿฐ ๋ฌธ์ œ๋กœ ์ธํ•ด, PermGen์€ JDK 8 ๋ฒ„์ „๋ถ€ํ„ฐ ์™„์ „ํžˆ Metaspace๋ผ๋Š” ์˜์—ญ์œผ๋กœ ๋Œ€์ฒด๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด PermGen๊ณผ Metaspace์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

Metaspace๋Š” ๊ธฐ์กด Java Heap ๋ฉ”๋ชจ๋ฆฌ ์˜†์— ๋ถ™์–ด์žˆ์ง€ ์•Š๊ณ , OS์—์„œ ์ œ๊ณตํ•˜๋Š” native ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ํ•„์š”์‹œ ์ž๋™์œผ๋กœ ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์œผ๋กœ ์ธํ•ด ํด๋ž˜์Šค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์‚ฌ์šฉ๋Ÿ‰์ด ๋ฉ”ํƒ€์ŠคํŽ˜์ด์Šค์˜ ์ตœ๋Œ€ ํฌ๊ธฐ์— ๋„๋‹ฌํ•  ๋•Œ ์ž๋™์œผ๋กœ GC๊ฐ€ ๋Œ๊ฒŒ ๋˜๋ฉด์„œ JVM์€ OutOfMemoryError์˜ ๋ฐœ์ƒํ™•๋ฅ ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. Heap

Heap ์˜์—ญ์€ Object ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋“ค(ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋“ค)๊ณผ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค์˜ ๋ณ€์ˆ˜๋“ค์„ ๋‹ด๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.

Dog bubbles = new Dog("Bubbles", 7);

์œ„ ์ฝ”๋“œ์—์„œ new ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด Dog ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , ์ƒ์„ฑ๋œ Dog ์ธ์Šคํ„ด์Šค๋Š” heap ์˜์—ญ์— ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.

Heap ์˜์—ญ์€ Garbage Collection์ด๋ผ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ์ž๋™์œผ๋กœ ์ €์žฅ๊ณต๊ฐ„์ด ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

Heap ์˜์—ญ์€ ํฌ๊ฒŒ Young Generation๊ณผ Old Generation์œผ๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ ์ถœ์ฒ˜: https://medium.com/platform-engineer/understanding-java-memory-model-1d0863f6d973

2-1. Heap: Young Generation

Young Gen์€ Eden ์˜์—ญ๊ณผ Survivor Memory Spaces๋ผ ๋ถˆ๋ฆฌ๋Š” S0, S1 ์˜์—ญ์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋Š” ํ•ญ์ƒ Eden ์˜์—ญ์— ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

GC ์‹ธ์ดํด์„ ๊ฑฐ์น˜๋ฉด์„œ (Young Gen์—์„œ๋Š” Minor GC) ๋” ์ด์ƒ ๋ ˆํผ๋Ÿฐ์Šค ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ์ •๋ฆฌํ•จ๊ณผ ๋™์‹œ์— ์ง€์†์ ์œผ๋กœ ์ฐธ์กฐ๋˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ S0, S1 ์˜์—ญ์„ ํ™œ์šฉํ•˜์—ฌ ๋ชจ์•„๋‘ก๋‹ˆ๋‹ค.

2-2. Heap: Old Generation

์—ฌ๋Ÿฌ ๋ฒˆ์˜ Minor GC ์‹ธ์ดํด์„ (threshold๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ) ๊ฑฐ์นœ ๋’ค์—๋„ ์˜ค๋žซ๋™์•ˆ ์‚ด์•„๋‚จ๋Š” ๊ฐ์ฒด๋“ค์€ Old Generation ์˜์—ญ์œผ๋กœ ์˜ฎ๊ฒจ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Old Gen ์˜์—ญ๋„ ๊ฐ€๋“ ์ฐจ๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ Major GC์— ์˜ํ•ด ๊ณต๊ฐ„์ด ์ •๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ Heap ์˜์—ญ์˜ ๊ตฌ์กฐ๋ฅผ ์„ค๋ช…ํ•˜์ง€๋งŒ, ์‹ค์ œ๋กœ Heap ์˜์—ญ์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ์žˆ์–ด์•ผ GC ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ •๋ง ์ค‘์š”ํ•˜๊ณ  ๋‚ด์šฉ์ด ๋ฐฉ๋Œ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— GC๋ฅผ ์ฃผ์ œ๋กœ ๋”ฐ๋กœ ํฌ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

Heap ์˜์—ญ ๋˜ํ•œ JVM ์‹œ์ž‘ ์‹œ ์ƒ์„ฑ๋˜๋ฉฐ JVM ์ข…๋ฃŒ ์‹œ ์†Œ๋ฉธ๋˜์–ด JVM ๋‹น Heap ์˜์—ญ์€ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜๊ณ , ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ ๊ฐ„ ์ž์›์ด ๊ณต์œ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋™๊ธฐํ™” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. Stack

Stack์€ ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ ์ƒˆ๋กœ์šด ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ์ƒ์„ฑ๋˜๋Š” ์˜์—ญ์ž…๋‹ˆ๋‹ค.

์Šคํƒ ์˜์—ญ์€ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ ์‹คํ–‰ํ•˜๋Š” ๋ฉ”์†Œ๋“œ ๋ณ„๋กœ ํ•ด๋‹น ์Šค์ฝ”ํ”„ ๋‚ด ํ• ๋‹น๋œ ๋กœ์ปฌ ๋ณ€์ˆ˜ ๋ฐ ๊ธฐ๋ณธํ˜• ํƒ€์ž…(Primitive type) ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋‹ด๊ณ , heap ์˜์—ญ์— ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋‹ด์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ ์ถœ์ฒ˜: baeldung.com

ํ•ด๋‹น ๊ฐ’๋“ค์„ Stack Frame์ด๋ผ๋Š” ๋ธ”๋ก์— ๋‹ด๊ฒŒ ๋˜๊ณ , ์ƒˆ๋กœ์šด ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ์ด์ „์— ์กด์žฌํ•˜๋˜ Stack Frame ์œ„์— ์ƒˆ๋กœ์šด Stack Frame์ด ์Œ“์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

JVM Stack์€ ์šฐ๋ฆฌ๊ฐ€ ์ตํžˆ ์•Œ๊ณ  ์žˆ๋Š” Last-In-First-Out(LIFO)๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ธ Stack๊ณผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

JavaScript์˜ Call Stack(ํ˜ธ์ถœ ์Šคํƒ)์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰์„ ๋งˆ์น˜๊ฒŒ๋˜๋ฉด ํ•ด๋‹นํ•˜๋Š” stack frame์€ ์‚ฌ๋ผ์ง€๊ณ  ๊ฐ€์žฅ ์ตœ๊ทผ ์ถ”๊ฐ€๋˜์—ˆ๋˜ stack frame์— ํ•ด๋‹นํ•˜๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์ด์–ด์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

Stack ์˜์—ญ ๋‚ด์— ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ํ•ด๋‹น stack frame ์ด ์กด์žฌํ•˜๋Š” ํ•œ ์‚ด์•„์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ stack ์˜์—ญ์ด ๊ฐ€๋“ ์ฐจ๊ฒŒ ๋œ๋‹ค๋ฉด Java๋Š” java.lang.StackOverFlowError๋ฅผ throw ํ•ฉ๋‹ˆ๋‹ค.

ํ˜น์‹œ Stack Overflow์— ๋Œ€ํ•ด ์ž˜ ๋ชจ๋ฅผ๊นŒ ๋ด ์„ค๋ช…์„ ๋ง๋ถ™์ด์ž๋ฉด,
์—˜๋ ˆ๋ฒ ์ดํ„ฐ์—์„œ ์–‘์ชฝ์— ๊ฑฐ์šธ์ด ์žˆ์–ด์„œ ๋‚ด ๋ชจ์Šต์ด ์—ฌ๋Ÿฌ ๊ฒน์œผ๋กœ ๋์—†์ด ๋ฐ˜์‚ฌ๋˜๋Š” ๊ฒƒ์„ ๋ณธ ์ ์ด ์žˆ์„ ํ…๋ฐ ์ด๋Ÿฐ ํ˜„์ƒ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.
ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ์˜ ์˜ˆ์‹œ๋กœ๋Š”, ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์ข…๋ฃŒ๋˜๋Š” ์‹œ์ ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋‘์ง€ ์•Š์•„ ํŠน์ • ๋ฉ”์†Œ๋“œ์˜ body์—์„œ ๋ณธ์ธ์„ ํ˜ธ์ถœํ•˜๊ณ , ํ˜ธ์ถœ๋œ ๋ณธ์ธ์˜ body์—์„œ ๋˜ ๋ณธ์ธ์„ ํ˜ธ์ถœํ•ด์„œ Stack Frame์ด ๋์—†์ด ์Œ“์ด๊ฒŒ ๋˜๋Š” ํ˜„์ƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

Stack ์˜์—ญ์€ ์“ฐ๋ ˆ๋“œ ๋ณ„๋กœ ๋”ฐ๋กœ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋™์‹œ์— ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ด๊ฑธ threadsafe ํ•˜๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

4. PC Register

Java SE8 Specification์— ์˜ํ•˜๋ฉด, JVM์€ ํ•œ ๋ฒˆ์— ๋งŽ์€ ์“ฐ๋ ˆ๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์‹คํ–‰๋˜๋Š” ๊ฐ ์“ฐ๋ ˆ๋“œ ๋ณ„๋กœ Program Counter ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Program Counter Register๋ž€, ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์‹คํ–‰๋  ๋‹ค์Œ ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง„ ํ”„๋กœ์„ธ์„œ์˜ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰๋˜๋Š” ๊ฐ ๋ช…๋ น๋งˆ๋‹ค ๋‹ค์Œ ์ˆœ์„œ๋กœ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ๋ฅผ ํŠธ๋ž™ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

JVM์˜ PC Register๋Š” JVM ์“ฐ๋ ˆ๋“œ๊ฐ€ ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ๋ฉ”์†Œ๋“œ์˜ ๋ช…๋ น์„ ๋‹ด๊ณ  ์žˆ๋Š” ์ฃผ์†Œ๋ฅผ ํฌํ•จํ•˜๊ฒŒ ๋˜๊ณ , ์‹คํ–‰์ค‘์ธ JVM ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ผ์ข…์˜ ๊ด€๋ฆฌ์ž๋ผ๊ณ  ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. Native Method Stack

Native Method๋Š” Java๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. C, C++ ๋˜๋Š” ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Native Method Stack์€ JVM Stack ์˜์—ญ๊ณผ ๋น„์Šทํ•˜๊ฒŒ LIFO๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋ฉฐ, Java ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹Œ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ๋“ค์˜ ํ˜ธ์ถœ ์ˆœ์„œ๋ฅผ ๋‹ด์•„ ๊ด€๋ฆฌํ•˜๋Š” stack์ž…๋‹ˆ๋‹ค.


References