Java ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๊ณ ์๋ฒ ์ ์ง๋ฅผ ํ๋ ๊ฒฝ์ฐ์ JVM์ ์ํ๋ฅผ ํ์ธํด์ผํ๋ ์ํฉ์ด ์ข ์ข ๋ฐ์ํ๋ค. ์ด ๋ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ด๋ ํจํค์ง ์ค์น ์์ด ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด ๋ฐ๋ก jmap์ ํ์ฉํ์ฌ ํ์ธํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ด ๊ฐ๋จํ๋ค. (Java ๋ฒ์ ๋ณ๋ก ์กฐ๊ธ ๋ค๋ฅผ ์ ์๋ค)
java 11 ์ด์ ๋ฒ์
$ jmap --heap <pid>
java 11 ํฌํจ ์ดํ ๋ฒ์
$ jhsdb jmap --heap --pid <pid>
* jhsdb ๊ด๋ จ ๋ฌธ์๋ ์ค๋ผํด ๋ฌธ์ ์ฐธ์กฐ: https://docs.oracle.com/javase/9/tools/jhsdb.htm#JSWOR-GUID-0345CAEB-71CE-4D71-97FE-AA53A4AB028E
์คํ ๊ฒฐ๊ณผ (jdk 11 ๋ฒ์ ๊ธฐ์ค)
$ jhsdb jmap --heap --pid 37141
Attaching to process ID 37141, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 11.0.17+8-post-Ubuntu-1ubuntu218.04
using thread-local object allocation.
Garbage-First (G1) GC with 28 thread(s)
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 34359738368 (32768.0MB)
NewSize = 1363144 (1.2999954223632812MB)
MaxNewSize = 20602421248 (19648.0MB)
OldSize = 5452592 (5.1999969482421875MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 6442450944 (6144.0MB)
G1HeapRegionSize = 16777216 (16.0MB)
Heap Usage:
G1 Heap:
regions = 2048
capacity = 34359738368 (32768.0MB)
used = 13018090760 (12415.01880645752MB)
free = 21341647608 (20352.98119354248MB)
37.88763063494116% used
G1 Young Generation:
Eden Space:
regions = 758
capacity = 21424504832 (20432.0MB)
used = 12717129728 (12128.0MB)
free = 8707375104 (8304.0MB)
59.357870007830854% used
Survivor Space:
regions = 13
capacity = 218103808 (208.0MB)
used = 218103808 (208.0MB)
free = 0 (0.0MB)
100.0% used
G1 Old Generation:
regions = 6
capacity = 12717129728 (12128.0MB)
used = 82857224 (79.01880645751953MB)
free = 12634272504 (12048.98119354248MB)
0.6515402907117376% used
์คํ ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ
sun.jvm.hotspot.types.WrongTypeException: No suitable match for type of address 0x0000000...
openjdk ์ฌ์ฉ ์ ์์ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ openjdk-debuginfo ํจํค์ง๋ฅผ ์ค์นํด์ฃผ์ด์ผ ํ๋ค.
openjdk-11-jdk ๊ธฐ์ค ๋๋ฒ๊ทธ ํจํค์ง๋ช ์ openjdk-11-dbg ์ด๋ค
jdk ๋๋ฒ๊ทธ ํจํค์ง ์ค์น ๋ช ๋ น์ด
$ sudo apt install openjdk-11-dbg -y
์ฃผ๊ธฐ์ ์ผ๋ก ํ์ธํด์ Old generation์ ์ฌ์ฉ๋์ด ์ฆ๊ฐํ๋์ง ํ์ธ๋ ํด๋ณด๊ณ
Tomcat ๊ฐ์ด ๋ํ์ ์ธ Java ์ฑ์์ ์คํํ์ ๋ ์ต์ ์ด ์ ์์ ์ผ๋ก ์ ์ฉ๋๋์ง ํ์ธ๋ ํด๋ณผ ์ ์๋ค.
๋ง์ฝ Old generation์ ์ฃผ๊ธฐ์ ์ผ๋ก ํ์ธํ์ ๋ ๊ณ์ ์ฆ๊ฐํ๋ ํ์์ ๋ณด์ธ๋ค๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์์ฌํด๋ณด๊ณ heap dump๋ฅผ ํ์ผ๋ก ๋จ๊ถ ๋ถ์ํด์ ์กฐ์นํ ์๋ ์๋ค.
๋์ค์ heap dump๋ฅผ ์ด๋ป๊ฒ ๋ถ์ํ ์ ์๋์ง๋ ์ ๋ฆฌํด์ผ๊ฒ ๋ค.
์ฐธ๊ณ
https://stackoverflow.com/questions/55525449/how-to-read-heap-status-with-jdk-11
https://tonaconsulting.wordpress.com/2013/10/21/jmap-jstack-not-working-properly-with-openjdk/
https://soft.plusblog.co.kr/51