๋ณธ๊ฒฉ JVM ํ•ด๋ถ€ํ•˜๊ธฐ
Computer Science/Java

๋ณธ๊ฒฉ JVM ํ•ด๋ถ€ํ•˜๊ธฐ

๐Ÿค“ ์ƒˆ๋กœ์šด ์ •๋ณด๋ฅผ ์ฐพ์œผ๋ฉด ๊ณ„์† ์—…๋ฐ์ดํŠธ ๋  ๊ธ€์ž…๋‹ˆ๋‹ค!

  • ์ž๋ฐ”์˜ ์‹คํ–‰ ๊ณผ์ •
    • ์ž๋ฐ”๋Š” JVM์ด OS๋กœ๋ถ€ํ„ฐ ์ด ํ”„๋กœ๊ทธ๋žจ์ด ํ•„์š”๋กœ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น๋ฐ›๋Š”๋‹ค.
    • ์ž๋ฐ” ํŒŒ์ผ์ด ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์ž๋ฐ” ๋ฐ”์ดํŠธ ์ฝ”๋“œ(.class)๋กœ ๋ณ€ํ™˜๋œ๋‹ค.
    • ํด๋ž˜์Šค ๋กœ๋”๋ฅผ ํ†ตํ•ด ์ž๋ฐ” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ JVM์œผ๋กœ ๋กœ๋”ฉํ•œ๋‹ค.
    • ํ•ด์„๋œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋Š” ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ์— ๋ฐฐ์น˜๋œ๋‹ค.
    • ์‹คํ–‰ ์—”์ง„์„ ํ†ตํ•ด ์‹คํ–‰๋œ๋‹ค.
    • JVM์€ ํ•„์š”์— ๋”ฐ๋ผ GC์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

JVM์˜ ๊ตฌ์กฐ

ํด๋ž˜์Šค ๋กœ๋”

์ž๋ฐ”๋Š” ๋™์  ๋กœ๋“œ, ์ฆ‰ ๋Ÿฐํƒ€์ž„์— ํด๋ž˜์Šค๋ฅผ ๋กœ๋“œํ•˜๊ณ  ๋งํฌํ•˜๋Š” ํŠน์ง•์ด ์žˆ๋‹ค. ์ด ๋™์  ๋กœ๋“œ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์ด JVM์˜ ํด๋ž˜์Šค๋กœ๋”์ด๋‹ค.

  • ๋กœ๋“œ
    • ์šฐ์„  ํด๋ž˜์Šค ๋กœ๋”๋Š” .class ํŒŒ์ผ์„ ์ฝ๊ณ , ๊ทธ ๋‚ด์šฉ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค๊ณ , ๋ฉ”์†Œ๋“œ ์˜์—ญ์— ์ €์žฅํ•˜๋Š” ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ๋งํฌ
    • ๊ฒ€์ฆ: ์ฝ์–ด๋“ค์ธ ํด๋ž˜์Šค๊ฐ€ ์ž๋ฐ” ์–ธ์–ด,JVM ๋ช…์„ธ์— ๋ช…์‹œ๋œ ๋Œ€๋กœ ์ž˜ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค.
    • ์ค€๋น„: ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ , ํด๋ž˜์Šค์—์„œ ์ •์˜๋œ ํ•„๋“œ, ๋ฉ”์†Œ๋“œ, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ค€๋น„ํ•œ๋‹ค.
    • ๋ถ„์„: ์‹ฌ๋ณผ๋ฆญ ๋ฉ”๋ชจ๋ฆฌ ๋ ˆํผ๋Ÿฐ์Šค(์ฐธ์กฐํ•˜๋Š” ๋Œ€์ƒ์˜ ์ด๋ฆ„๋งŒ์„ ๊ฐ–๊ณ  ์žˆ์Œ)๋ฅผ ๋ฉ”์†Œ๋“œ ์˜์—ญ์— ์žˆ๋Š” ์‹ค์ œ ๋ ˆํผ๋Ÿฐ์Šค๋กœ ๊ต์ฒดํ•œ๋‹ค. ์ฆ‰, ๊ทธ ์ด๋ฆ„์— ๋งž๋Š” ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ์ฐพ์•„์„œ ์—ฐ๊ฒฐํ•˜๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ•œ๋‹ค.
  • ์ดˆ๊ธฐํ™”
    • ํด๋ž˜์Šค ๋ณ€์ˆ˜๋“ค์„ ์„ค์ •๋œ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. (static ๋ณ€์ˆ˜)
    • ํด๋ž˜์Šค๊ฐ€ ๋กœ๋”ฉ๋  ๋•Œ static ๋ณ€์ˆ˜๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , ๋ฉ”๋ชจ๋ฆฌ์— ๋”ฑ ํ•œ๋ฒˆ๋งŒ ์˜ฌ๋ผ๊ฐ„๋‹ค. public์„ ๋ถ™์ด๋ฉด ๊ฐ™์€ ํ”„๋กœ๊ทธ๋žจ ์–ด๋””์„œ๋“  ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•œ๋งˆ๋””๋กœ ์š”์•ฝํ•˜๋ฉด ํด๋ž˜์Šค ๋กœ๋”๋Š” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ๋ฉ”์†Œ๋“œ ์˜์—ญ์— ์ €์žฅํ•˜๊ณ , ํด๋ž˜์Šค๋ฅผ ๊ฒ€์ฆํ•˜๊ณ , ํด๋ž˜์Šค๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ ,๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์ž‘์—…์„ ํ•œ ํ›„, ํด๋ž˜์Šค ๋ณ€์ˆ˜ ๋“ค์„ ์ ์ ˆํ•œ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

 

