** πŸ“Œ PART 6.1 JSP ν”„λ‘œμ νŠΈμ—μ„œμ˜ λ©”λͺ¨λ¦¬ νŠœλ‹ ν•­λͺ© **

β€œμ„œλ²„κ°€ 버벅이지 μ•Šκ³ , λΉ λ₯΄κ²Œ λ™μž‘ν•˜λ©΄μ„œ λ©”λͺ¨λ¦¬λ„ μ•ˆμ •μ μœΌλ‘œ μ“°κ²Œ λ§Œλ“œλŠ” 방법”


🟒 1단계. ν†°μΊ£ μ„œλ²„μ—μ„œ λ©”λͺ¨λ¦¬λŠ” 어디에 μ“°μΌκΉŒ?

πŸ’¬ JSP ν”„λ‘œμ νŠΈλŠ” μ›Ή μ„œλ²„(Tomcat)κ°€ μž‘λ™ν•˜λ©΄μ„œ

μ—¬λŸ¬ 파일(JSP, 클래슀, μ„Έμ…˜ λ“±)을 λ©”λͺ¨λ¦¬(RAM) 에 μ μž¬ν•΄μ„œ μ²˜λ¦¬ν•΄.


βœ… λ©”λͺ¨λ¦¬ μ“°μ΄λŠ” λŒ€ν‘œ μ˜ˆμ‹œ

ν•­λͺ© μ„€λͺ…
JSP μ„œλΈ”λ¦Ώ μ½”λ“œ JSP β†’ Servlet λ³€ν™˜λœ μ½”λ“œκ°€ λ©”λͺ¨λ¦¬μ— 올라감
μ„Έμ…˜(Session) 둜그인 정보 λ“± μ‚¬μš©μžλ³„ μƒνƒœ μ €μž₯
μžλ°” 객체 컨트둀러, DAO, DTO λ“± 클래슀 μΈμŠ€ν„΄μŠ€
파일 처리 μ—…λ‘œλ“œλœ 이미지/파일 정보
GC λŒ€μƒ 객체 더 이상 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 객체듀 (λ©”λͺ¨λ¦¬ λˆ„μˆ˜ 주의)

πŸ”§ 2단계. JVM λ©”λͺ¨λ¦¬ μ˜΅μ…˜μœΌλ‘œ μ„œλ²„ μ„±λŠ₯ νŠœλ‹ν•˜κΈ°

πŸ’¬ JVM(Java Virtual Machine)은 μžλ°” μ½”λ“œκ°€ μ‹€ν–‰λ˜λŠ” 가상 ν™˜κ²½μ΄μ•Ό.

Tomcat도 JVM μœ„μ—μ„œ λŒμ•„κ°€κΈ° λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬ 크기λ₯Ό 직접 μ„€μ •ν•  수 μžˆμ–΄!


βœ… λŒ€ν‘œ JVM μ˜΅μ…˜ μ„€λͺ…

μ˜΅μ…˜ μ„€λͺ… λΉ„μœ 
-Xms JVM이 μ‹œμž‘ν•  λ•Œ 확보할 μ΅œμ†Œ λ©”λͺ¨λ¦¬ μ„œλ²„κ°€ μ²˜μŒμ— μ°¨μ§€ν•  책상 크기
-Xmx μ΅œλŒ€ μ‚¬μš©ν•  수 μžˆλŠ” λ©”λͺ¨λ¦¬ 책상을 아무리 써도 λ„˜μ§€ λͺ»ν•  μ΅œλŒ€ 크기
-XX:+UseG1GC G1 Garbage Collector μ‚¬μš© λ˜‘λ˜‘ν•˜κ³  λΉ λ₯΄κ²Œ μ •λ¦¬ν•΄μ£ΌλŠ” μ²­μ†ŒλΆ€
-XX:MaxPermSize (ꡬ버전) 클래슀/λ©”μ„œλ“œ 정보 μ €μž₯ μ˜μ—­ 크기 πŸ“š κ΅μž¬ν•¨ 크기 (Java 8 이전)

