GC Tuning

GC ํŠœ๋‹

GC์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์™€ ํŠœ๋‹ ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

GC์˜ ํ•„์š”์„ฑ๊ณผ ํŠœ๋‹์˜ ๋ฐฉ๋ฒ•์˜ ๋Œ€ํ•ด ์†Œ๊ฐœํ•˜๋ ค ํ•œ๋‹ค.

GC ํŠœ๋‹์˜ ํ•„์š” โ”

๐Ÿ’ก ์ผ๋ฐ˜์ ์œผ๋กœ ํŠœ๋‹์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ

-Xms , -Xmx ๋กœ Memoryํฌ๊ธฐ ์„ค์ • ์—†์ด ์‚ฌ์šฉ์ค‘ ์ด๋‹ค.
JVM์— -server ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค.
Timout ๋กœ๊ทธ์™€ ํ•จ๊ป˜ Transaction์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค

๐Ÿ’ก GC ํŠœ๋‹์ด ๋ถˆํ•„์š”ํ•œ ์ƒํ™ฉ

Minor GC ์ฒ˜๋ฆฌ์‹œ๊ฐ„์ด 50ms ๋‚ด์™ธ๋กœ ๋น ๋ฅธ ๊ฒฝ์šฐ
Minor GC ์ฃผ๊ธฐ๊ฐ€ 10์ดˆ ๋‚ด์™ธ๋กœ ๋นˆ๋ฒˆํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
Full GC์˜ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด 1์ดˆ ์ด๋‚ด์ธ ๊ฒฝ์šฐ
Full GC์˜ ์ฃผ๊ธฐ๊ฐ€ 10๋ถ„์— 1ํšŒ ์ •๋„๋กœ ๋นˆ๋ฒˆํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ

GC๋Š” ์ƒ์„ฑ๋œ Object๊ฐ€ ๋งŽ์„ ์ˆ˜๋ก ๋ฐœ์ƒํ•˜๋Š” ๋นˆ๋„๊ฐ€ ๋Š˜์–ด๋‚œ๋‹ค.

GC๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ๋Š”, Object์˜ ์ƒ์„ฑ์„ ์ค„์ด๋Š” ์ž‘์—…์ด ์„ ํ–‰ ๋˜์–ด์•ผ ํ•œ๋‹ค.

EX) 
๐Ÿ”น String -> StringBuilder & StringBuffer๋กœ ๋Œ€์ฒดํ•ด์•ผ ํ•œ๋‹ค.
String์˜ ๊ฒฝ์šฐ Object๋ฅผ ๋ณต์‚ฌํ•ด์„œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋•Œ๋ฌธ์— Object์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜์ง€๋งŒ.
StringBuilder & StringBuffer ์˜ ๊ฒฝ์šฐ ๊ฐ๊ฐ์˜ ๊ฐ’๋งŒ ๋ณ€๊ฒฝ์ด ๋œ๋‹ค.

๐Ÿ”ธ ๋กœ๊ทธ๋ฅผ ์ตœ๋Œ€ํ•œ ์ ๊ฒŒ ์Œ“๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. 
๋Œ€์šฉ๋Ÿ‰์˜ XML ํŒŒ์ผ์˜ Parsing์€ ๊ฐ€์žฅ ๋งŽ์€ Memory ์‚ฌ์šฉ๋Ÿ‰์„ ๋ณด์ธ๋‹ค.

ํŠœ๋‹์˜ ๋ชฉ์  โ”

Suspend Time ์˜ ๊ฐ์†Œ์— ์žˆ์œผ๋ฉฐ ์„ธ๋ถ€์ ์œผ๋กœ๋Š” Old Area์— ๋„˜์–ด๊ฐ€๋Š” Object์˜ ์ˆ˜๋ฅผ ์ตœ์†Œํ™” ํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ, Full GC์˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ค„์ด๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿ’ก Object ์ˆ˜์˜ ์ตœ์†Œํ™”

G1 GC๋ฅผ ์ œ์™ธํ•œ Java 7 ๊นŒ์ง€์˜ ๋ชจ๋“  Hotspot GC๋Š” Gernerational GC์ด๋‹ค.

Eden Area์—์„œ ์‚ด์•„๋‚จ์€ Object๊ฐ€ Survivor Area๋ฅผ ๊ฑฐ์ณ Old Area ๋กœ ์ด๋™ํ•˜๋Š” ๋ฐฉ์‹์ธ๋ฐ, Old Area์˜ GC๋Š” Suspend Time์ด ๊ธธ์–ด Old Area๋กœ ์˜ค๋Š” Object์˜ ์ˆ˜๋ฅผ ์ค„์ด๋ฉด Full GC์˜ ๋นˆ๋„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ก FULL GC TIME ๋‹จ์ถ•

Full GC์˜ ์‹œ๊ฐ„์€ Minor GC์— ๋น„ํ•ด ๋งค์šฐ ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค.

Suspend Time์ด ์˜ค๋ž˜(1~2์ดˆ) ๊ฑธ๋ฆฌ๊ฒŒ ๋œ๋‹ค๋ฉด ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์—์„œ Time Out์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ ์ž, Old Area์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ฒŒ ๋˜๋ฉด, OOM์ด ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ Full GC์˜ ํšŸ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๊ฒŒ ๋œ๋‹ค.

๐Ÿ’ก GC๋ฅผ ํŠœ๋‹ํ•˜๋Š” ์˜ต์…˜

Heap์˜ ์ดˆ๊ธฐ ํฌ๊ธฐ๋ฅผ ์ œ์–ดํ•˜๋Š” -Xms , -Xmx, New:Old์˜ ๋น„์œจ ์„ค์ •ํ•˜๋Š” -XX:NewRatio ์˜ต์…˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

์›์ธ์ด ๋‹จ์ˆœํ•˜๊ฒŒ Perm Area์˜ ๋ฌธ์ œ๋ผ๋ฉด, -XX:PermSize -XX:MaxPermSize ๋กœ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•ด ์ฃผ๋Š”๊ฒƒ์ด ์ข‹๋‹ค


GC ํŠœ๋‹ ๋ฐฉ๋ฒ•?

๐Ÿ’ก ๋ชจ๋‹ˆํ„ฐ๋ง

๊ฐ€์žฅ ์‰ฌ์šด ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐฉ๋ฒ•์€ jstat ๋ช…๋ น์–ด๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. -verbosegc (GC๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์˜ต์…˜) ๊ณผ -Xloggc:<FILE_PATH> (GC ๋‚ด์—ญ ์ €์žฅํ•˜๋Š” ์˜ต์…˜) ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ๋ฅผ ํŒŒ์ผํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค

Memory ํฌ๊ธฐ์™€ GC ์ƒ๊ด€ ๊ด€๊ณ„

๐Ÿ”ธMemory ํฌ๊ธฐ๊ฐ€ ํฌ๋ฉด GC ๋ฐœ์ƒ ํšŸ์ˆ˜๋Š” ์ค„์–ด๋“ค๊ณ  GC ์ˆ˜ํ–‰ ์‹œ๊ฐ„์€ ์ฆ๊ฐ€ํ•œ๋‹ค

๐Ÿ”นMemory ํฌ๊ธฐ๊ฐ€ ์ž‘์œผ๋ฉด GC ์ˆ˜ํ–‰ ์‹œ๊ฐ„์€ ์ค„์–ด๋“ค๊ณ  GC ๋ฐœ์ƒ ํšŸ์ˆ˜๋Š” ์ฆ๊ฐ€ํ•œ๋‹ค.

๐Ÿ’ก GC ๊ด€๋ จ ์žฅ์•  ๋ฐœ์ƒ ์œ ํ˜• ๋ถ„์„ ๋ฐฉ๋ฒ•

JAVA ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ํ”ํžˆ JVM Heap ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ จํ•œ ์˜ค๋ฅ˜๋“ค์„ ํ”ํžˆ ์ ‘ํ•˜๊ฒŒ ๋œ๋‹ค.

JVM์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ค๋ฅ˜ ์žฅ์• ๋Š” Out Of Memory ๋Š” OOM, OOME ๋ผ๊ณ  ํ•˜๋Š”๋ฐ JVM์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ์ด๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ ๋‘๊ฐ€์ง€ ์œ ํ˜•์ด ์žˆ๋Š”๋ฐ Java Heap space : Heap ๊ณต๊ฐ„์ด ๋ถ€์กฑ์ด ๋ถ€์กฑํ•˜์—ฌ ๋ฐœ์ƒํ•œ๋‹ค.

๊ณต๊ฐ„ ๋ถ€์กฑ์˜ ์›์ธ์œผ๋กœ Heap์˜ ํฌ๊ธฐ๊ฐ€ ์ž‘์•„์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ์™€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์˜ ๋ฌธ์ œ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

PermGen space : String pool, Class Method, ๊ฐ์ข… Method data ๋“ฑ์„ ์ €์žฅํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

JVM ๊ธฐ๋™์‹œ ๋กœ๋”ฉ๋˜๋Š” Class ๋˜๋Š” String ์ˆ˜๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ Classloader Leak์— ์˜ํ•ด OOME๊ฐ€ ๋ฐœ์ƒ๋  ์ˆ˜ ์žˆ๋‹ค.

Last updated