์‹คํ–‰ ์—”์ง„

  • ์ธํ„ฐํ”„๋ฆฌํ„ฐ
    • ์ž๋ฐ”๋Š” ํ”Œ๋žซํผ ๋…๋ฆฝ์ ์ด๊ณ , ์ด์‹์„ฑ์ด ๋†’๋‹ค.
    • ๊ฐ ํ”Œ๋žซํผ์— ๋งž๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค OS์—์„œ๋“ ์ง€ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.
    • ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋Š” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ํ•œ ์ค„์”ฉ ์ฝ๊ณ , ์šด์˜์ฒด์ œ๊ฐ€ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋Š” ๋ฐ˜๋ณต ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๋งค๋ฒˆ ์ธํ„ฐํ”„๋ฆฌํŒ… ํ•ด์•ผ ํ•ด์„œ ๋น„ํšจ์œจ์ ์ด๋‹ค.
    • ์ž๋ฐ”๋Š” javac ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ปดํŒŒ์ผํ•˜๊ณ , ์ด ์ปดํŒŒ์ผ ๋œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ํ•œ ์ค„์”ฉ ์ฝ์œผ๋ฉด์„œ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ž๋ฐ”๋Š” ์ปดํŒŒ์ผ ์–ธ์–ด์ด๋ฉด์„œ ์ธํ„ฐํ”„๋ฆฌํŒ… ์–ธ์–ด์ด๋‹ค.
    • Compiler VS Interpreter: https://velog.io/@jaeyunn_15/OS-Compiler-vs-Interpreter
  • JIT ์ปดํŒŒ์ผ๋Ÿฌ
    • ์ž์ฃผ ์‹คํ–‰๋˜๋Š” ๋ฐ”์ดํŠธ ์ฝ”๋“œ ์˜์—ญ์„ ๋Ÿฐํƒ€์ž„ ์ค‘์— ๊ธฐ๊ณ„์–ด๋กœ ์ปดํŒŒ์ผํ•˜์—ฌ Native Method Stack์— ์ €์žฅ๋˜๋ฉฐ, ๋ณ€ํ™˜๋œ ๋ถ€๋ถ„์€ ์ธํ„ฐํ”„๋ฆฌํ„ฐ์— ์˜ํ•ด ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  native code ํ˜•ํƒœ๋กœ ๊ณง๋ฐ”๋กœ ์‹คํ–‰๋œ๋‹ค. ์ธํ„ฐํ”„๋ฆฌํ„ฐ์˜ ๋‹จ์ ์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ๋ฐฉ๋ฒ•์ด๋‹ค.
  • GC
    • ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์šฐ์„  ์ž์„ธํ•œ ๊ฒƒ์€ ํž™ ์˜์—ญ์„ ๋‹ค๋ฃจ๊ณ  ๋ฐ‘์—์„œ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค.

์‹คํ–‰ ์—”์ง„์— ๋Œ€ํ•ด ์ •๋ง ์ž˜ ์ •๋ฆฌํ•ด๋†“์œผ์‹  ๊ธ€! : https://junhyunny.github.io/information/java/jvm-execution-engine/

 

๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ

 

๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๋ถ€๋ถ„