βœ… 싀무 μ˜ˆμ‹œ: Tomcat μ‹€ν–‰ μ˜΅μ…˜

JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC"

β†’ μ²˜μŒμ—” 512MB, μ΅œλŒ€ 1GB λ©”λͺ¨λ¦¬ μ‚¬μš© / G1 GC μ‚¬μš©


πŸ’‘ 쀑학생도 μ΄ν•΄ν•˜λŠ” GC (κ°€λΉ„μ§€ 컬렉터) μ„€λͺ…

GCλŠ” μžλ°” ν”„λ‘œκ·Έλž¨μ΄ μ“°κ³  λ‚˜μ„œ 더 이상 ν•„μš” μ—†λŠ” μ“°λ ˆκΈ° 객체λ₯Ό μžλ™μœΌλ‘œ μΉ˜μ›Œμ£ΌλŠ” κΈ°λŠ₯이야!

μ˜ˆμ‹œ:


πŸš€ 3단계. GC μ „λž΅ 쀑 G1GCκ°€ 쒋은 이유

GC μ’…λ₯˜ νŠΉμ§•
Serial GC 단일 μ“°λ ˆλ“œλ‘œ 처리 β†’ 느림
Parallel GC λ©€ν‹° μ“°λ ˆλ“œ μ‚¬μš© β†’ μ„±λŠ₯ μ’‹μŒ (κΈ°λ³Έ)
G1GC μž‘μ€ μ˜μ—­ λ‹¨μœ„λ‘œ λ‚˜λˆ μ„œ 정리함 β†’ 응닡 μ§€μ—° 적고, λ©”λͺ¨λ¦¬ μ•ˆμ •μ„± 졜고

βœ… G1GC νŠΉμ§•


🧠 4단계. JSP precompile μ „λž΅κ³Ό λ©”λͺ¨λ¦¬ μ ˆμ•½


πŸ’¬ JSPλŠ” 처음 μš”μ²­ν•  λ•Œ λŠλ¦¬λ‹€?

JSPλŠ” μ„œλ²„μ—μ„œ 처음 μš”μ²­μ΄ 듀어왔을 λ•Œλ§Œ

β†’ .jsp νŒŒμΌμ„ .java β†’ .class둜 λ³€ν™˜ν•΄μ„œ 싀행돼.

이 κ³Όμ •:


βœ… Precompile(미리 컴파일) μ „λž΅μ΄λž€?

JSP νŒŒμΌμ„ 미리 μ„œλΈ”λ¦Ώ(.class)으둜 λ§Œλ“€μ–΄λ†”μ„œ

첫 μš”μ²­ λ•Œ 버벅이지 μ•Šκ²Œ μ€€λΉ„ν•˜λŠ” μ „λž΅!


πŸ“¦ JSP Precompile 효과

ν•­λͺ© 효과
JSP 컴파일 타이밍 졜초 μš”μ²­ β†’ 배포 μ‹œλ‘œ 변경됨
μ„±λŠ₯ ↑ 첫 μ‚¬μš©μž μš”μ²­ μ‹œκ°„ 단좕
λ©”λͺ¨λ¦¬ ↓ 컴파일 κ³Όμ •μ—μ„œ λΆˆν•„μš”ν•œ 객체 생성 쀄어듦
GC 효율 ↑ μš”μ²­ μ‹œλ§ˆλ‹€ 클래슀 생성/μ‚­μ œ λ°œμƒ μ•ˆ 함

βœ… Precompile 방법 (Tomcat μ˜ˆμ‹œ)

cd $CATALINA_HOME/bin
jspc -d /output/path /webapp/**/*.jsp

λ˜λŠ” Maven + Jetty/Tomcat ν”ŒλŸ¬κ·ΈμΈ μ‚¬μš© κ°€λŠ₯


πŸŽ“ 5단계. λ©΄μ ‘ 포인트 정리

질문 λͺ¨λ²” λ‹΅λ³€ μš”μ•½
JVM μ˜΅μ…˜ -Xms와 -Xmx μ°¨μ΄λŠ”? μ‹œμž‘ μ‹œ λ©”λͺ¨λ¦¬μ™€ μ΅œλŒ€ λ©”λͺ¨λ¦¬ 크기λ₯Ό μ„€μ •ν•˜λŠ” μ˜΅μ…˜μž…λ‹ˆλ‹€
G1GCλŠ” μ–΄λ–€ μƒν™©μ—μ„œ μ’‹λ‚˜μš”? λŒ€κ·œλͺ¨ μ„œλ²„μ—μ„œ 짧은 μ‘λ‹΅μ‹œκ°„μ„ μœ μ§€ν•΄μ•Ό ν•  λ•Œ μ’‹μŠ΅λ‹ˆλ‹€
JSP precompileμ΄λž€? JSPλ₯Ό μ„œλ²„ μ‹œμž‘ μ‹œ 미리 μ»΄νŒŒμΌν•΄μ„œ 초기 λ‘œλ”©μ„ λΉ λ₯΄κ²Œ λ§Œλ“œλŠ” μ „λž΅μž…λ‹ˆλ‹€
JSPκ°€ λ§Žμ„ λ•Œ λ©”λͺ¨λ¦¬ λ¬Έμ œκ°€ μƒκΈ°λ‚˜μš”? λ„€, λ§Žμ€ JSPκ°€ λ™μ‹œμ— λ³€ν™˜λ˜λ©΄ 클래슀 λ‘œλ”©μœΌλ‘œ λ©”λͺ¨λ¦¬ 압박이 μ»€μ§‘λ‹ˆλ‹€
ν†°μΊ£μ—μ„œ Full GCκ°€ 자주 λ°œμƒν•˜λ©΄ μ–΄λ–»κ²Œ ν•˜λ‚˜μš”? λ©”λͺ¨λ¦¬ μ˜΅μ…˜ μ‘°μ • + GC μ’…λ₯˜ λ³€κ²½ + JSP precompile μ „λž΅μ„ λ³‘ν–‰ν•©λ‹ˆλ‹€

βœ… 마무리 μš”μ•½ν‘œ

ν•­λͺ© μ„€λͺ… λ©”λͺ¨λ¦¬ 영ν–₯
-Xms JVM μ‹œμž‘ μ‹œ 확보할 λ©”λͺ¨λ¦¬ λ„ˆλ¬΄ μž‘μœΌλ©΄ GC 자주 λ°œμƒ
-Xmx JVM μ΅œλŒ€ λ©”λͺ¨λ¦¬ μ œν•œ μ„œλ²„κ°€ μ‚¬μš©ν•  수 μžˆλŠ” μ΅œλŒ€ 곡간
UseG1GC G1 κ°€λΉ„μ§€ 컬렉터 μ‚¬μš© μ•ˆμ •μ μ΄κ³  λΉ λ₯Έ λ©”λͺ¨λ¦¬ 정리
JSP precompile JSP 미리 컴파일 첫 μš”μ²­ μ‹œκ°„ ↓, λ©”λͺ¨λ¦¬ 효율 ↑

βœ… PART 6.2 GC 둜그 뢄석을 ν†΅ν•œ λ©”λͺ¨λ¦¬ 병λͺ© 좔적

β€œμ„œλ²„κ°€ λŠλ €μ§€λ©΄ κ°€λΉ„μ§€ 컬렉터(GC) 탓일 μˆ˜λ„ μžˆμ–΄μš”!”


🟒 1단계. GC(κ°€λΉ„μ§€ μ»¬λ ‰μ…˜)κ°€ 뭐야?

πŸ’¬ GCλŠ” μžλ°”κ°€ μ•ˆ μ“°λŠ” λ©”λͺ¨λ¦¬λ₯Ό μ •λ¦¬ν•΄μ£ΌλŠ” λ˜‘λ˜‘ν•œ μ²­μ†ŒκΈ°μ•Ό!

μ˜ˆμ‹œ:

String name = new String("홍길동");
// 이 name을 더 이상 μ•ˆ μ“°λ©΄ β†’ GCκ°€ μ•Œμ•„μ„œ μΉ˜μ›Œμ€Œ!

βœ… 그런데 λ¬Έμ œλŠ”?

이 GCκ°€ μ²­μ†Œλ₯Ό λ„ˆλ¬΄ 자주 ν•˜κ±°λ‚˜, ν•œ 번 ν•  λ•Œ 였래 걸리면…

πŸ’₯ μ›Ήμ‚¬μ΄νŠΈκ°€ 멈좘 κ²ƒμ²˜λŸΌ 느렀질 수 μžˆμ–΄!


πŸ”₯ 2단계. Full GCκ°€ 뭐고 μ™œ μœ„ν—˜ν• κΉŒ?

βœ… GCλŠ” μ’…λ₯˜κ°€ 2κ°€μ§€ μžˆμ–΄

μ’…λ₯˜ μ„€λͺ… 속도
Young GC 짧게 짧게 자주 μ²­μ†Œν•¨ 빠름
Full GC 전체 λ©”λͺ¨λ¦¬λ₯Ό 정리함 (Old μ˜μ—­κΉŒμ§€) 느림! μ„œλ²„ 잠깐 멈좀 πŸ’€

πŸ’‘ Full GCκ°€ λ°œμƒν•˜λ©΄?


βœ… μ˜ˆμ‹œ (쀑학생도 이해 κ°€λŠ₯ν•œ 흐름)

[μ‚¬μš©μž μš”μ²­]
β†’ νŽ˜μ΄μ§€ μ—΄λ¦Ό
β†’ κ°‘μžκΈ° μ„œλ²„κ°€ "잠깐만~ GC μ’€ ν•˜κ³  올게"
β†’ Full GC 쀑...
β†’ μ‚¬μš©μž μž…μž₯: "μ™œ μ΄λ ‡κ²Œ 느렀?! μ•ˆ λœ¨λ„€?"

πŸ“œ 3단계. GC 둜그 켜기 + Full GC 확인 방법


βœ… Tomcat JVM μ˜΅μ…˜μ—μ„œ GC 둜그 ν™œμ„±ν™”

-verbose:gc
-Xlog:gc*:file=logs/gc.log:time,uptime,level,tags

πŸ’‘ 이걸 μ„€μ •ν•˜λ©΄ gc.log νŒŒμΌμ— GCκ°€ μ‹€ν–‰λœ μ‹œκ°„, μ’…λ₯˜, μ†Œμš” μ‹œκ°„ 등이 μ €μž₯됨


βœ… GC 둜그 μ˜ˆμ‹œ

[Full GC (System.gc())  1024M->512M(2048M), 1.2345678 secs]
ν•­λͺ© 의미
Full GC 전체 μ˜μ—­ 정리 λ°œμƒ
1024M->512M 정리 μ „ 1024MB β†’ 정리 ν›„ 512MB
1.23 secs GC에 1.23초 κ±Έλ¦Ό 😱 (μœ„ν—˜ μ‹ ν˜Έ!)

🧠 4단계. Full GCκ°€ 자주 λ°œμƒν•˜λŠ” μ΄μœ λŠ”?

원인 μ„€λͺ…
λ„ˆλ¬΄ λ§Žμ€ 객체 생성 예: 반볡문 μ•ˆμ—μ„œ new 객체 생성 λ¬΄ν•œ
큰 객체 μœ μ§€ 예: 큰 이미지 리슀트λ₯Ό μ„Έμ…˜μ— 계속 μœ μ§€
λ©”λͺ¨λ¦¬ λΆ€μ‘± -Xmx 섀정이 λ„ˆλ¬΄ μž‘μŒ
GC μ„€μ • λΆ€μ μ ˆ G1GC μ•ˆ μ“°κ³ , κΈ°λ³Έ Serial GC일 경우 λ°œμƒλ₯  ↑

