Demonstrations of ugc.


ugc traces garbage collection events in high-level languages, including Java,
Python, Ruby, and Node. Each GC event is printed with some additional 
information provided by that language's runtime, if available. The duration of
the GC event is also provided.

For example, to trace all garbage collection events in a specific Node process:

# ugc node $(pidof node)
Tracing garbage collections in node process 30012... Ctrl-C to quit.
START    TIME (us) DESCRIPTION                             
1.500    1181.00  GC scavenge
1.505    1704.00  GC scavenge
1.509    1534.00  GC scavenge
1.515    1953.00  GC scavenge
1.519    2155.00  GC scavenge
1.525    2055.00  GC scavenge
1.530    2164.00  GC scavenge
1.536    2170.00  GC scavenge
1.541    2237.00  GC scavenge
1.547    1982.00  GC scavenge
1.551    2333.00  GC scavenge
1.557    2043.00  GC scavenge
1.561    2028.00  GC scavenge
1.573    3650.00  GC scavenge
1.580    4443.00  GC scavenge
1.604    6236.00  GC scavenge
1.615    8324.00  GC scavenge
1.659    11249.00 GC scavenge
1.678    16084.00 GC scavenge
1.747    15250.00 GC scavenge
1.937    191.00   GC incremental mark
2.001    63120.00 GC mark-sweep-compact
3.185    153.00   GC incremental mark
3.207    20847.00 GC mark-sweep-compact
^C

The above output shows some fairly long GCs, notably around 2 seconds in there
is a collection that takes over 60ms (mark-sweep-compact).

Occasionally, it might be useful to filter out collections that are very short,
or display only collections that have a specific description. The -M and -F
switches can be useful for this:

# ugc -F Tenured java $(pidof java)
Tracing garbage collections in java process 29907... Ctrl-C to quit.
START    TIME (us) DESCRIPTION                             
0.360    4309.00  MarkSweepCompact Tenured Gen used=287528->287528 max=173408256->173408256
2.459    4232.00  MarkSweepCompact Tenured Gen used=287528->287528 max=173408256->173408256
4.648    4139.00  MarkSweepCompact Tenured Gen used=287528->287528 max=173408256->173408256
^C

# ugc -M 1 java $(pidof java)
Tracing garbage collections in java process 29907... Ctrl-C to quit.
START    TIME (us) DESCRIPTION                             
0.160    3715.00  MarkSweepCompact Code Cache used=287528->3209472 max=173408256->251658240
0.160    3975.00  MarkSweepCompact Metaspace used=287528->3092104 max=173408256->18446744073709551615
0.160    4058.00  MarkSweepCompact Compressed Class Space used=287528->266840 max=173408256->1073741824
0.160    4110.00  MarkSweepCompact Eden Space used=287528->0 max=173408256->69337088
0.160    4159.00  MarkSweepCompact Survivor Space used=287528->0 max=173408256->8650752
0.160    4207.00  MarkSweepCompact Tenured Gen used=287528->287528 max=173408256->173408256
0.160    4289.00    used=0->0 max=0->0
^C


USAGE message:

# ugc -h
usage: ugc.py [-h] [-v] [-m] [-M MINIMUM] [-F FILTER]
              {java,python,ruby,node} pid

Summarize garbage collection events in high-level languages.

positional arguments:
  {java,python,ruby,node}
                        language to trace
  pid                   process id to attach to

optional arguments:
  -h, --help            show this help message and exit
  -v, --verbose         verbose mode: print the BPF program (for debugging
                        purposes)
  -m, --milliseconds    report times in milliseconds (default is microseconds)
  -M MINIMUM, --minimum MINIMUM
                        display only GCs longer than this many milliseconds
  -F FILTER, --filter FILTER
                        display only GCs whose description contains this text

examples:
    ./ugc java 185           # trace Java GCs in process 185
    ./ugc ruby 1344 -m       # trace Ruby GCs reporting in ms
    ./ugc -M 10 java 185     # trace only Java GCs longer than 10ms
