Flame graphs
Cloud Profiler displays profiling data by usingFlame Graphs. Unlike trees and graphs,flame graphs make efficient use of screen space by representing a large amountof information in a compact and readable format.
To introduce flame graphs, this page illustrates how to convert a treeinto a flame graph and summarizes key features of flame graphs.
Creating a flame graph
To create a flame graph from a tree, complete the steps illustrated in thefollowing diagram:

Remove from the tree the arrows that indicate function calls.
Replace each tree node with aframe.
Frames are rectangular in shape and all frames have the same height.For the example on this page, the total CPU time used by the function namedin the frame determines the frame width.
Key Point:In profiling, a functions'total CPU time is the CPU time used by the functionincluding the CPU time used by all functions it calls. A function'sself CPU time is the CPU time used by afunction excluding the CPU time used by the functions it calls.The pseudo code for each of the functions is described in the followingtable. The CPU intensive work performed during a function's executiondefines the self CPU time:
Function pseudo code self CPU time
(seconds)total CPU time
(seconds)func main(): foo1() foo2() // CPU intensive work // for 2 seconds2 4 + 3 + 2 = 9 func foo1(): bar() // CPU intensive work // for 1.5 seconds1.5 2.5 + 1.5 = 4 func foo2(): bar() // CPU intensive work // for 0.5 seconds0.5 2.5 + 0.5 = 3 func bar(): // CPU intensive work // for 2.5 seconds2.5 2.5 The next step is to remove thevertical space between the framesand left align frames while preserving call sequences.Optionally, you can define a color scheme and color the frames accordingto the definition. For example, you can color frames by their package,by total CPU time, by self CPU time, or by a different measure.
After removing excess whitespace and coloring frames by the selfCPU time, the flame graph now appears as follows:

Notice that the call stacks for
foo1andfoo2have been preserved, even though the call stack starting withfoo2isnow next to the frame forfoo1.
Summary
This simple example illustrates the following:
- Flame graphs are a compact representation of a tree and you can recreatea call stack by tracing frames from the top downwards.
- Frames name a function and the frame width is the relative measureof that function's total CPU time.In this example, because the total CPU time of
foo2is one third of thetotal CPU time ofmain, the frame forfoo2is one third the width of theframe formain. - The width of the empty space below a frame is the relative measure ofthe self CPU time for the function named in the frame.For example, below the frame
foo1, 1.5 units are empty and 2.5 unitsare occupied bybar. Therefore the self CPU time offoo1is37.5% of its total CPU time, or 1.5 s. As you follow a call stack, the widths of the frames decrease because thetotal CPU time of a callee can never be more than the total CPU timeof the caller. This behavior is what causes the flame shape.
In the example,
foo1callsbarand the total CPU time offoo1is defined to be the total CPU time ofbarplus the self CPU time offoo1. Therefore, the total CPU time ofbarcannot be more than thetotal CPU time offoo1.
What's next
- Select the profiles to analyze
- Interact with the flame graph
- Filter the flame graph
- Focus the flame graph
- Compare profiles
Except as otherwise noted, the content of this page is licensed under theCreative Commons Attribution 4.0 License, and code samples are licensed under theApache 2.0 License. For details, see theGoogle Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.
Last updated 2026-02-19 UTC.