πŸ’‘ μ‹€λ¬΄μ—μ„œ μžˆμ—ˆλ˜ μ‹€μ œ 문제 사둀

νŒ€μ—μ„œ λ§Œλ“  μ‡Όν•‘λͺ°μ΄ λŠλ €μ‘ŒλŠ”λ° 이유λ₯Ό λͺ°λžμŒ.

GC 둜그λ₯Ό λ΄€λ”λ‹ˆ Full GCκ°€ 5초 κ°„κ²©μœΌλ‘œ 계속 λ°œμƒ 쀑…

μ•Œκ³  λ³΄λ‹ˆ, μ„Έμ…˜μ— μƒν’ˆ 전체 리슀트λ₯Ό ν†΅μ§Έλ‘œ μ €μž₯ν•˜κ³  μžˆμ—ˆμŒ! 😱


🎯 5단계. λ©΄μ ‘ 포인트 총정리

질문 λͺ¨λ²” λ‹΅λ³€ μš”μ•½
Full GCκ°€ 자주 λ°œμƒν•˜λ©΄ μ–΄λ–€ λ¬Έμ œκ°€ μƒκΈ°λ‚˜μš”? μ„œλ²„κ°€ κ·Έ μˆœκ°„ λͺ¨λ“  μž‘μ—…μ„ λ©ˆμΆ”κΈ° λ•Œλ¬Έμ— μ‚¬μš©μž μš”μ²­μ΄ μ§€μ—°λ˜κ±°λ‚˜ μ‹€νŒ¨ν•  수 μžˆμŠ΅λ‹ˆλ‹€
GC λ‘œκ·ΈλŠ” μ–΄λ–»κ²Œ ν™•μΈν•˜λ‚˜μš”? JVM μ˜΅μ…˜μ—μ„œ -Xlog:gc* 섀정을 톡해 gc.log 파일둜 μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€
Full GCκ°€ λ°œμƒν•˜λŠ” μ΄μœ λŠ”? 객체 생성 κ³Όλ‹€, λ©”λͺ¨λ¦¬ λΆ€μ‘±, 잘λͺ»λœ GC μ„€μ • 등이 μžˆμŠ΅λ‹ˆλ‹€
ν•΄κ²° 방법은? G1GC μ„€μ •, 객체 μž¬μ‚¬μš©, μ„Έμ…˜ λ©”λͺ¨λ¦¬ μ΅œμ†Œν™”, λ©”λͺ¨λ¦¬ 증가(-Xmx 쑰절) λ“±
μ‹€λ¬΄μ—μ„œ GC 병λͺ©μ„ μ–΄λ–»κ²Œ μž‘λ‚˜μš”? GC 둜그 μ‹œκ°ν™” 도ꡬ(GCViewer, VisualVM λ“±)둜 λΆ„μ„ν•˜κ³  νŠœλ‹ν•©λ‹ˆλ‹€

βœ… 마무리 μš”μ•½ν‘œ

ν•­λͺ© μ„€λͺ… λ©”λͺ¨λ¦¬ 영ν–₯
Full GC 전체 λ©”λͺ¨λ¦¬ 정리 (Old μ˜μ—­ 포함) μ„œλ²„ 응닡 μ§€μ—° ↑, GC μ‹œκ°„ ↑
GC 둜그 GC λ™μž‘ μ‹œκ°„/κ²°κ³Ό 확인 도ꡬ 병λͺ© 좔적 κ°€λŠ₯
병λͺ© 원인 객체 κ³Όλ‹€ 생성, λ©”λͺ¨λ¦¬ λΆ€μ‘± ν•΄κ²° μ—†μœΌλ©΄ μ„œλ²„ 느렀짐/쀑단
νŠœλ‹ μ „λž΅ G1GC μ‚¬μš©, -Xmx 증가, 객체 수λͺ… 쑰절 GC 횟수 ↓, μ„œλ²„ μ•ˆμ •μ„± ↑