[JAVA/๋ฒˆ์—ญ] Static ๋ฉค๋ฒ„๋ฅผ ์œ„ํ•œ JVM ์Šคํ† ๋ฆฌ์ง€

์›๋ฌธ : https://www.baeldung.com/jvm-static-storage
์˜ค์—ญ์ด๋‚˜ ์˜์—ญ์ด ๋งŽ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ ์šฉ์œผ๋กœ๋งŒ ์ฝ์–ด์ฃผ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

 

JVM ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ ๋„์‹

1. ๊ฐœ์š”

์šฐ๋ฆฌ๋Š” ์ข…์ข… JVM์˜ ๋‚ด๋ถ€ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ๊ฐ„๊ณผํ•˜๋ฉฐ ์ž‘์—…ํ•˜๊ณ ๋Š” ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์„ฑ๋Šฅ๊ณผ ์ฝ”๋“œ ํ’ˆ์งˆ ํ–ฅ์ƒ์„ ์œ„ํ•ด์„œ๋Š” JVM ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ธฐ๋ณธ์ ์ธ ์‚ฌํ•ญ์„ ๊ณต๋ถ€ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์ด๋ฒˆ ๊ธฐ์‚ฌ์—์„œ๋Š”, ์šฐ๋ฆฌ๋Š” JVM ์ €์žฅ๊ณต๊ฐ„๊ณผ static ํ•„๋“œ ๊ด€ํ•ด ๊ณต๋ถ€ํ•ด ๋ณผ ์˜ˆ์ •์ด๋‹ค.

2. JVM์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ๋ถ„

์šฐ์„  JVM์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ƒ๊ธฐ์‹œ์ผœ๋ณด๋„๋ก ํ•˜์ž.

2.1 Heap ๋ฉ”๋ชจ๋ฆฌ

ํž™ ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋Ÿฐํƒ€์ž„ ์ €์žฅ ๊ณต๊ฐ„์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  JVM ์Šค๋ ˆ๋“œ๋Š” ํž™ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜๋ฉฐ, ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์™€ ๋ฐฐ์—ด๋“ฑ์ด ์ƒ์„ฑ๋˜๋ฉด ์ด ๊ณณ์— ์ €์žฅ๋œ๋‹ค. ์ž๋ฐ”์—์„œ๋Š” ํž™ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‘ ๊ฐ€์ง€ ๊ณต๊ฐ„์œผ๋กœ ๋ถ„๋ฅ˜ํ•˜๋Š”๋ฐ, ์ Š์€ ๊ฐ์ฒด ๊ณต๊ฐ„ (young generation) ๊ณผ ๋Š™์€ ๊ฐ์ฒด ๊ณต๊ฐ„ (old generation) ์ด๋‹ค. ๋˜ํ•œ ์ Š์€ ๊ฐ์ฒด ๊ณต๊ฐ„์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์—๋ด(Eden)๊ณผ ์ƒ์กด์ž ๊ณต๊ฐ„(Survivor space) ์œผ๋กœ ๋ถ„๋ฆฌ๋œ๋‹ค. (์ƒ์กด์ž ๊ณต๊ฐ„์€ From ์˜์—ญ๊ณผ To ์˜์—ญ์œผ๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.) ๋Š™์€ ๊ฐ์ฒด ๊ณต๊ฐ„์€ ๊ต์ˆ˜ ๊ฐ์ฒด ๊ณต๊ฐ„(Tenured) ์œผ๋กœ ๋ถˆ๋ฆฌ๊ธฐ๋„ ํ•œ๋‹ค. ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด์€ ๊ฐ€๋น„์ง€ ์ฝœ๋ ‰ํ„ฐ(GC)๋ผ๊ณ  ์•Œ๋ ค์ง„ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์— ์˜ํ•ด ์ž๋™์œผ๋กœ ๊ด€๋ฆฌ๋œ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ฐ€๋น„์ง€ ์ฝœ๋ ‰ํ„ฐ๋Š” ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ํ•ด์ œํ•˜๊ฑฐ๋‚˜, ํž™ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด์˜ ์—ฌ๋Ÿฌ ์˜์—ญ์œผ๋กœ ์ด๋™์‹œํ‚ค๋ฉด์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

2.2 Non-Heap ๋ฉ”๋ชจ๋ฆฌ

