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 $(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 $(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 $(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] [-l {java,python,ruby,node}] [-v] [-m] [-M MINIMUM] [-F FILTER] pid Summarize garbage collection events in high-level languages. positional arguments: pid process id to attach to optional arguments: -h, --help show this help message and exit -l {java,python,ruby,node}, --language {java,python,ruby,node} language to trace -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 -l java 185 # trace Java GCs in process 185 ./ugc -l ruby 1344 -m # trace Ruby GCs reporting in ms ./ugc -M 10 -l java 185 # trace only Java GCs longer than 10ms