๋Œ€๋ถ€๋ถ„ ์ˆ˜๋ช…์ด ๊ธด ๊ฒƒ๋“ค์„ ๋‹ค๋ฃจ๋Š” ๊ณต๊ฐ„ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

  • ํž™
    • new ์—ฐ์‚ฐ์ž๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด, Array์™€ ๊ฐ™์€ ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„.
    • Reference Type(Integer, String, ArrayList..) ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„์ด๋‹ค.
    • Heap์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” Garbage Collector๊ฐ€ ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™•์ธํ•˜๊ณ  ์ œ๊ฑฐํ•˜๋Š” ์˜์—ญ์ด๋‹ค.
  • ๋ฉ”์†Œ๋“œ ์˜์—ญ
    • ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์œผ๋กœ, ๋ฉ”์†Œ๋“œ ์˜์—ญ์„ ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค, ๋ฉ”์†Œ๋“œ, ํ•„๋“œ, static ๋ณ€์ˆ˜ ๋“ฑ์˜ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๋ณด๊ด€ํ•œ๋‹ค.
    • JVM์€ ๋ฉ”์ธ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์‹œ์ž‘ํ•œ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋ฉ”์ธ ๋ฉ”์†Œ๋“œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค์™€ static ๋ณ€์ˆ˜๊ฐ€ ์žˆ๊ณ , ๊ทธ๊ฒƒ๋“ค์ด ๋ฉ”์†Œ๋“œ ์˜์—ญ์— ์˜ฌ๋ผ์˜จ๋‹ค.
    • Runtime Constant Pool์— Type, Field, Method๋กœ์˜ ๋ชจ๋“  ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ €์žฅํ•˜๋ฉฐ, JVM์€ ์—ฌ๊ธฐ๋ฅผ ํ™œ์š”ํ•ด์„œ ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ์ƒ ์ฃผ์†Œ๋ฅผ ์ฐพ์•„ ์ฐธ์กฐํ•œ๋‹ค.

์Šค๋ ˆ๋“œ๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ์ƒ์„ฑ๋˜๋Š” ๋ถ€๋ถ„

  • ์Šคํƒ
    • ์Šคํƒ ์•ˆ์—๋Š” ์ง€์—ญ๋ณ€์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฆฌํ„ด ๊ฐ’๋“ฑ๊ณผ ๊ฐ™์ด ์ž ์‹œ ์‚ฌ์šฉ๋˜๊ณ  ํ•„์š” ์—†์–ด์ง€๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ๋‹ค.
    • ์›์‹œ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋“ค์— ๋Œ€ํ•ด์„œ ์‹ค์ œ ๊ฐ’์„ ์Šคํƒ์— ์ง์ ‘ ์ €์žฅ๋œ๋‹ค.
    • ์ง€์—ญ ๋ณ€์ˆ˜์ด์ง€๋งŒ ์ฐธ์กฐ ์ž๋ฃŒํ˜• ๋ฐ์ดํ„ฐ๋“ค์€ heap์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์˜ ์ฃผ์†Œ๊ฐ’์„ ์Šคํƒ์— ์ €์žฅํ•ด์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.
    • ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด stack ํ”„๋ ˆ์ž„์ด ํ•˜๋‚˜ ์ƒˆ๋กœ ์ƒ์„ฑ๋˜์–ด push๋˜๊ณ , ๊ทธ ์•ˆ์—์„œ ๋ฉ”์†Œ๋“œ์™€ ๊ด€๊ณ„๋œ ์ง€์—ญ๋ณ€์ˆ˜, ๋งค๊ฐœ ๋ณ€์ˆ˜ ๋“ฑ์„ ์Šคํƒ ์˜์—ญ์— ์ €์žฅํ•œ๋‹ค. ํ˜ธ์ถœ์ด ์™„๋ฃŒ๋˜๋ฉด pop๋œ๋‹ค.
  • PC Register
    • ์Šค๋ ˆ๋“œ๊ฐ€ ์–ด๋Š ๋ช…๋ น์–ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ฃผ์†Œ๋ฅผ ๋“ฑ๋กํ•œ๋‹ค.
    • JVM์ด ์‹คํ–‰ํ•˜๊ณ  ์žˆ๋Š” ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„ : ์Šคํƒ์˜ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ  ์žˆ๋‹ค.
  • Native Method Stack
    • ์ž๋ฐ” ์™ธ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด๋‹ค.

 