๋…ผ-ํž™ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ฃผ๋กœ ํด๋ž˜์Šค ๊ตฌ์กฐ, ํ•„๋“œ, ๋ฉ”์„œ๋“œ ๋ฐ์ดํ„ฐ, ๊ทธ๋ฆฌ๊ณ  ๋ฉ”์„œ๋“œ์˜ ์ฝ”๋“œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฉ”์„œ๋“œ ์˜์—ญ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. ํž™ ๋ฉ”๋ชจ๋ฆฌ์™€ ๋น„์Šทํ•˜๊ฒŒ ๋ชจ๋“  JVM ์Šค๋ ˆ๋“œ๋Š” ๋ฉ”์„œ๋“œ ์˜์—ญ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. Permanent Generation (PermGem) ์ด๋ผ๊ณ ๋„ ์•Œ๋ ค์ง„ ๋ฉ”์†Œ๋“œ ์˜์—ญ์€ ๋…ผ๋ฆฌ์ ์œผ๋กœ ํž™ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ผ๋ถ€๋กœ ์ทจ๊ธ‰๋˜์ง€๋งŒ ๊ฐ€๋น„์ง€ ์ฝœ๋ ‰ํŒ…์˜ ๋Œ€์ƒ์ด ๋˜์ง€ ์•Š์„์ˆ˜๋„ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ Java 8 ์—์„œ๋ถ€ํ„ฐ PermGem ์˜์—ญ์€ ์ œ๊ฑฐ๋˜๊ณ  MetaSpace ๋ผ๊ณ  ํ•˜๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋ณธ ๋ฉ”๋ชจ๋ฆฌ์˜์—ญ์ด ๋„์ž…๋˜์—ˆ๋‹ค.

2.3 Cache ๋ฉ”๋ชจ๋ฆฌ

JVM ์€ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ์˜ ์ปดํŒŒ์ผ ๋ฐ ์ €์žฅ์„ ์œ„ํ•ด ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์˜ˆ์•ฝํ•œ๋‹ค.

3. Java 8 ์ด์ „์˜ Static ๋ฉค๋ฒ„ ์ €์žฅ๊ณต๊ฐ„

Java 8 ์ด์ „์—๋Š” PermGem ์˜์—ญ์— Static ๋ฉ”์„œ๋“œ์™€ ๋ณ€์ˆ˜๋“ค์ด ์ €์žฅ๋˜์—ˆ๋‹ค. ๋˜ํ•œ Intern ๋œ ๋ฌธ์ž์—ด๋„ ์ด๊ณณ์— ์ €์žฅ๋˜์—ˆ๋‹ค.

4. Java 8 ์ดํ›„์˜ Static ์ €์žฅ ๊ณต๊ฐ„

์•ž์„œ ๋‹ค๋ฃจ์—ˆ๋“ฏ์ด, PermGem ์˜์—ญ์€ Metaspace ์˜์—ญ์œผ๋กœ ๋Œ€์ฒด ๋˜์—ˆ๊ณ  static ๋ฉค๋ฒ„์˜ ์ €์žฅ ๊ณต๊ฐ„ ๋˜ํ•œ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค. Java 8 ์ดํ›„๋กœ Metaspace ์˜์—ญ์€ ์˜ค๋กœ์ง€ ํด๋ž˜์Šค์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋งŒ ์ €์žฅํ•˜๊ณ , static ๋ฉค๋ฒ„๋Š” Heap ์—์„œ ์ €์žฅํ•˜๊ณ  ์œ ์ง€ํ•˜๋„๋ก ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค. (intern ๋œ ๋ฌธ์ž์—ด๋„ ๋งˆ์ฐฌ๊ฐ€์ง€)

5. ๊ฒฐ๋ก 

์งง์€ ๊ธฐ์‚ฌ๋ฅผ ํ†ตํ•ด static ๋ฉค๋ฒ„๋ฅผ ์œ„ํ•œ JVM์˜ ์ €์žฅ๊ณต๊ฐ„๋“ค์„ ์‚ดํŽด๋ณด์•˜๋‹ค. ์š”์•ฝํ•˜์ž๋ฉด Java 8 ์ด์ „์—๋Š” static ๋ฉค๋ฒ„๋“ค์€ PermGem (Non-Heap ์˜์—ญ) ์— ์ €์žฅ๋˜์—ˆ๋‹ค. ํ•˜์ง€๋งŒ Java 8 ์ดํ›„๋กœ๋Š” ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๋„๋ก ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค.