์ด..? ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ..?
์๋ฒ ์ด์ ์ค์ ๊ฐํ์ ์ผ๋ก ์ ์ ์ฅ์ ๊ฐ ๋ฐ์ํ๋ค. ์ฐ๋ฆฌ ์๋ฒ์๋ scouter๋ก ๋ชจ๋ํฐ๋ง ์์คํ ์ ๊ตฌ์ถํด๋์์๊ณ ์ด์ ์ฆ์์ด ์์ผ๋ฉด ์ฌ๋ด slack์ ํน์ ์ฑ๋๋ก ์๋ฆผ์ด ์ค๊ฒ ํด๋์๋ค.
๋ฉฐ์น ์ ๋ถํฐ ์๋ฒ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ๋ค๋ ์๋ฆผ์ด ์ค๊ธฐ ์์ํ๋ค. ํ์ง๋ง ๋ค๋ฅธ ์ ๋ฌด๋ค์ด ๋ฐ๋ ค ์์ด์ ์ ๊ฒฝ์ฐ์ง ๋ชปํ๋ค.
์ํฉ ๋ฐ์!! ๋น์!!
๊ทธ๋ฐ๋ฐ ์ด์ ๋ถํฐ ํน์ ์ฌ์ดํธ์ ์ ์์ด ๊ฐํ์ ์ผ๋ก ์๋๋ค๋ ๋ฌธ์๊ฐ ๋ค์ด์๋ค. ํ์ธ์ ์ํ ์ ์๋ ์ํฉ์ด ๋์๋ค.
์ฐ๋ฆฌ๋ ์ํ์น ์น์๋ฒ๋ฅผ ์์ ๋๊ณ ๋ก๋๋ฐธ๋ฐ์์ฒ๋ผ ์ฌ์ฉํ๊ณ ์์๋ค. ๊ทธ ๋ค์๋ Tomcat WAS๋ฅผ ์ด์คํํด๋์๊ณ ์ด ์ค์ ํ ์๋ฒ์์๋ง ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด์ ธ ์์๋ค. ๋ฌผ๋ก ๋๋จธ์ง ํ ์๋ฒ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ง์ด ์ฌ๋ผ์์๊ธฐ๋ ๋ง์ฐฌ๊ฐ์ง์๋ค.
์ฐ์ tomcat์ ์ค๋ซ๋์ ์ผ๋์ด์ ๊ทธ๋ฐ๊ฒ์ด๋ผ๋ ๊ฒฝํ์์ ๋์จ ์ถ์ธก์ ํ๊ณ , ๊ณ ๊ฐ์ฌ์ ํ์๋ฅผ ํตํด์ ๋ค์๋ ์ค์ ์ tomcat์ ๋ฆฌ๋ถํ ํ๋ ์์ ์ ํ๊ธฐ๋ก ํ๋ค. WAS๊ฐ ์ด์คํ ๋์ด ์๊ณ ์น์๋ฒ๊ฐ ์๋จ์ ๋ฐ๋ก ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์๋ ์ ์ ์๊ฒ ๋ฌด์ค๋จ ํจ์น๊ฐ ๊ฐ๋ฅํ์ง๋ง ํน์ ๋ชจ๋ฅผ ์ํฉ์ ๋๋นํ์ฌ ๊ณ ๊ฐ์ฌ์ ํ์๋ฅผ ํ๋ค.
๊ธํ ๋ถ์ ๊ป๊ณ .. ๊ทผ๋ณธ์ ์ธ ์์ธ์?
๋ค์๋ ์ค์ ์ ๋ฆฌ๋ถํ ์์ ์ํ๋ ์ค์ ๋ก ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ๋ฐ๊ฐ๊น์ด ์ค์ด๋ค์๋ค. ์ด๊ฑฐ๋ ๋ฌด์กฐ๊ฑด ๋ฉ๋ชจ๋ฆฌ ๋์์ธ ๊ฒ์ผ๋ก ํ๋จ์ด ๋์๊ณ ๋์๊ฐ ์ด๋์ ๋ฐ์ํ๊ณ ์๋์ง๋ฅผ ๋ถ์ํด์ผํ ํ์์ฑ์ ๋๊ผ๋ค.
์ด ๋๋ฌธ์ ์ฌ๋ด์ ์๋ถ๋ค์ ์์ผ๋ก ์ถ๊ฐ๋ ๊ณ ๊ฐ์ฌ๊ฐ ์์ ๋์ด ์์๋๋ฐ ์ด๋ฅผ ๋์ํ๊ธฐ ์ํด์ ์๋ฒ ์ถ๊ฐ ์ฆ์ค(์ค์ผ์ผ์ ๋๋ ์ค์ผ์ผ์์)์ ๊ณ ๋ฏผํ๋ ์น์ดํ ํ ๋ก ์ด ์์๋ค.. ๊ธ์ ์ ์ธ ๋ถ๋ถ๊ณผ ํจ์จ์ ์ธ ๋ถ๋ถ(์ค์ ๋ก ์ด์ํ๋ ์ค๋ฌด์ ๊ด์ )์์ ์คํํฌ๊ฐ ํ๋ ํ ๋ก ์ด์๋ค.. (์ค๋ฌด์ ์ ์ฅ์ ๊ณ ๋ คํด์ฃผ์๋ ์๋ถ์ด ์๋ค๋ ๊ฒ์ ์ ๋ง ๊ฐ์ฌํฉ๋๋ค..! ๐)
ํ๋คํ(heapdump) ๋ถ์ํด๋ณด์!
๊ทธ๊ฑด ๊ทธ๊ฑฐ๊ณ ! ์ผ๋จ์ ๋๋ ๋ฌธ์ ํด๊ฒฐ์ ์ํด์ ์น์๋ฒ์์ ํ์ชฝ Tomcat์ผ๋ก์ ํธ๋ํฝ์ ์ฐจ๋จํ๊ณ , heapdump๋ฅผ ์์ฑํ๋ค. ๊ทธ๋ฆฌ๊ณ memory analyzer Tool์ ์ฌ์ฉํ์ฌ ํด๋น ๋คํํ์ผ์ ๋ถ์ํ๋ค.
java ์ฌ์ฉ ํ๋ก์ธ์ค ์์ด๋ ํ์ธ
๋จผ์ ํ๋คํ ์์ฑ ๋ช ๋ น๋ฌธ์์ ํ๋ก์ธ์ค ์์ด๋๊ฐ ํ๋ผ๋ฏธํฐ๋ก ํ์ํ๊ธฐ ๋๋ฌธ์ ์๋ ๋ช ๋ น์ด๋ฅผ ํตํด์ ํ๋คํ๋ฅผ ์์ฑํ ํ๋ก์ธ์ค ์์ด๋๋ฅผ ํ์ธํ๋ค.
$ jps -v
java process ๋ผ๊ณ ์๊ฐํ๋ฉด ์ธ์ฐ๊ธฐ ์ฝ๋ค!
๊ผญ ์น ์๋ฒ๊ฐ ์๋๋๋ผ๋ Java ํ๋ก๊ทธ๋จ์ด๋ฉด ํ๋คํ๋ฅผ ํ ์ ์์ ๊ฒ์ด๋ค.
ํ๋คํ ์์ฑ
java๋ก ์คํ๋ ํ๋ก์ธ์ค์ ์์ด๋ ๋ชฉ๋ก ์ค์ ํ๋คํ ๋์์ธ tomcat์ ํ๋ก์ธ์ค ์์ด๋๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋๊ฒจ์ ํ๋คํ๋ฅผ ์์ฑํด๋ณด์.
์ฃผ์ํ ์
ํ๋คํ๋ฅผ ์์ฑํ๋ ์ค์๋ ํด๋น ํ๋ก์ธ์ค๊ฐ ๋ฉ์ถ๋ค๊ณ ๋ณด๋ฉด ๋๋ค. ๋ฐ๋ผ์ ์๋ฒ๊ฐ ์ด์คํ๋์ด ์์ง ์์ ์ํ์์ ์ด์์ค์ธ ์๋ฒ์ ๋ํด ํ๋คํ๋ฅผ ์์ฑํ๋ฉด ์๋น์ค๊ฐ ์ค๋จ๋ ์ ์์ผ๋ฏ๋ก ๊ผญ ์์๋์!
๋ง์ฝ ๊ณ ๊ฐ์ฌ์ ํ์๊ฐ ์๋ ์ํ์์ ์ด์์ค์ธ ์๋ฒ์ ๋ํด์ ๊ฐ๋จํ๊ฒ๋ผ๋ ํ๋คํ๋ฅผ ํ์ธํ๊ณ ์ถ๋ค๋ฉด ์๋ ๋ช ๋ น์ด๋ฅผ ํตํด์ ํ์ธํด๋ณด์.
ํ ์ ์ ์จ ํ์ธ์ ์ํด ํ ํ์คํ ๊ทธ๋จ์ ์๋ฒ์์ ์ง์ ํ์ธํด๋ณด์.
ํด์ ์ฌ์ฉํ์ง ๋ชปํ๋ ํ๊ฒฝ์ด๋ผ๋์ง ์๋ฒ CLI ํ๊ฒฝ์์ ํ์ธํด์ผํ๋ ๊ฒฝ์ฐ ์ ์ฉํ ๊ฒ ๊ฐ๋ค.
$ jmap -histo {pid} | more
full GC๋ฅผ ํ๊ธฐ ์ํด์๋ ์๋ ๋ช ๋ น๋ฌธ์ผ๋ก ํด๋ณด์. GC๋ ์ผ์ด๋๋ฉด ์๋ค์ํผ Stop The World! ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ฃผ์ํ์! (๋ด๊ฐ ํด๋ดค์ ๋์๋ ์งง๊ฒ ๋๋ฌ๊ณ ์๋น์ค์๋ ๊ฑฐ์ ์ํฅ์ด ์์์ผ๋ ๊ฐ์ ์๋ฒ ์ํฉ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๊ฐ์ํด์ ์ฌ์ฉํ์.)
$ jmap -histo:live {pid} | more
(์ฌ๊ธฐ์๋ more๋ฅผ ํ์ดํ๋ผ์ธ์ผ๋ก ๋๊ฒจ์ ์กฐ๊ธ์ฉ ๋ณด๊ฒ ํ๋๋ฐ ํ๋ฐฉ์ ์ ๋ถ ์ถ๋ ฅํ๊ณ ์ถ์ผ๋ฉด ํด๋น ํ์ดํ๋ฅผ ์ ๊ฑฐํ๊ณ ์์ ๋ช ๋ น๋ฌธ๋ง ์น๋ฉด ๋ฉ๋๋ค~)
๋คํ ํ์ผ์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์๋ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด ๋๋ค.
์ฃผ์ํ ์ ์ ์ด์ ์ค์ธ ์๋ฒ๋ผ๋ฉด ์๋น์ค๊ฐ ์ค๋จ๋ ์ ์๋ค๋ ์ !! ๊ผญ ๋ช ์ฌํ๊ธฐ ๋ฐ๋๋ค.
// pid๊ฐ 1234์ธ ์๋ฐ ํ๋ก์ธ์ค์ heapdump ํ์ผ์ ๋์ ๋๋ ํ ๋ฆฌ์ ์์ฑ
ubuntu@ubuntu:/home/ubuntu/heap$ jmap -dump:format=b,file=/tmp/heapdump.hprof 1234
ubuntu@ubuntu:/home/ubuntu/heap$ ll
total 8184540
drwxrwxr-x 2 ubuntu ubuntu 28 11์ 10 10:54 ./
drwxr-xr-x 10 ubuntu ubuntu 284 11์ 10 18:44 ../
-rw------- 1 ubuntu ubuntu 7.9G 11์ 10 10:54 heapdump.hprof
7.9GB ์ง๋ฆฌ ๋คํ ํ์ผ ์์ฑ๋จ.. ์ฉ๋ ์์ด๋ ๊ฒ ์ปค .. ๋คํ ๋ช ๋ น์ด ์๋ชปํ๊ฑฐ ์๋์ง..?
ํด๋น ํ์ผ์ ์๋ฒ์์ ํ์ธํ ์ ์๋ ๋ช
๋ น์ด๊ฐ ์๋ค.
jhat ์ด๋ผ๋ ๋ช ๋ น์ด์ธ๋ฐ ํด๋น ํด๋ก๋ ํ์ธํ ์ ์์ง๋ง.. ๋ ๊ฐ์ ๊ฒฝ์ฐ ๋คํ ํ์ผ ์ฉ๋ ์์ฒด๊ฐ ๋๋ฌด ํฌ๊ธฐ ๋๋ฌธ์ ํด๋น ๋ช ๋ น์ด๋ก ๋ถ์ํ๋ ค๋ฉด ๋ฉฐ์น ์ด ๊ฑธ๋ฆด์ง ๋ชจ๋ฅด๊ฒ ๋ค.. ๊ทธ๋์ ํ์ผ์ ๋ก์ปฌ๋ก ๋ค์ด๋ก๋ ๋ฐ์์ memory analyzer๋ผ๋ ์ดํด๋ฆฝ์ค ๋น์ทํ๊ฒ ์๊ธด ํด๋ก ๋ถ์ํด๋ณด์๋ค.
ํ๋คํ ๋ถ์ (Memory Analyzer ์ฌ์ฉ)
memory analyzer (์ดํด๋ฆฝ์ค ๊ธฐ๋ฐ) ๋ค์ด๋ฐ๊ณ ํด๋น tool ์ฌ์ฉํด์ ํ์คํ ๊ทธ๋จ์ด๋ผ๋์ง ํ๋คํ ๋ถ์ํด๋ณด๊ธฐ.
http://www.eclipse.org/mat/downloads.php
Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation
The Eclipse Foundation - home to a global community, the Eclipse IDE, Jakarta EE and over 415 open source projects, including runtimes, tools and frameworks.
eclipse.dev
- 7.9GB ๋คํ ๋ถ์ํ๋๋ฐ ํด์ max heap memory๋ฅผ 4GB๋ก ์ก์๋ ๋ป์. 8GB๋ก ์ก์ผ๋๊น ๋ถ์๋จ. (ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํฌ๊ฒ ์ก์์ค์ผํจ)
- ๋คํ open์ด ๋๋๋๊น leak suspect(๋์ ์ถ์ ?) ํ ๊ฑฐ๋๊ณ popup์ด ๋ธ. ์ข๋ค! ์ ํํ๋๊น leak๋๋๋ถ๋ถ์ด pie ์ฐจํธ๋ก ๋์ด. ํ์ธํด๋ณด๋๊น session์ด ๋์ ์ถ์ ๊ฒฐ๊ณผ๋ก ๊ฐ์ฅ ๋ง์ ๊ณต๊ฐ์ ์ฐจ์งํ๊ณ ์์๊ณ , ์ค์ ๋ก ๋๋ฏผ๊ณผ ๊ด๋ฆฌ์ ๋ชจ๋ session timeout์ด ๋ฌดํ์ด์์.
- OQL ์ด๋ผํด์ ๊ฒฐ๊ณผ๋ฅผ SQL๋ฌธ์ฒ๋ผ ์กฐํํ ์๋ ์๋ ๊ฒ ๊ฐ์๋ฐ ๋๋ ์๋ณด์.. (ํ๋ฌ๊ทธ์ธ ์ค์นํด์ผํ๋?)
- histogram์ผ๋ก ํ์ธํด๋ณด๋ byte[] ๋ค์์ผ๋ก java.util.concurrent.ConcurrentHashMap ๊ฐ์ฒด๊ฐ ๊ฐ์ฅ ๋ง์์. (Hashmap์ ์์ํด์ ์ปค์คํฐ๋ง์ด์งํ์ฌ ์ฌ์ฉํ๊ณ ์๋ ๊ฐ์ฒด๊ฐ ๊ฐ์ฅ ๋ง์ด ์ฐจ์งํ๊ณ ์๋ ๋ฏํจ. ๊ทธ ๋ค์์ด StandardSession์. ๊ทธ๋ฆฌ๊ณ String, ArrayList, java.lang.reflect.Method ์์)
๊ฐ๊ฐ์ ๊ฐ์ฒด๊ฐ ์ด๋์ ์์ฑ์ด ๋๊ณ ์ด๋ ๋ฉ์๋์์ ์ฌ์ฉ๋๋์ง ๊น์ง๋ ์ ์ ์์ง๋ง ๊ทธ๋๋! ์ด๋ค ๊ฐ์ฒด๊ฐ ์ด๋ ์ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ ํ๊ณ ์๋์ง ๊ทธ๋ฆฌ๊ณ ๋์๋ก ์์๋๋ ๊ฐ์ฒด๊ฐ ์ด๋๊ฒ์ธ์ง ๊น์ง๋ ์ ์ ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋๋ ์ ์๋ฏธํ ๊ฒฐ๊ณผ๋ผ๊ณ ์๊ฐํ๋ค.
๋๋ ์ฌ๊ธฐ์ Session ๊ฐ์ฒด๊ฐ ๋์๋ก ์ถ์ธก์ด ๋๊ณ ์ฉ๋๋ ํฌ๊ฒ ์กํ์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๋์ฒํ๊ธฐ ์ํด์ ์์ค์ฝ๋๋ฅผ ์ดํด๋ณด์๋ค.
์๋๋ ๋ค๋ฅผ๊น ์ธ์ ์ ์ง ์๊ฐ์ด ๋ฌดํ์ผ๋ก ์กํ ์์๋ค. ์ผ๋จ์ ์ธ์ ์ ์ง ์๊ฐ์ ๋๋ฏผ ์์คํ ๊ทธ๋ฆฌ๊ณ ๊ด๋ฆฌ์ ์์คํ ๋ชจ๋ ์ก์์ฃผ์๊ณ ๋น๋ถ๊ฐ์ ์ํฉ์ ์ข ๋ ์ง์ผ๋ด์ผํ ๊ฒ ๊ฐ๋ค.
๋ง์ฝ ํด๊ฒฐ์ด ๋์ง ์์์ผ๋ฉด ๋ค์ ๋คํ๋ฅผ ๋จ๊ณ ๋ค๋ฅธ ์์ธ์ ๋ถ์ํด์ .. ๋ค์ ๋์์ค๊ฒ ๋ค..
์ฐธ๊ณ
https://d2.naver.com/helloworld/1326256
https://techblog.woowahan.com/2628/
https://hays99.tistory.com/160
https://timotimo.tistory.com/94
https://stackoverflow.com/questions/71324768/eclipse-memory-analyzer-incompatible-jvm
https://blueyikim.tistory.com/1242
https://taetaetae.github.io/2019/01/10/spring-redirect-oom/