Garbage Collector

  • Garbage Collector(์ดํ•˜ GC)๋Š” ์™œ ํ•„์š”ํ• ๊นŒ?
    • ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด ์œ ํšจํ•˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ์ธ Garbage๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. c++๊ฐ™์€ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ด์ค˜์•ผํ•˜์ง€๋งŒ, java๋‚˜ ์ฝ”ํ‹€๋ฆฐ์„ ์‚ฌ์šฉํ•˜๋ฉด JVM์˜ GC๊ฐ€ ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์•Œ์•„์„œ ์ •๋ฆฌํ•ด์ค€๋‹ค.

  • GC์˜ ์›๋ฆฌ๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด์„  Heap์˜ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค.
    • JVM์˜ Heap ์˜์—ญ์€ ์ฒ˜์Œ ์„ค๊ณ„๋  ๋•Œ  2๊ฐ€์ง€๋ฅผ ์ „์ œ๋กœ ํ•˜๊ณ  ์„ค๊ณ„๋˜์—ˆ๋‹ค.
      • ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ์ฒด๋Š” ๊ธˆ๋ฐฉ ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.
      • ์˜ค๋ž˜๋œ ๊ฐ์ฒด์—์„œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด์—์„œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋กœ์˜ ์ฐธ์กฐ๋Š” ์•„์ฃผ ๋“œ๋ฌผ๋‹ค.
    • ๊ฐ์ฒด๋Š” ๋Œ€๋ถ€๋ถ„ ์ผํšŒ์„ฑ์ด๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ์— ์˜ค๋ž˜ ๋‚จ์•„์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋“œ๋ฌผ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด ์ƒ์กด ๊ธฐ๊ฐ„์— ๋”ฐ๋ผ ๋ฌผ๋ฆฌ์ ์ธ Heap ์˜์—ญ์„ ๋‚˜๋ˆ„๊ฒŒ ๋˜์—ˆ๋‹ค.
    • JVM์˜ GC๋Š” Unreachable Object๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•œ๋‹ค. Unreachable Object๋ž€ Stack์—์„œ ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” Heap ์˜์—ญ์˜ ๊ฐ์ฒด๋ฅผ ๋งํ•œ๋‹ค.
  • GC ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • Stop The World
      • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด JVM์ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹คํ–‰์„ ๋ฉˆ์ถ”๊ฒŒ ๋œ๋‹ค. ๋‹น์—ฐํžˆ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋“ค์˜ ์ž‘์—…์ด ์ค‘๋‹จ๋˜๋ฉด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฉˆ์ถ”๊ฒŒ ๋˜๊ณ , GC์˜ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•ด ํŠœ๋‹์„ ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ด Stop the world ์‹œ๊ฐ„์„ ์ค„์ด๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 
    • Mark And Sweep
      • JVM์˜ GC๊ฐ€ ์Šคํƒ์˜ ๋ชจ๋“  ๋ณ€์ˆ˜๋ฅผ ์Šค์บ”ํ•˜๋ฉด์„œ ๊ฐ๊ฐ ์–ด๋–ค Object๋ฅผ ๋ ˆํผ๋Ÿฐ์Šคํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ฐพ๋Š” ๊ณผ์ •์ด Mark๋‹ค. Reachable Object๊ฐ€ ๋ ˆํผ๋Ÿฐ์Šคํ•˜๊ณ  ์žˆ๋Š” Object๋˜ํ•œ ๋งˆํ‚นํ•œ๋‹ค.
      • ๊ทธ๋ฆฌ๊ณ  Mark๋˜์ง€ ์•Š์€ ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ๋“ค์„ ํž™์—์„œ ์ œ๊ฑฐํ•˜๋Š” ๊ณผ์ •์ด Sweep์ด๋‹ค.
    • Mark And Sweep์˜ ๊ณผ์ • (Java 8๊ธฐ์ค€)
      • ๋จผ์ € Eden ์˜์—ญ์ด ๊ฝ‰ ์ฐจ๋ฉด Minor GC๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
        • ์ด๋•Œ Reachable์ด๋ผ๊ณ  ํŒ๋‹จ๋œ ๊ฐ์ฒด๋Š” Surivival 0 ์˜์—ญ์œผ๋กœ ์˜ฎ๊ฒจ์ง„๋‹ค. minor gc์—์„œ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋Š” age bit๊ฐ€ 1์”ฉ ์ฆ๊ฐ€ํ•œ๋‹ค.
        • ๋˜๋‹ค์‹œ Eden ์˜์—ญ์ด ๊ฝ‰ ์ฐจ๋ฉด Minor GC๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ , Reachable์ด๋ผ๊ณ  ํŒ๋‹จ๋œ ๊ฐ์ฒด๋“ค์„ Survival 1 ์˜์—ญ์œผ๋กœ ์ด๋™ํ•œ๋‹ค.
        • ์ด๋ฅผ ๊ณ„์† ๋ฐ˜๋ณตํ•˜๋‹ค๊ฐ€ ์ผ์ • ์ˆ˜์ค€์˜ age bit๊ฐ€ ๋„˜์–ด๊ฐ€๋ฉด Old Generation์œผ๋กœ ๋„˜๊ฒจ์ฃผ๋Š”๋ฐ, ์ด๋ฅผ Promotion์ด๋ผ๊ณ  ํ•˜๋ฉฐ, age bit๊ฐ€ 15๊ฐ€ ๋˜๋ฉด Promotion์ด ์ง„ํ–‰๋œ๋‹ค.
      • ์ด๋•Œ Old Generation์ด ๋‹ค ์ฐจ๋ฉด Major GC๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
        • Major GC๋Š” ๊ฐ์ฒด๋“ค์ด ๊ณ„์† ํ”„๋กœ๋ชจ์…˜๋˜์–ด Old ์˜์—ญ์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•ด์ง€๋ฉด ๋ฐœ์ƒํ•œ๋‹ค. Young ์˜์—ญ์€ old ์˜์—ญ์— ๋น„ํ•ด ํฌ๊ธฐ ์ž‘๊ธฐ ๋•Œ๋ฌธ์— ๋ณดํ†ต 1์ดˆ ์•ˆ์— ๋๋‚˜๊ธฐ ๋•Œ๋ฌธ์— Minor GC๋Š” ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์ง€๋งŒ, Major GC๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ Minor GC์— ๋น„ํ•ด 10๋ฐฐ ์ด์ƒ์œผ๋กœ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค. 

 

GC์˜ ์ข…๋ฅ˜์—๋Š” ์–ด๋–ค ๊ฒƒ๋“ค์ด ์žˆ์„๊นŒ?

  • Serial GC
    • Serial GC์˜ young ์˜์—ญ์€ Mark Sweep ๋Œ€๋กœ ์ˆ˜ํ–‰๋˜๋‚˜, Old์˜์—ญ์—์„œ Mark Sweep Compact ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์‚ฌ์šฉ๋œ๋‹ค. c์ถ”๊ฐ€๋œ Compact ๋‹จ๊ณ„๋Š” Heap ์˜์—ญ์„ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋‹จ๊ณ„๋กœ, ์œ ์šฉํ•œ ๊ฐ์ฒด๋“ค์ด ์—ฐ์†๋˜๊ฒŒ ์Œ“์ด๋„๋ก ํž™์˜ ๊ฐ€์žฅ ์•ž ๋ถ€๋ถ„๋ถ€ํ„ฐ ์ฑ„์›Œ์„œ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋Š” ๋ถ€๋ถ„๊ณผ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„๊ฒŒ ๋œ๋‹ค.
    • Serial GC๋Š” ์„œ๋ฒ„์˜ CPU ์ฝ”์–ด๊ฐ€ 1๊ฐœ์ผ ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ๋˜์—ˆ์œผ๋ฉฐ, ๋ชจ๋“  GC์˜ ์—ญํ• ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด 1๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๋งŒ์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— CPU ์ฝ”์–ด๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ธ ์šด์˜ ์„œ๋ฒ„์—์„œ Serial GC๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฐ˜๋“œ์‹œ ํ”ผํ•ด์•ผ ํ•œ๋‹ค.

  • Parellel GC
    • Java 8๊นŒ์ง€ Default GC๋กœ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฉˆ์ถ”๋Š” ๊ฒƒ์„ ํ”ผํ•  ์ˆ˜ ์—†์—ˆ๊ณ , ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์ด ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. 
    • ๊ธฐ๋ณธ์ ์ธ ์ฒ˜๋ฆฌ ๊ณผ์ •์€ Serial GC์™€ ๋™์ผํ•˜๋‚˜, Parallel GC๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ํ†ตํ•ด Parellelํ•˜๊ฒŒ GC๋ฅผ ์ˆ˜ํ–‰ํ•จ์œผ๋กœ์จ GC์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ƒ๋‹นํžˆ ์ค„์—ฌ์ค€๋‹ค. Parellel GC๋Š” ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์„œ ๋˜๋Š” ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๋จธ์‹ ์—์„œ ์ค‘๊ฐ„ ๊ทœ๋ชจ๋ถ€ํ„ฐ ๋Œ€๊ทœ๋ชจ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด ๊ณ ์•ˆ๋˜์—ˆ๋‹ค.

  • CMS GC (Concurrent Mark Sweep)
    • ๊ธฐ์กด GC์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šค๋ ˆ๋“œ์™€ Mark-Sweep ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ Concurrentํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•œ๋‹ค.
    • CMS GC๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ง€์—ฐ ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋˜์—ˆ์œผ๋ฉฐ, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ตฌ๋™์ค‘์ผ ๋•Œ ํ”„๋กœ์„ธ์„œ์˜ ์ž์›์„ ๊ณต์œ ํ•˜์—ฌ ์ด์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. CMS GC๊ฐ€ ์ˆ˜ํ–‰ ๋  ๋•Œ๋Š” ์ž์›์ด GC๋ฅผ ์œ„ํ•ด์„œ๋„ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ, ์‘๋‹ต์ด ๋Š๋ ค์งˆ ์ˆ˜๋Š” ์žˆ์œผ๋‚˜ ๋ฉˆ์ถ”์ง„ ์•Š๊ฒŒ ๋œ๋‹ค. 
    • CMS GC๋Š” ๋‹ค๋ฅธ GC๋ณด๋‹ค ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•„์š”๋กœ ํ•˜๋ฉฐ, Compaction ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ์ถ”ํ›„์— ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™”๋กœ ์ธํ•ด Compaction ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ, ์ด ๋•Œ์˜ Compaction ์ž‘์—…์ด Parallel GC๋ณด๋‹ค ์˜ค๋ž˜ ์†Œ์š”๋  ์ˆ˜ ์žˆ๋‹ค. 
    • ํ•ด๋‹น ๋ฐฉ์‹์€ java9๋ฒ„์ „๋ถ€ํ„ฐ Deprecated๋˜์—ˆ๋‹ค.

  • G1 GC
    • Java 9์—์„œ๋ถ€ํ„ฐ ์ฑ„ํƒ๋œ G1 GC๋Š” ์šฐ๋ฆฌ๊ฐ€ ์•Œ๋˜ ํž™ ๊ตฌ์กฐ์™€๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค. 
    • Eden, Survivor, Old ์˜์—ญ์ด ๊ณ ์ •๋œ ํฌ๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ฉฐ, ์ „์ฒด ํž™ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ Region์ด๋ผ๋Š” ํŠน์ •ํ•œ ํฌ๊ธฐ๋กœ ๋‚˜๋ˆˆ๋‹ค. Region์˜ ์ƒํƒœ์— ๋”ฐ๋ผ ๊ทธ Region์˜ ์—ญํ• (Eden..)์ด ๋™์ ์œผ๋กœ ๋ณ€๋™ํ•œ๋‹ค. ๋˜ํ•œ ๋‘ ์˜์—ญ์ด ์ถ”๊ฐ€๋˜์–ด์žˆ๋‹ค.
      • Humonogous : region ํฌ๊ธฐ์˜ 50%๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ํฐ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ณต๊ฐ„
      • Available/Unused: ์•„์ง ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ Region์„ ์˜๋ฏธํ•œ๋‹ค.
    • Minor GC
      • ํ•œ ์ง€์—ญ์— ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜๋‹ค๊ฐ€ ํ•ด๋‹น ์ง€์—ญ์ด ๊ฝ‰ ์ฐจ๋ฉด ๋‹ค๋ฅธ ์ง€์—ญ์— ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜๊ณ , Minor GC๊ฐ€ ์ˆ˜ํ–‰๋œ๋‹ค. G1 GC๋Š” ๊ฐ ์ง€์—ญ์„ ์ถ”์ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋น„์ง€๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ์ง€์—ญ์„ ์ฐพ์•„์„œ Mark and Sweep์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
      • Eden ์˜์—ญ์—์„œ GC๊ฐ€ ์ˆ˜ํ–‰๋˜๋ฉด ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋ฅผ markํ•˜๊ณ , ๋ฉ”๋ชจ๋ฆฌ๋ฅผ sweepํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅธ ์ง€์—ญ์œผ๋กœ ์ด๋™์‹œํ‚ค๋Š”๋ฐ, ์ด ์ง€์—ญ์ด Available/unused ์ง€์—ญ์ด๋ฉด ์ด ์˜์—ญ์ด ์ด์ œ Survivor ์˜์—ญ์ด ๋˜๊ณ , Eden ์˜์—ญ์ด Available/Unused ์ง€์—ญ์œผ๋กœ ๋ฐ”๋€๋‹ค.
    • Major GC
      • ์‹œ์Šคํ…œ์ด ๊ณ„์† ์šด์˜๋˜๋‹ค๊ฐ€, ๊ฐ์ฒด๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„ ๋น ๋ฅด๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ ํšŒ์ˆ˜๊ฐ€ ์•ˆ๋  ๋•Œ Major GC๊ฐ€ ์ˆ˜ํ–‰๋œ๋‹ค. ์—ฌ๊ธฐ์„œ G1 GC์™€ ๋‹ค๋ฅธ GC์˜ ์ฐจ์ด์ ์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ์กด์˜ ๋‹ค๋ฅธ GC ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ชจ๋“  heap์˜ ์˜์—ญ์—์„œ GC๊ฐ€ ์ˆ˜ํ–‰๋˜์—ˆ์œผ๋ฉฐ, ๊ทธ์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ์ƒ๋‹นํžˆ ์˜ค๋ž˜๊ฑธ๋ ธ๋‹ค.
      • ๊ทธ๋Ÿฌ๋‚˜ G1 GC๋Š” ์–ด๋Š ์˜์—ญ์— ๊ฐ€๋น„์ง€๊ฐ€ ๋งŽ์€์ง€๋ฅผ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— GC๋ฅผ ์ˆ˜ํ–‰ํ•  ์˜์—ญ์„ ์กฐํ•ฉํ•˜๊ณ , ํ•ด๋‹น ์˜์—ญ์—์„œ๋งŒ GC๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์ž‘์—…์€ Concurrentํ•˜๊ฒŒ ์ˆ˜ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ง€์—ฐ์ด ํฌ์ง€ ์•Š์œผ๋ฉฐ, ๊ฐ€๋น„์ง€๊ฐ€ ๋งŽ์€ ์ง€์—ญ์„ ์ •๋ฆฌํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ํšจ์œจ์ ์ด๋‹ค.
    • G1 GC์˜ ๊ณผ์ •์€ ์ด๋ณด๋‹ค ํ›จ์”ฌ ๋ณต์žกํ•˜๋‹ค. ์šฐ์„ ์€ ๊ฐœ๋… ์ •๋„๋ฅผ ์•Œ๊ณ  ๋„˜์–ด๊ฐ€๋„๋ก ํ•˜๊ณ  ์ถ”ํ›„์— ๊ธ€์„ ํ•˜๋‚˜ ๋” ํ• ๋‹นํ•ด์„œ ์ ์–ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

G1 GC๋ฅผ ์ ์šฉํ–ˆ์„ ๋•Œ์˜ ํž™ ๊ตฌ์กฐ

 

๐Ÿค• ๊ทธ๋ž˜์„œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ์™œ ์ค‘์š”ํ•œ๋ฐ? ๋ญ˜ ์ด๋ ‡๊ฒŒ๊นŒ์ง€ ๋‹ค ์•Œ์•„์•ผ ํ•ด..? ๊ฐ€ ๊ถ๊ธˆํ•ด์ง„๋‹ค๋ฉด.. ์ด ์•ž์„œ ๋– ๋“  ๊ธด๊ธด ์–˜๊ธฐ๋“ค์€ ๋‚ด๊ฐ€ ๋ช‡ ๋‹ฌ ์ „ ์ฒ˜์Œ ๋งŒ๋‚œ OOME๋ผ๋Š” ์—๋Ÿฌ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๋ฐ‘๋ฐฅ์ด์—ˆ๋‹ค.

OOME๋ž€?

 java.lang.OutOfMemoryError๋Š” jvm์ด ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ๋”์ด์ƒ Object๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์—†์„ ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค.

  • OOME์˜ ์ข…๋ฅ˜
    • Java Heap Space : Java์˜ Heap ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ (๋””ํดํŠธ 64MB)
    • PermGen Space :  ํž™ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ ์ค‘ Permenant ์˜์—ญ์€ String Pool, Class Method์™€ ๊ด€๋ จ๋œ ๊ฐ์ข… ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋“ฑ์„ ์ €์žฅํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ๋”ฐ๋ผ์„œ JVM ๊ธฐ๋™ ์‹œ์— ๋กœ๋”ฉ๋˜๋Š” Class ๋˜๋Š” String์˜ ์ˆ˜๊ฐ€ ๋งŽ์€ ๊ฒƒ์ด ์›์ธ์ด ๋œ๋‹ค.
  • ๋‚ด๊ฐ€ ๋งŒ๋‚œ OOME - Java Heap Space
  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
    • -Xmx ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ Heap Memory์˜ ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ, GC Time์„ ์ฆ๊ฐ€์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์ „ ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
    • ๋˜๋Š” OOME๊ฐ€ ๋ฐœ์ƒํ•œ ์‹œ์ ์— ์ƒ์„ฑ๋œ Heap Dump ๋ถ„์„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์“ธ๋ฐ์—†์ด ๋งŽ์€ Memory๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ Memory Leak๋ฅผ ์œ ๋ฐœํ•˜๋Š” ๋กœ์ง์„ ์ฐพ์•„๋‚ด์–ด ์ˆ˜์ •ํ•œ๋‹ค.
  • Heap ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐฉ๋ฒ• - Heap Dump
    • VisualVM, MAT ๋“ฑ์˜ ํˆด์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์œผ๋‚˜, IntellJ์—์„œ VM option์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ž๋™์œผ๋กœ ํž™ ๋คํ”„๋ฅผ ๋– ์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ–ˆ๋‹ค.
    • ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๋™์˜์ƒ ํŒŒ์ผ ์—…๋กœ๋“œ API์˜ ํž™ ๋คํ”„๋ฅผ ํ™•์ธํ•ด๋ณธ ๊ฒฐ๊ณผ byte[] ๋ฐฐ์—ด์ด ๊ณผ๋„ํ•˜๊ฒŒ ์ƒ์„ฑ์ด ๋๋Š”๋ฐ, byte[]๋Š” ๊ธˆ๋ฐฉ ์“ฐ๊ณ , ๋ฒ„๋ฆฌ๋Š” ์‚ฌ์šฉ ๋นˆ๋„ ์ˆ˜๊ฐ€ ๋†’๊ธฐ ๋•Œ๋ฌธ์— GC๊ฐ€ ์ž์ฃผ ์ž‘๋™ํ•˜๊ฒŒ ๋˜๊ณ , ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค€๋‹ค. ๋กœ์ง์˜ ๋ฌธ์ œ์ ์€ ๋™์˜์ƒ ํŒŒ์ผ์˜ ํฌ๊ธฐ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐ์„œ ์‚ฌ์šฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด๋ถ€๋ฅผ ๋œฏ์–ด๋ณด๋‹ˆ, ByteArrayOutputStream์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ชจ๋“  byte[] ๋ฐฐ์—ด์„ ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์— ์ €์žฅํ•ด๋‘๊ณ  ์žˆ์—ˆ๋˜ ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น API๋กœ ๊ตณ์ด MultipartFile์„ byte array๋กœ ๋ณ€๊ฒฝํ•˜๊ณ -> ๊ทธ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๋Œ€์‹  file์˜ ํฌ๊ธฐ๋ฅผ ๋ฐ”๋กœ ๋ฆฌํ„ดํ•˜๋„๋ก ์‚ฌ์šฉํ•˜๋Š” MulipartFile์˜ getSize() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜์˜€๋‹ค.
    • https://linked2ev.github.io/java/2021/05/16/Java-FILE-(6)-ByteArrayInputStream-%EA%B3%BC-ByteArrayOutputStream-%EB%B0%94%EC%9D%B4%ED%8A%B8-%EB%B0%B0%EC%97%B4-%EC%8A%A4%ED%8A%B8%EB%A6%BC/
    • https://stackoverflow.com/questions/7255232/java-memory-efficient-bytearrayoutputstream
    • ๋ญ ๋Œ€๋‹จํ•œ ๋กœ์ง์„ ์ˆ˜์ •ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋˜ํ•œ API ์„ฑ๋Šฅ์— ์ง€๋Œ€ํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๊นจ๋‹ซ๊ณ  ํ•œ ๋ฒˆ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๋Œ€ํ•œ ๊ณต๋ถ€๋„ ํ•ด๋ณด๊ณ  ์žˆ๋Š” ์ค‘์ด๋‹ค! ์ž๋ฐ”๋Š” ์–ด๋ ต๋‹ค~

 

 

 

