Java Flight Recorder

  • Provide a low-overhead data collection framework for troubleshooting Java applications and the HotSpot JVM.
  • ์ž๋ฐ” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ HotSpot JVM์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ฎ์€ ์˜ค๋ฒ„ํ—ค๋“œ๋กœ ์ˆ˜์ง‘ํ•˜์—ฌ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋„๊ตฌ

Licence

  • ์›๋ž˜ JFR์€ Oracle JDK์— ์žˆ๋Š” ๊ธฐ๋Šฅ์ด์˜€์ง€๋งŒ, ์˜คํ”ˆ์†Œ์Šค1๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค.
Flight Recorder has existed for many years and was previously a commercial feature of the Oracle JDK.
This JEP moves the source code to the open repository to make the feature generally available.

์ˆ˜์ง‘ ๋Œ€์ƒ

  • OS
    • Memory, CPU Load and CPU information, native libraries, process information
  • JVM
    • Flags, GC configuration, compiler configuration
    • Method profiling event
    • Memory leak event
  • JDK libraries
    • Socket IO, File IO, Exceptions and Errors, modules

Events

  • JFR์€ JVM๊ณผ ๊ด€๋ จ๋œ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์ง‘ํ•œ๋‹ค.
    • duration event : ํŠน์ • ์‹œ๊ฐ„ ๋™์•ˆ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ ex) ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ์‹œ๊ฐ„
    • instant event : ์ฆ‰์‹œ ๋ฐœ์ƒํ•˜๊ณ  ๊ธฐ๋ก๋˜๋Š” ์ด๋ฒคํŠธ ex) ์Šค๋ ˆ๋“œ ์ฐจ๋‹จ
    • sample event : ์ฃผ๊ธฐ์ ์œผ๋กœ ์‹œ์Šคํ…œ ์ƒํƒœ๋ฅผ ์ ๊ฒ€ํ•˜๋Š” ์ด๋ฒคํŠธ ex) heap

How to use

JFR ๊ธฐ๋Šฅ ํ™œ์„ฑํ™”

  • ์ž๋ฐ” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ• ๋•Œ ์•„๋ž˜์˜ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
-XX:+UnlockCommercialFeatures
-XX:+FlightRecorder

Command jcmd๋ฅผ ํ†ตํ•ด JFR ํŒŒ์ผ ์ƒ์„ฑํ•˜๊ธฐ

  • settings=profile์„ ์ถ”๊ฐ€ํ•ด์•ผ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•œ๋‹ค.
    • ๊ทธ๋งŒํผ ๋ถ€ํ•˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์งง์€ ์‹œ๊ฐ„ ์ˆ˜์ง‘ํ• ๋•Œ ํ™œ์šฉํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค.
    • $JAVA_HOME/jre/lib/jfr/default.jfc, profile.jfc์— ๋ฏธ๋ฆฌ ์„ค์ •๋œ ํ”„๋กœํŒŒ์ผ์ด ์กด์žฌํ•œ๋‹ค.
# jfr ์ƒ์„ฑ ์‹œ์ž‘
jcmd {ํ”„๋กœ์„ธ์Šค ID} JFR.start duration=30s settings=profile filename=test.jfr

# JFR.check - checks running JFR recording
jcmd {ํ”„๋กœ์„ธ์Šค ID} JFR.check

# JFR.stop
jcmd {ํ”„๋กœ์„ธ์Šค ID} JFR.stop recording=2

Kubernetes๋ฅผ ํ†ตํ•ด JFR ํŒŒ์ผ ๊ฐ€์ ธ์˜ค๊ธฐ

  • ์•„๋ž˜์˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋กœ์ปฌ๋กœ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
kubectl cp {namespace}/{pod-name}:{file-path} {local-path}

How to read

  • ๋กœ์ปฌ๋กœ ๊ฐ€์ ธ์˜จ ํŒŒ์ผ์„ JDK Mission Control, IntelliJ, Visualvm์œผ๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.
  • CPU
    • ์–ด๋А Thread๊ฐ€ ๊ฐ€์žฅ CPU๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
    • CPU ์‚ฌ์šฉ๋Ÿ‰์„ ์ตœ์ ํ™” ํ• ๋•Œ ์œ ์‹ฌํžˆ ๋ณด๋ฉด ์ œ์ผ ์ข‹๋‹ค.
  • Memory
    • ์›์‹œ๊ฐ’ ๋ฐ•์‹ฑ, ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐพ์•„์„œ ์ตœ์ ํ™” ํ• ๋•Œ ์ข‹๋‹ค.
  • Flame Graph
    • ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์žฅ ๋งŽ์ด ์†Œ๋น„ํ•˜๋Š” Thread ํ•จ์ˆ˜ ๋ถ€ํ„ฐ ๋…ธ์ถœ๋œ๋‹ค.
    • IntelliJ ๊ธฐ์ค€ ์‚ฌ์šฉ๋ฅ ์ด ๋†’์„์ˆ˜๋ก ์™ผ์ชฝ์— ์œ„์น˜ํ•˜๋ฉฐ ๋„ˆ๋น„๊ฐ€ ๋„“์Œ

JDK 21์—์„œ ์ œ๊ณตํ•˜๋Š” JFR view

  • ๊ณผ๊ฑฐ์—๋Š” ๋ณ„๋„์˜ ํ”„๋กœ๊ทธ๋žจ์„ ํ†ตํ•ด JFR์„ ํ•ด์„ํ•ด์•ผ ํ–ˆ์ง€๋งŒ, JDK์— JFR view cli 2๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜์—ˆ๋‹ค.
jfr view hot-methods test.jfr

Reference

Footnotes

  1. Opensourceํ•˜์ž๋งˆ์ž ํŒ€ ์ „์ฒด๋ฅผ layoff ํ–ˆ๋‹ค๋Š” ์†Œ์‹์ด ์žˆ๋‹ค. https://www.infoq.com/news/2018/06/open-source-jmc/ โ†ฉ

  2. https://www.baeldung.com/java-flight-recorder-view โ†ฉ