JVM Troubleshooting - redutan/redutan.github.io GitHub Wiki

Thread

$ kill -3 [pid] > [filename]
$ jstack [pid] > [filename]
  • ์“ฐ๋ ˆ๋“œ๋คํ”„๋Š” ์ตœ์†Œ 3๋ฒˆ ์ด์ƒ ๋œฌ๋‹ค.
  • ์“ฐ๋ ˆ๋“œ๋คํ”„๋Š” ์žฅ์•  ์‹œ ๋œฌ๋‹ค.

Thread Info

  • ์“ฐ๋ ˆ๋“œ ๋‹จ๋ฉด ์ƒ์„ฑ ์‹œ๊ฐ„ ์ •๋ณด
  • JVM์— ๋Œ€ํ•œ ์ •๋ณด
  • ๊ฐ ์“ฐ๋ ˆ๋“œ์˜ ์Šคํ…์„ ํฌํ•จํ•œ ๋‹ค์–‘ํ•œ ์ •๋ณด
  • Deadlock์— ๋Œ€ํ•œ ์ •๋ณด
  • ํž™ ์˜์—ญ์˜ ์‚ฌ์šฉ ํ˜„ํ™ฉ (JDK 6~)
์“ฐ๋ ˆ๋“œ ์ƒํƒœ ์„ค๋ช… ๋น„๊ณ 
NEW ์“ฐ๋ ˆ๋“œ๊ฐ€ ์•„์ง ์‹œ์ž‘๋˜์ง€ ์•Š์€ ์ƒํƒœ
RUNNABLE ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ˆ˜ํ–‰์ค‘์ธ ์ƒํƒœ ์ฃผ์žฅ์• ์š”์†Œ
BLOCKED ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ž ๊ฒจ ์žˆ์–ด ํ’€๋ฆฌ๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํƒœ ์ฃผ์žฅ์• ์š”์†Œ
WAITING ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๊นจ์šธ ๋•Œ๊นŒ์ง€ ๋ฌดํ•œ์ • ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํƒœ
TIMED_WAITING ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ํŠน์ • ์ž‘์—…ใ…‡๋ฅด ์ˆ˜ํ–‰ํ•˜์—ฌ ๊นจ์šธ ๋•Œ๊นŒ์ง€ ์ง€์ •๋œ ์‹œ๊ฐ„๋งŒํผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” ์ƒํƒœ
TERMINATED ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋œ ์ƒํƒœ

ํˆด์€ Thread Logic์ถ”์ฒœ

Heap

OutOfMemoryError

java.lang.OutOfMemoryError: Java heap space (heap ๋ฉ”๋ชจ๋ฆฌ full)

  • ๋‹ค์–‘ํ•œ ์›์ธ์ด ์žˆ์Œ
  • ์ฃผ๋กœ memory leak ๋‚˜ ๋„ˆ๋ฌด ํฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์š”๊ตฌํ•˜๋Š” ๊ฒฝ์šฐ

java.lang.OutOfMemoryError: PermGen space

  • ์ฝ”๋“œ ์˜์—ญ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋Š˜๋ฆฌ๋Š”๊ฒŒ ๋‹ต
  • -XX:MaxPermSize

java.lang.OutOfMemoryError: Requested array size exceeds VM limit

  • ๋ฐฐ์—ด์ด ๋„ˆ๋ฌด ํด ์‹œ

java.lang.OutOfMemoryError: request bytes for . Out of swap space?

  • OS ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ์‹œ

java.lang.OutOfMemoryError: (Native method)

  • JNI๋‚˜ Native ์ฝ”๋“œ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ธธ ๋•Œ ๋ฐœ์ƒ

๊ธฐํƒ€ ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ

  • hs_err_xxx ๋ผ๋Š” Fatal ์—๋Ÿฌ ๋กœ๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด์„œ ์ฃฝ๋Š” ๊ฒฝ์šฐ.
  • ๋ฐ˜๋“œ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ๋งŒ์œผ๋กœ ์ด๋Ÿฌํ•œ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹˜
  • ํ•ด๋‹น ์—๋Ÿฌ ๋กœ๊ทธ ๋ถ„์„ ๋ฐฉ๋ฒ•์€ Troubleshooting Guide for Java SE 6 with HotSpotVM Or โ€œ์ž๋ฐ” ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ๊ฐ€์ด๋“œโ€ ์ฐธ์กฐ.

Java ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ ํ™•์ธ

jstat

vmstat ๋ช…๋ น์–ด ์ฒ˜๋Ÿผ JVM์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ํ™•์ธํ•˜๋Š” ๋ช…๋ น์–ด $JAVA_HOME/bin ์— ์กด์žฌ jstat -gcutil [pid] 1s: 1์ดˆ๋‹น Java ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ ํ™•์ธ

S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
...

ex) YG ์˜์—ญ์ด ์ •์ƒ์ธ์ง€ ๋น„์ •์ƒ์ธ ์ง€๋Š” GC ์ดํ›„์— 60% ์ดํ•˜๋ผ๋ฉด ๊ดœ์ฐฎ๋‹ค๊ณ  ํŒ๋‹จ

jstat -gccapacity [pid]: kb ๋‹จ์œ„๋กœ java ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ ํ™•์ธ

MGCNM NGCMX NGC S0C S1C EC OGCNM OGCMX OGC OC PGCNM PGCMX PGC PC YGC FGC
...

HeapDump

jmap

jmap -dump:format=b,file=[filename.hprof] [pid]

gcore

jmap์œผ๋กœ ์‹คํŒจํ•  ์‹œ

  • gcore ์ƒ์„ฑ: gcore โ€“o [filename] [pid]
  • gcore๋ฅผ ํž™๋คํ”„๋กœ ๋ณ€ํ™˜: jmap โ€“dump:format=b,file=[filename] [javabin์œ„์น˜] [gorefilename]

๋ถ„์„ํˆด

  • MAT (Eclipse Memory Analyzer): https://eclipse.org/mat/ : ์ถ”์ฒœ(๋ฌด๋ฃŒ)
  • IBM Heap Analyzer : ์ถ”์ฒœ(์ƒ์šฉ?)

์ž๋™ํž™๋คํ”„

์ž๋ฐ” ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ ๋งŒ์œผ๋กœ OOME๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ž๋™์œผ๋กœ ๋คํ”„ ์ƒ์„ฑ ๊ฐ€๋Šฅ

  • -XX:+HeapDumpOnOutOfMemoryError
  • -XX:HeapDumpPath=[path]

CPU ๋ชจ๋‹ˆํ„ฐ๋ง

  • vmstat
  • sar: ํ†ต๊ณ„ ์ •๋ณด
  • top: ์‹ค์‹œ๊ฐ„

vmstat

vmstat 1 5

ํ”„๋กœ์„ธ์Šค ์ƒํ™ฉ

  • ps
  • pstree
  • pmap

Disk I/O

  • df
    • df -kh
  • du
    • du --max-depth=2 /run: /run ์ด๋ผ๋Š” ๋””๋ ‰ํ† ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ํ™•์ธ
  • iostat
    • iostat -x
    • iostat -xd
  • lsof
    • lsof | grep [pid]: ํ•ด๋‹น PID๊ฐ€ ์“ฐ๊ณ  ์žˆ๋Š” ํŒŒ์ผ๋ช…์„ ์•Œ ์ˆ˜ ์žˆ์Œ
โš ๏ธ **GitHub.com Fallback** โš ๏ธ