SlideShare a Scribd company logo
1 of 33
Download to read offline
Miroslav Wengner
Profiling
with Java Flight Recorder
Safe Harbour Statement
All what you will hear can be di
ff
erent, this presentation is for
motivational purposes …
Miroslav Wengner
• Husband, Father, Software Engineer, Technology Enthusiast
• JCP: Executive Committee Board Member
• OpenJDK Committer , Java Mission Control Project, Open-Source
• Co-Author of Robo4J Project (Duke Award)
• Java Champion, JavaOne RockStar, Blogger
• Principal Engineer at OpenValue
• Group Of Talented and Motivated Individuals
• Netherlands, Germany, Switzerland, Austria…
• Fun, Development, Trainings, Migration and
more…
Application
Crash
No Relevant
Information
Adding a
Logging
Performance
Penalties
Removing
Logging
Agenda
• History in nutshell
• JMC and Flight Recorder in bullet points
• JFR under the hood
• JFR in Action and Examples
• Power of Data Visualisation
• What about JDK improvements and upcoming features?
• Q/A
History in nutshell
• 1998 Appeal Virtual Machines (AVM) - JRockit JVM
• 2002 AVM acquired by BEA
• 2008 acquired by Oracle
• 2012 JDK 7u4 update: Oracle integrated JFR into the HotSpot
• 2017 JDK 9 : Public APIs for creating and consuming data
• 2018 JDK 11: JMC/JFR announced to be fully Open-Sourced
JFR in bullets
• Part of Java Mission Control project
• Java Flight Recorder is an event based tracing framework
• Build directly into the Java Virtual Machine
• Provides access to all internal events
• Allows to create custom events
• Tries to achieve a goal 1% overhead
JFR meets Java Platform
• Compiled to byte-code
• Usage of JIT Compiler
• Byte code optimisation
• module, package: jdk.jfr
Profiling with JFR
• Observability allows to measure a system based on provided data metrics
(local, on-prem or cloud)
• each application may have di
ff
erent telemetry, di
ff
erent assumptions
• hardware, container, end-points, libraries….
• Monitoring -> keeping yes on sampled data
• Pro
fi
ling -> recording and analysing “real” data
https://www.hippopx.com/en/camera-security-monitoring-big-brother-control-surveillance-camera-video-surveillance-81117
Common Usage of JFR
• Micros-Services, Distributes and Stand-Alone applications
• helps in root-cause analysis
• application understanding, bottlenecks
• solution correctes
• testing
• monitoring
Let’s split
More Pods there…
Java Mission Control Project
Current release 8.3
Release Milestone Date
========== =========== ==========
8.2.0 GA 2022-01-19
8.2.1 GA 2022-06-16
8.3 EA 2022-10-11
8.1 : New Allocation Events for JDK 16,
• JMC Agent, JMC Agent Plugin
• Performance Improvements : Perser, Rules
8.2: Minor release
• JFR: Heat-Map View, WebSocket-API
8.3: Minor release
• JMC Core: Parser improvements
• JFR: Dependency view, Graph Pruning, JFR: Selectable attributes,
• Agent: bug
fi
xing
Java Mission Control Project
Current release 8.3
Dependency View
Graph pruning View
Flameview Selectable Attributes
Java Flight Recorder
under the hood
Java Event API
JVM Events
Thread Local
Buffers
Events
Global Bu
ff
ers
Repository
per 1s
JFR Event Streaming (JEP 349): Continual Monitoring
JFR under the hood: Event - fundamental element
• Import “jdk.jfr.Event”
• Basic Element that caries valuable information
EventID:
Timestamp : when event was taken
Duration: not always
Thread ID: Thread where event has occurred
StackTrace ID: It’s optional referst to the StackTrace, default depth 64
Payload: custom information
Import jdk.jfr.Event;
public class SampleEvent extends Event {
//internal logic
String message;
}
…
void someAdvanceLogic() {
SampleEvent e = new SampleEvent();
e.message = “Important Information”;
e.begin();
// advanced logic
e.end();
e.commit();
}
…
JFR under the hood: Event
JFR under the hood: : Tuning up an Event
Annotations: https://docs.oracle.com/en/java/javase/19/docs/api/jdk.jfr/jdk/jfr/class-use/MetadataDe
fi
nition.html
Annotation Description Default
@Name
Automatically Set, Recommended pattern: org.com…
Event
Full path with Name:
openvalue.SampleEvent
@Label Short descriptive information
@Category Category is present to the user
@Threshold
Default min duration fo the event to be included in the
recording
0ns
@StackTrace Include a stack-trace to the event TRUE
@Enabled Is Event enabled by default con
fi
guration
JFR under the hood: : Tuning up an Event
import jdk.jfr.Event
import jdk.jfr.Label
import jdk.jdf.Name
@Name(“com.openvalue.events.SampleEvent”)
@Label(“Sample Event”)
class SampleEvent extends Event {
@Label(“Message”)
String name;
@Label(“Value”)
int value;
}
Annotations: https://docs.oracle.com/en/java/javase/19/docs/api/jdk.jfr/jdk/jfr/class-use/MetadataDe
fi
nition.html
JFR under the hood: Performance
• Usage of Thread Local Bu
ff
ers
• Java Platform Optimisation
• Methods: INLINING, CODE ELIMINATION, SCALARIZATION
• What happens when event is enabled / disabled
-XX:StartFlightRecording=filename=<RECORDING_FILE>.jfr,dumponexit=true,settings=profile
void someAdvanceLogic() {
SampleEvent e = new SampleEvent();
e.message = “Important Information”;
e.begin();
// advanced logic
e.commit();
}
void commit() {
// IF it’s not enabled -> NOT INTERESTING
if(isEnabled()){
//now() reads CPU clock register, cheap check
long duration = now() - startTime;
if(duration > THRESHOLD) {
if (shouldCommit()) {
// Cheap - Thread local writes
actuallyCommit();
}
}
}
Mikeal Vidstedt presented quite neat pseudo-code that helps to understand to the commit()
JFR under the hood: Event in Action
void someAdvanceLogic(){
// allocating event
SampleEvent e = new SampleEvent();
e.begin(); -> INLINING => e.startTime = now(); -> e.startTime = <JVM intrinsic>
// advanced logic
// timestamp, likewise INLINING, implicit end()
e.commit();
// JFR ENABLED STATE
if(e.isEnabled()){
// perform additional checks and maybe actuallyCommit()
}
}
JFR under the hood: Enabled
JFR under the hood: Disabled - part 1
void someAdvanceLogic() {
SampleEvent e = new SampleEvent();
// INLINING from the previous slide
e.startTime = <JVM intrinsic>;
// advanced logic
//INLINING
if(false) { // result e.isEnabled()
//perform additional checks
//CODE ELIMINATION -> will be removed
}
}
JFR under the hood: Disabled - part 2
void someAdvanceLogic() {
SampleEvent e = new SampleEvent(); // SCALARIZATION -> REMOVAL
e.begin()
1. initial state: e.begin();
2. INLINING => e.startTime = <JVM intrinsic>;
3. INLINING => long startTime = <JVM intrisic>;
4. CODE ELIMINATION => long startTime = <JVM intrisic>; REMOVAL
//business logic
}
JFR under the hood: Disabled - part 3
void someAdvanceLogic() {
//business logic
}
JFR: Start Recording
# Starting a recording
$ java -XX:StartFlightRecording …
# Starting Recording and Storing into the file
$ java -XX:StartFlightRecording=filename=<FILE_NAME>.jfr
# Starting Recording and dump on exit
$ java -XX:StartFlightRecording=filename=<FILE_NAME>.jfr,dumponexit-true,settings=profile
# Using jcmd command via PID to start recording
$ jcmd <PID> JFR.start duration=30s filename=hotmethods_jcmd.jfr
JFR: Data Visualisation
• Command line tool avaliable from JDK 11 => jfr
$jfr summary <JFR_file>
$jfr print —json <JFR_FILE>
• JFR GUI. (DEMO)
• Automated analysis
• Java Application => Thread, Memory, etc.
• Event Browser
DEMO: Hot-Methods
DEMO: Garbage-Collection
DEMO: Latency
DEMO: Java Platform Module Latency
var threadPerTaskExecutor = Executors.newThreadPerTaskExecutor(threadFactory);
var executor = Executors.newVirtualThreadPerTaskExecutor();
threadPerTaskExecutor.execute(() -> {
while (active.get()){
executor.submit(new ComputableTask(counter));
}
})
•
JFR: How to Get
• Clone: https://github.com/openjdk/jmc. => script build.sh
• AdoptOpenJDK: http://adoptopenjdk.net/jmc
• Azul: https://www.azul.com/products/zulu-mission-control
• RedHat: distributes as RPMs in Fedora and RHEL
• Oracle: https://www.oracle.com/java/technologies/jdk-mission-control.html
JMC-JVM-LANG Tutorial: https://github.com/mirage22/jmc-jvm-lang-tutorial
JFR-Tutorial: https://github.com/thegreystone/jmc-tutorial
Q / A
Thank YOU !
twitter: @miragemiko
gitlab:@mirage22
DEMOS: https://github.com/mirage22/jmc-jvm-lang-tutorial
References:
• Project Amber: https://openjdk.org/projects/amber/
• Project Loom: https://openjdk.org/projects/loom/
• JFR Project: https://github.com/openjdk/jmc
• OpenJDK: https://openjdk.org/
• JEP-349 JFR Event Steaming: https://openjdk.org/jeps/349
• foojay.io: https://foojay.io/today/author/miro-wengner/
• OpenValue Blog: https://openvalue.blog/
Book In Progress: Practical Design Patterns for Java Developers [PACKT]

More Related Content

What's hot

Maria db 이중화구성_고민하기
Maria db 이중화구성_고민하기Maria db 이중화구성_고민하기
Maria db 이중화구성_고민하기NeoClova
 
ksqlDB로 시작하는 스트림 프로세싱
ksqlDB로 시작하는 스트림 프로세싱ksqlDB로 시작하는 스트림 프로세싱
ksqlDB로 시작하는 스트림 프로세싱confluent
 
Performance Monitoring: Understanding Your Scylla Cluster
Performance Monitoring: Understanding Your Scylla ClusterPerformance Monitoring: Understanding Your Scylla Cluster
Performance Monitoring: Understanding Your Scylla ClusterScyllaDB
 
Tuning Apache Kafka Connectors for Flink.pptx
Tuning Apache Kafka Connectors for Flink.pptxTuning Apache Kafka Connectors for Flink.pptx
Tuning Apache Kafka Connectors for Flink.pptxFlink Forward
 
MySQL Performance Schema in 20 Minutes
 MySQL Performance Schema in 20 Minutes MySQL Performance Schema in 20 Minutes
MySQL Performance Schema in 20 MinutesSveta Smirnova
 
Apache Flink internals
Apache Flink internalsApache Flink internals
Apache Flink internalsKostas Tzoumas
 
TiDB at PayPay
TiDB at PayPayTiDB at PayPay
TiDB at PayPayPingCAP
 
Apache Spark Data Source V2 with Wenchen Fan and Gengliang Wang
Apache Spark Data Source V2 with Wenchen Fan and Gengliang WangApache Spark Data Source V2 with Wenchen Fan and Gengliang Wang
Apache Spark Data Source V2 with Wenchen Fan and Gengliang WangDatabricks
 
State of the Trino Project
State of the Trino ProjectState of the Trino Project
State of the Trino ProjectMartin Traverso
 
MariaDB 제품 소개
MariaDB 제품 소개MariaDB 제품 소개
MariaDB 제품 소개NeoClova
 
MySQL/MariaDB Proxy Software Test
MySQL/MariaDB Proxy Software TestMySQL/MariaDB Proxy Software Test
MySQL/MariaDB Proxy Software TestI Goo Lee
 
Hive Anatomy
Hive AnatomyHive Anatomy
Hive Anatomynzhang
 
Troubleshooting tips and tricks for Oracle Database Oct 2020
Troubleshooting tips and tricks for Oracle Database Oct 2020Troubleshooting tips and tricks for Oracle Database Oct 2020
Troubleshooting tips and tricks for Oracle Database Oct 2020Sandesh Rao
 
Redis data modeling examples
Redis data modeling examplesRedis data modeling examples
Redis data modeling examplesTerry Cho
 
Christo kutrovsky oracle, memory & linux
Christo kutrovsky   oracle, memory & linuxChristo kutrovsky   oracle, memory & linux
Christo kutrovsky oracle, memory & linuxKyle Hailey
 
Oracle 10g Performance: chapter 02 aas
Oracle 10g Performance: chapter 02 aasOracle 10g Performance: chapter 02 aas
Oracle 10g Performance: chapter 02 aasKyle Hailey
 
Flink Forward Berlin 2017: Piotr Nowojski - "Hit me, baby, just one time" - B...
Flink Forward Berlin 2017: Piotr Nowojski - "Hit me, baby, just one time" - B...Flink Forward Berlin 2017: Piotr Nowojski - "Hit me, baby, just one time" - B...
Flink Forward Berlin 2017: Piotr Nowojski - "Hit me, baby, just one time" - B...Flink Forward
 

What's hot (20)

Maria db 이중화구성_고민하기
Maria db 이중화구성_고민하기Maria db 이중화구성_고민하기
Maria db 이중화구성_고민하기
 
ksqlDB로 시작하는 스트림 프로세싱
ksqlDB로 시작하는 스트림 프로세싱ksqlDB로 시작하는 스트림 프로세싱
ksqlDB로 시작하는 스트림 프로세싱
 
Performance Monitoring: Understanding Your Scylla Cluster
Performance Monitoring: Understanding Your Scylla ClusterPerformance Monitoring: Understanding Your Scylla Cluster
Performance Monitoring: Understanding Your Scylla Cluster
 
Tuning Apache Kafka Connectors for Flink.pptx
Tuning Apache Kafka Connectors for Flink.pptxTuning Apache Kafka Connectors for Flink.pptx
Tuning Apache Kafka Connectors for Flink.pptx
 
MySQL Performance Schema in 20 Minutes
 MySQL Performance Schema in 20 Minutes MySQL Performance Schema in 20 Minutes
MySQL Performance Schema in 20 Minutes
 
Rac 12c optimization
Rac 12c optimizationRac 12c optimization
Rac 12c optimization
 
Apache Flink internals
Apache Flink internalsApache Flink internals
Apache Flink internals
 
TiDB at PayPay
TiDB at PayPayTiDB at PayPay
TiDB at PayPay
 
Apache Spark Data Source V2 with Wenchen Fan and Gengliang Wang
Apache Spark Data Source V2 with Wenchen Fan and Gengliang WangApache Spark Data Source V2 with Wenchen Fan and Gengliang Wang
Apache Spark Data Source V2 with Wenchen Fan and Gengliang Wang
 
Introducing Akka
Introducing AkkaIntroducing Akka
Introducing Akka
 
State of the Trino Project
State of the Trino ProjectState of the Trino Project
State of the Trino Project
 
MariaDB 제품 소개
MariaDB 제품 소개MariaDB 제품 소개
MariaDB 제품 소개
 
MySQL/MariaDB Proxy Software Test
MySQL/MariaDB Proxy Software TestMySQL/MariaDB Proxy Software Test
MySQL/MariaDB Proxy Software Test
 
Planning for Disaster Recovery (DR) with Galera Cluster
Planning for Disaster Recovery (DR) with Galera ClusterPlanning for Disaster Recovery (DR) with Galera Cluster
Planning for Disaster Recovery (DR) with Galera Cluster
 
Hive Anatomy
Hive AnatomyHive Anatomy
Hive Anatomy
 
Troubleshooting tips and tricks for Oracle Database Oct 2020
Troubleshooting tips and tricks for Oracle Database Oct 2020Troubleshooting tips and tricks for Oracle Database Oct 2020
Troubleshooting tips and tricks for Oracle Database Oct 2020
 
Redis data modeling examples
Redis data modeling examplesRedis data modeling examples
Redis data modeling examples
 
Christo kutrovsky oracle, memory & linux
Christo kutrovsky   oracle, memory & linuxChristo kutrovsky   oracle, memory & linux
Christo kutrovsky oracle, memory & linux
 
Oracle 10g Performance: chapter 02 aas
Oracle 10g Performance: chapter 02 aasOracle 10g Performance: chapter 02 aas
Oracle 10g Performance: chapter 02 aas
 
Flink Forward Berlin 2017: Piotr Nowojski - "Hit me, baby, just one time" - B...
Flink Forward Berlin 2017: Piotr Nowojski - "Hit me, baby, just one time" - B...Flink Forward Berlin 2017: Piotr Nowojski - "Hit me, baby, just one time" - B...
Flink Forward Berlin 2017: Piotr Nowojski - "Hit me, baby, just one time" - B...
 

Similar to DevDays: Profiling With Java Flight Recorder

ASML_FlightRecorderMeetsJava.pdf
ASML_FlightRecorderMeetsJava.pdfASML_FlightRecorderMeetsJava.pdf
ASML_FlightRecorderMeetsJava.pdfMiro Wengner
 
JMC/JFR: Kotlin spezial
JMC/JFR: Kotlin spezialJMC/JFR: Kotlin spezial
JMC/JFR: Kotlin spezialMiro Wengner
 
Java code coverage with JCov. Implementation details and use cases.
Java code coverage with JCov. Implementation details and use cases.Java code coverage with JCov. Implementation details and use cases.
Java code coverage with JCov. Implementation details and use cases.Alexandre (Shura) Iline
 
Java mission control and java flight recorder
Java mission control and java flight recorderJava mission control and java flight recorder
Java mission control and java flight recorderWolfgang Weigend
 
Monitoring Java Application Security with JDK Tools and JFR Events.pdf
Monitoring Java Application Security with JDK Tools and JFR Events.pdfMonitoring Java Application Security with JDK Tools and JFR Events.pdf
Monitoring Java Application Security with JDK Tools and JFR Events.pdfAna-Maria Mihalceanu
 
Performance Monitoring with Java Flight Recorder on OpenJDK [DEV2406]
Performance Monitoring with Java Flight Recorder on OpenJDK [DEV2406]Performance Monitoring with Java Flight Recorder on OpenJDK [DEV2406]
Performance Monitoring with Java Flight Recorder on OpenJDK [DEV2406]Hiroaki NAKADA
 
WebLogic Developer Webcast 5: Troubleshooting and Testing with WebLogic, Soap...
WebLogic Developer Webcast 5: Troubleshooting and Testing with WebLogic, Soap...WebLogic Developer Webcast 5: Troubleshooting and Testing with WebLogic, Soap...
WebLogic Developer Webcast 5: Troubleshooting and Testing with WebLogic, Soap...Jeffrey West
 
Java Colombo Meetup: Java Mission Control & Java Flight Recorder
Java Colombo Meetup: Java Mission Control & Java Flight RecorderJava Colombo Meetup: Java Mission Control & Java Flight Recorder
Java Colombo Meetup: Java Mission Control & Java Flight RecorderIsuru Perera
 
Open Source XMPP for Cloud Services
Open Source XMPP for Cloud ServicesOpen Source XMPP for Cloud Services
Open Source XMPP for Cloud Servicesmattjive
 
OSMC 2021 | inspectIT Ocelot: Dynamic OpenTelemetry Instrumentation at Runtime
OSMC 2021 | inspectIT Ocelot: Dynamic OpenTelemetry Instrumentation at RuntimeOSMC 2021 | inspectIT Ocelot: Dynamic OpenTelemetry Instrumentation at Runtime
OSMC 2021 | inspectIT Ocelot: Dynamic OpenTelemetry Instrumentation at RuntimeNETWAYS
 
Jdk Tools For Performance Diagnostics
Jdk Tools For Performance DiagnosticsJdk Tools For Performance Diagnostics
Jdk Tools For Performance DiagnosticsDror Bereznitsky
 
Java Mission Control in Java SE 7U40
Java Mission Control in Java SE 7U40Java Mission Control in Java SE 7U40
Java Mission Control in Java SE 7U40Roger Brinkley
 
A Glance At The Java Performance Toolbox.pdf
 A Glance At The Java Performance Toolbox.pdf A Glance At The Java Performance Toolbox.pdf
A Glance At The Java Performance Toolbox.pdfAna-Maria Mihalceanu
 
A Glance At The Java Performance Toolbox.pdf
 A Glance At The Java Performance Toolbox.pdf A Glance At The Java Performance Toolbox.pdf
A Glance At The Java Performance Toolbox.pdfAna-Maria Mihalceanu
 
Best Practices for performance evaluation and diagnosis of Java Applications ...
Best Practices for performance evaluation and diagnosis of Java Applications ...Best Practices for performance evaluation and diagnosis of Java Applications ...
Best Practices for performance evaluation and diagnosis of Java Applications ...IndicThreads
 
Java Flight Recorder Behind the Scenes
Java Flight Recorder Behind the ScenesJava Flight Recorder Behind the Scenes
Java Flight Recorder Behind the ScenesStaffan Larsen
 
A Glance At The Java Performance Toolbox
 A Glance At The Java Performance Toolbox A Glance At The Java Performance Toolbox
A Glance At The Java Performance ToolboxAna-Maria Mihalceanu
 
Tracing the Breadcrumbs: Apache Spark Workload Diagnostics
Tracing the Breadcrumbs: Apache Spark Workload DiagnosticsTracing the Breadcrumbs: Apache Spark Workload Diagnostics
Tracing the Breadcrumbs: Apache Spark Workload DiagnosticsDatabricks
 

Similar to DevDays: Profiling With Java Flight Recorder (20)

ASML_FlightRecorderMeetsJava.pdf
ASML_FlightRecorderMeetsJava.pdfASML_FlightRecorderMeetsJava.pdf
ASML_FlightRecorderMeetsJava.pdf
 
JMC/JFR: Kotlin spezial
JMC/JFR: Kotlin spezialJMC/JFR: Kotlin spezial
JMC/JFR: Kotlin spezial
 
Java code coverage with JCov. Implementation details and use cases.
Java code coverage with JCov. Implementation details and use cases.Java code coverage with JCov. Implementation details and use cases.
Java code coverage with JCov. Implementation details and use cases.
 
Troubleshooting Tools In JDK
Troubleshooting Tools In JDKTroubleshooting Tools In JDK
Troubleshooting Tools In JDK
 
Java mission control and java flight recorder
Java mission control and java flight recorderJava mission control and java flight recorder
Java mission control and java flight recorder
 
Monitoring Java Application Security with JDK Tools and JFR Events.pdf
Monitoring Java Application Security with JDK Tools and JFR Events.pdfMonitoring Java Application Security with JDK Tools and JFR Events.pdf
Monitoring Java Application Security with JDK Tools and JFR Events.pdf
 
Performance Monitoring with Java Flight Recorder on OpenJDK [DEV2406]
Performance Monitoring with Java Flight Recorder on OpenJDK [DEV2406]Performance Monitoring with Java Flight Recorder on OpenJDK [DEV2406]
Performance Monitoring with Java Flight Recorder on OpenJDK [DEV2406]
 
WebLogic Developer Webcast 5: Troubleshooting and Testing with WebLogic, Soap...
WebLogic Developer Webcast 5: Troubleshooting and Testing with WebLogic, Soap...WebLogic Developer Webcast 5: Troubleshooting and Testing with WebLogic, Soap...
WebLogic Developer Webcast 5: Troubleshooting and Testing with WebLogic, Soap...
 
Java Colombo Meetup: Java Mission Control & Java Flight Recorder
Java Colombo Meetup: Java Mission Control & Java Flight RecorderJava Colombo Meetup: Java Mission Control & Java Flight Recorder
Java Colombo Meetup: Java Mission Control & Java Flight Recorder
 
Open Source XMPP for Cloud Services
Open Source XMPP for Cloud ServicesOpen Source XMPP for Cloud Services
Open Source XMPP for Cloud Services
 
OSMC 2021 | inspectIT Ocelot: Dynamic OpenTelemetry Instrumentation at Runtime
OSMC 2021 | inspectIT Ocelot: Dynamic OpenTelemetry Instrumentation at RuntimeOSMC 2021 | inspectIT Ocelot: Dynamic OpenTelemetry Instrumentation at Runtime
OSMC 2021 | inspectIT Ocelot: Dynamic OpenTelemetry Instrumentation at Runtime
 
Jdk Tools For Performance Diagnostics
Jdk Tools For Performance DiagnosticsJdk Tools For Performance Diagnostics
Jdk Tools For Performance Diagnostics
 
Java Mission Control in Java SE 7U40
Java Mission Control in Java SE 7U40Java Mission Control in Java SE 7U40
Java Mission Control in Java SE 7U40
 
A Glance At The Java Performance Toolbox.pdf
 A Glance At The Java Performance Toolbox.pdf A Glance At The Java Performance Toolbox.pdf
A Glance At The Java Performance Toolbox.pdf
 
A Glance At The Java Performance Toolbox.pdf
 A Glance At The Java Performance Toolbox.pdf A Glance At The Java Performance Toolbox.pdf
A Glance At The Java Performance Toolbox.pdf
 
Best Practices for performance evaluation and diagnosis of Java Applications ...
Best Practices for performance evaluation and diagnosis of Java Applications ...Best Practices for performance evaluation and diagnosis of Java Applications ...
Best Practices for performance evaluation and diagnosis of Java Applications ...
 
Profiling documentforaltrec
Profiling documentforaltrecProfiling documentforaltrec
Profiling documentforaltrec
 
Java Flight Recorder Behind the Scenes
Java Flight Recorder Behind the ScenesJava Flight Recorder Behind the Scenes
Java Flight Recorder Behind the Scenes
 
A Glance At The Java Performance Toolbox
 A Glance At The Java Performance Toolbox A Glance At The Java Performance Toolbox
A Glance At The Java Performance Toolbox
 
Tracing the Breadcrumbs: Apache Spark Workload Diagnostics
Tracing the Breadcrumbs: Apache Spark Workload DiagnosticsTracing the Breadcrumbs: Apache Spark Workload Diagnostics
Tracing the Breadcrumbs: Apache Spark Workload Diagnostics
 

More from Miro Wengner

Boost delivery stream with code discipline engineering
Boost delivery stream with code discipline engineeringBoost delivery stream with code discipline engineering
Boost delivery stream with code discipline engineeringMiro Wengner
 
[meetup] Mastering Java enhancements like a Pro: practical design patterns an...
[meetup] Mastering Java enhancements like a Pro: practical design patterns an...[meetup] Mastering Java enhancements like a Pro: practical design patterns an...
[meetup] Mastering Java enhancements like a Pro: practical design patterns an...Miro Wengner
 
New Java features: Simplified Design Patterns[LIT3826]
New Java features: Simplified Design Patterns[LIT3826]New Java features: Simplified Design Patterns[LIT3826]
New Java features: Simplified Design Patterns[LIT3826]Miro Wengner
 
Plug Hardware and Play Java
Plug Hardware and Play JavaPlug Hardware and Play Java
Plug Hardware and Play JavaMiro Wengner
 
From Concept to Robotic Overlord with Robo4J
From Concept to Robotic Overlord with Robo4J From Concept to Robotic Overlord with Robo4J
From Concept to Robotic Overlord with Robo4J Miro Wengner
 
JavaOne 2016 :: Bringing Robot online with Robo4j Framework
JavaOne 2016 :: Bringing Robot online with Robo4j FrameworkJavaOne 2016 :: Bringing Robot online with Robo4j Framework
JavaOne 2016 :: Bringing Robot online with Robo4j FrameworkMiro Wengner
 
JavaOne presentation - building steps :: Number42 is alive
JavaOne presentation - building steps :: Number42 is alive JavaOne presentation - building steps :: Number42 is alive
JavaOne presentation - building steps :: Number42 is alive Miro Wengner
 
The Robot under dictate of the LegoMindStorm Java Concurrency API
The Robot under dictate of the LegoMindStorm Java Concurrency APIThe Robot under dictate of the LegoMindStorm Java Concurrency API
The Robot under dictate of the LegoMindStorm Java Concurrency APIMiro Wengner
 
How RaspberryPi workers building GraphDatabase
How RaspberryPi workers building GraphDatabaseHow RaspberryPi workers building GraphDatabase
How RaspberryPi workers building GraphDatabaseMiro Wengner
 

More from Miro Wengner (9)

Boost delivery stream with code discipline engineering
Boost delivery stream with code discipline engineeringBoost delivery stream with code discipline engineering
Boost delivery stream with code discipline engineering
 
[meetup] Mastering Java enhancements like a Pro: practical design patterns an...
[meetup] Mastering Java enhancements like a Pro: practical design patterns an...[meetup] Mastering Java enhancements like a Pro: practical design patterns an...
[meetup] Mastering Java enhancements like a Pro: practical design patterns an...
 
New Java features: Simplified Design Patterns[LIT3826]
New Java features: Simplified Design Patterns[LIT3826]New Java features: Simplified Design Patterns[LIT3826]
New Java features: Simplified Design Patterns[LIT3826]
 
Plug Hardware and Play Java
Plug Hardware and Play JavaPlug Hardware and Play Java
Plug Hardware and Play Java
 
From Concept to Robotic Overlord with Robo4J
From Concept to Robotic Overlord with Robo4J From Concept to Robotic Overlord with Robo4J
From Concept to Robotic Overlord with Robo4J
 
JavaOne 2016 :: Bringing Robot online with Robo4j Framework
JavaOne 2016 :: Bringing Robot online with Robo4j FrameworkJavaOne 2016 :: Bringing Robot online with Robo4j Framework
JavaOne 2016 :: Bringing Robot online with Robo4j Framework
 
JavaOne presentation - building steps :: Number42 is alive
JavaOne presentation - building steps :: Number42 is alive JavaOne presentation - building steps :: Number42 is alive
JavaOne presentation - building steps :: Number42 is alive
 
The Robot under dictate of the LegoMindStorm Java Concurrency API
The Robot under dictate of the LegoMindStorm Java Concurrency APIThe Robot under dictate of the LegoMindStorm Java Concurrency API
The Robot under dictate of the LegoMindStorm Java Concurrency API
 
How RaspberryPi workers building GraphDatabase
How RaspberryPi workers building GraphDatabaseHow RaspberryPi workers building GraphDatabase
How RaspberryPi workers building GraphDatabase
 

Recently uploaded

H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo DayH2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo DaySri Ambati
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 

Recently uploaded (20)

H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo DayH2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 

DevDays: Profiling With Java Flight Recorder

  • 2. Safe Harbour Statement All what you will hear can be di ff erent, this presentation is for motivational purposes …
  • 3. Miroslav Wengner • Husband, Father, Software Engineer, Technology Enthusiast • JCP: Executive Committee Board Member • OpenJDK Committer , Java Mission Control Project, Open-Source • Co-Author of Robo4J Project (Duke Award) • Java Champion, JavaOne RockStar, Blogger • Principal Engineer at OpenValue
  • 4. • Group Of Talented and Motivated Individuals • Netherlands, Germany, Switzerland, Austria… • Fun, Development, Trainings, Migration and more…
  • 6. Agenda • History in nutshell • JMC and Flight Recorder in bullet points • JFR under the hood • JFR in Action and Examples • Power of Data Visualisation • What about JDK improvements and upcoming features? • Q/A
  • 7. History in nutshell • 1998 Appeal Virtual Machines (AVM) - JRockit JVM • 2002 AVM acquired by BEA • 2008 acquired by Oracle • 2012 JDK 7u4 update: Oracle integrated JFR into the HotSpot • 2017 JDK 9 : Public APIs for creating and consuming data • 2018 JDK 11: JMC/JFR announced to be fully Open-Sourced
  • 8. JFR in bullets • Part of Java Mission Control project • Java Flight Recorder is an event based tracing framework • Build directly into the Java Virtual Machine • Provides access to all internal events • Allows to create custom events • Tries to achieve a goal 1% overhead
  • 9. JFR meets Java Platform • Compiled to byte-code • Usage of JIT Compiler • Byte code optimisation • module, package: jdk.jfr
  • 10. Profiling with JFR • Observability allows to measure a system based on provided data metrics (local, on-prem or cloud) • each application may have di ff erent telemetry, di ff erent assumptions • hardware, container, end-points, libraries…. • Monitoring -> keeping yes on sampled data • Pro fi ling -> recording and analysing “real” data https://www.hippopx.com/en/camera-security-monitoring-big-brother-control-surveillance-camera-video-surveillance-81117
  • 11. Common Usage of JFR • Micros-Services, Distributes and Stand-Alone applications • helps in root-cause analysis • application understanding, bottlenecks • solution correctes • testing • monitoring Let’s split More Pods there…
  • 12. Java Mission Control Project Current release 8.3 Release Milestone Date ========== =========== ========== 8.2.0 GA 2022-01-19 8.2.1 GA 2022-06-16 8.3 EA 2022-10-11 8.1 : New Allocation Events for JDK 16, • JMC Agent, JMC Agent Plugin • Performance Improvements : Perser, Rules 8.2: Minor release • JFR: Heat-Map View, WebSocket-API 8.3: Minor release • JMC Core: Parser improvements • JFR: Dependency view, Graph Pruning, JFR: Selectable attributes, • Agent: bug fi xing
  • 13. Java Mission Control Project Current release 8.3 Dependency View Graph pruning View Flameview Selectable Attributes
  • 14. Java Flight Recorder under the hood Java Event API JVM Events Thread Local Buffers Events Global Bu ff ers Repository per 1s JFR Event Streaming (JEP 349): Continual Monitoring
  • 15. JFR under the hood: Event - fundamental element • Import “jdk.jfr.Event” • Basic Element that caries valuable information EventID: Timestamp : when event was taken Duration: not always Thread ID: Thread where event has occurred StackTrace ID: It’s optional referst to the StackTrace, default depth 64 Payload: custom information
  • 16. Import jdk.jfr.Event; public class SampleEvent extends Event { //internal logic String message; } … void someAdvanceLogic() { SampleEvent e = new SampleEvent(); e.message = “Important Information”; e.begin(); // advanced logic e.end(); e.commit(); } … JFR under the hood: Event
  • 17. JFR under the hood: : Tuning up an Event Annotations: https://docs.oracle.com/en/java/javase/19/docs/api/jdk.jfr/jdk/jfr/class-use/MetadataDe fi nition.html Annotation Description Default @Name Automatically Set, Recommended pattern: org.com… Event Full path with Name: openvalue.SampleEvent @Label Short descriptive information @Category Category is present to the user @Threshold Default min duration fo the event to be included in the recording 0ns @StackTrace Include a stack-trace to the event TRUE @Enabled Is Event enabled by default con fi guration
  • 18. JFR under the hood: : Tuning up an Event import jdk.jfr.Event import jdk.jfr.Label import jdk.jdf.Name @Name(“com.openvalue.events.SampleEvent”) @Label(“Sample Event”) class SampleEvent extends Event { @Label(“Message”) String name; @Label(“Value”) int value; } Annotations: https://docs.oracle.com/en/java/javase/19/docs/api/jdk.jfr/jdk/jfr/class-use/MetadataDe fi nition.html
  • 19. JFR under the hood: Performance • Usage of Thread Local Bu ff ers • Java Platform Optimisation • Methods: INLINING, CODE ELIMINATION, SCALARIZATION • What happens when event is enabled / disabled -XX:StartFlightRecording=filename=<RECORDING_FILE>.jfr,dumponexit=true,settings=profile
  • 20. void someAdvanceLogic() { SampleEvent e = new SampleEvent(); e.message = “Important Information”; e.begin(); // advanced logic e.commit(); } void commit() { // IF it’s not enabled -> NOT INTERESTING if(isEnabled()){ //now() reads CPU clock register, cheap check long duration = now() - startTime; if(duration > THRESHOLD) { if (shouldCommit()) { // Cheap - Thread local writes actuallyCommit(); } } } Mikeal Vidstedt presented quite neat pseudo-code that helps to understand to the commit() JFR under the hood: Event in Action
  • 21. void someAdvanceLogic(){ // allocating event SampleEvent e = new SampleEvent(); e.begin(); -> INLINING => e.startTime = now(); -> e.startTime = <JVM intrinsic> // advanced logic // timestamp, likewise INLINING, implicit end() e.commit(); // JFR ENABLED STATE if(e.isEnabled()){ // perform additional checks and maybe actuallyCommit() } } JFR under the hood: Enabled
  • 22. JFR under the hood: Disabled - part 1 void someAdvanceLogic() { SampleEvent e = new SampleEvent(); // INLINING from the previous slide e.startTime = <JVM intrinsic>; // advanced logic //INLINING if(false) { // result e.isEnabled() //perform additional checks //CODE ELIMINATION -> will be removed } }
  • 23. JFR under the hood: Disabled - part 2 void someAdvanceLogic() { SampleEvent e = new SampleEvent(); // SCALARIZATION -> REMOVAL e.begin() 1. initial state: e.begin(); 2. INLINING => e.startTime = <JVM intrinsic>; 3. INLINING => long startTime = <JVM intrisic>; 4. CODE ELIMINATION => long startTime = <JVM intrisic>; REMOVAL //business logic }
  • 24. JFR under the hood: Disabled - part 3 void someAdvanceLogic() { //business logic }
  • 25. JFR: Start Recording # Starting a recording $ java -XX:StartFlightRecording … # Starting Recording and Storing into the file $ java -XX:StartFlightRecording=filename=<FILE_NAME>.jfr # Starting Recording and dump on exit $ java -XX:StartFlightRecording=filename=<FILE_NAME>.jfr,dumponexit-true,settings=profile # Using jcmd command via PID to start recording $ jcmd <PID> JFR.start duration=30s filename=hotmethods_jcmd.jfr
  • 26. JFR: Data Visualisation • Command line tool avaliable from JDK 11 => jfr $jfr summary <JFR_file> $jfr print —json <JFR_FILE> • JFR GUI. (DEMO) • Automated analysis • Java Application => Thread, Memory, etc. • Event Browser
  • 30. DEMO: Java Platform Module Latency var threadPerTaskExecutor = Executors.newThreadPerTaskExecutor(threadFactory); var executor = Executors.newVirtualThreadPerTaskExecutor(); threadPerTaskExecutor.execute(() -> { while (active.get()){ executor.submit(new ComputableTask(counter)); } }) •
  • 31. JFR: How to Get • Clone: https://github.com/openjdk/jmc. => script build.sh • AdoptOpenJDK: http://adoptopenjdk.net/jmc • Azul: https://www.azul.com/products/zulu-mission-control • RedHat: distributes as RPMs in Fedora and RHEL • Oracle: https://www.oracle.com/java/technologies/jdk-mission-control.html JMC-JVM-LANG Tutorial: https://github.com/mirage22/jmc-jvm-lang-tutorial JFR-Tutorial: https://github.com/thegreystone/jmc-tutorial
  • 32. Q / A Thank YOU ! twitter: @miragemiko gitlab:@mirage22 DEMOS: https://github.com/mirage22/jmc-jvm-lang-tutorial
  • 33. References: • Project Amber: https://openjdk.org/projects/amber/ • Project Loom: https://openjdk.org/projects/loom/ • JFR Project: https://github.com/openjdk/jmc • OpenJDK: https://openjdk.org/ • JEP-349 JFR Event Steaming: https://openjdk.org/jeps/349 • foojay.io: https://foojay.io/today/author/miro-wengner/ • OpenValue Blog: https://openvalue.blog/ Book In Progress: Practical Design Patterns for Java Developers [PACKT]