๐Ÿ™ ์ฐธ๊ณ ์ž๋ฃŒ

https://steady-coding.tistory.com/305

 

JVM ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ž€? (JAVA)

์•ˆ๋…•ํ•˜์„ธ์š”? ์ฝ”๋”ฉ ์ค‘๋…์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ JVM ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. JVM์ด๋ž€? JVM ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์ „์— JVM์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. JVM์€ Java Virtual Machine์˜ ์•ฝ์ž๋กœ, ์ž๋ฐ” ๊ฐ€์ƒ

steady-coding.tistory.com

https://mangkyu.tistory.com/118

 

[Java] Garbage Collection(๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜)์˜ ๊ฐœ๋… ๋ฐ ๋™์ž‘ ์›๋ฆฌ (1/2)

1. Garbage Collection(๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜)์ด๋ž€? [ Garbage Collection(๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜)์ด๋ž€? ] ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœ ํ•˜๋‹ค ๋ณด๋ฉด ์œ ํšจํ•˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ์ธ ๊ฐ€๋ฐ”์ง€(Garbage)๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. C์–ธ์–ด๋ฅผ ์ด์šฉํ•˜๋ฉด free()๋ผ๋Š” ํ•จ

mangkyu.tistory.com

https://jeong-pro.tistory.com/148

 

JVM ๊ตฌ์กฐ์™€ ์ž๋ฐ” ๋Ÿฐํƒ€์ž„ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ (์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋  ๋•Œ JVM์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ, ๊ณผ์ •

JVM(Java Virtual Machine) : ์ž๋ฐ” ๊ฐ€์ƒ ๋จธ์‹ ์œผ๋กœ ์ž๋ฐ” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์ฒด๋‹ค.CPU๋‚˜ ์šด์˜์ฒด์ œ(ํ”Œ๋žซํผ)์˜ ์ข…๋ฅ˜์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.์ฆ‰, ์šด์˜์ฒด์ œ ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋กœ ์ž๋ฐ”

jeong-pro.tistory.com

https://blog.wanzargen.me/16

 

JAVA :: ์ž๋ฐ”์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ - 1. ๋ฉ”์†Œ๋“œ ์˜์—ญ(Method Area)

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

blog.wanzargen.me