| Demonstrations of uobjnew. |
| |
| |
| uobjnew summarizes new object allocation events and prints out statistics on |
| which object type has been allocated frequently, and how many bytes of that |
| type have been allocated. This helps diagnose common allocation paths, which |
| can in turn cause heavy garbage collection. |
| |
| For example, trace Ruby object allocations when running some simple commands |
| in irb (the Ruby REPL): |
| |
| # ./uobjnew -l ruby 27245 |
| Tracing allocations in process 27245 (language: ruby)... Ctrl-C to quit. |
| |
| TYPE # ALLOCS # BYTES |
| NameError 1 0 |
| RubyToken::TkSPACE 1 0 |
| RubyToken::TkSTRING 1 0 |
| String 7 0 |
| RubyToken::TkNL 2 0 |
| RubyToken::TkIDENTIFIER 2 0 |
| array 55 129 |
| string 344 1348 |
| ^C |
| |
| |
| Plain C/C++ allocations (through "malloc") are also supported. We can't report |
| the type being allocated, but we can report the object sizes at least. Also, |
| print only the top 10 rows by number of bytes allocated: |
| |
| # ./uobjnew -S 10 -l c 27245 |
| Tracing allocations in process 27245 (language: c)... Ctrl-C to quit. |
| |
| TYPE # ALLOCS # BYTES |
| block size 64 22 1408 |
| block size 992 2 1984 |
| block size 32 68 2176 |
| block size 48 48 2304 |
| block size 944 4 3776 |
| block size 1104 4 4416 |
| block size 160 32 5120 |
| block size 535 15 8025 |
| block size 128 112 14336 |
| block size 80 569 45520 |
| ^C |
| |
| |
| USAGE message: |
| |
| # ./uobjnew -h |
| usage: uobjnew.py [-h] [-l {java,ruby,c}] [-C TOP_COUNT] [-S TOP_SIZE] [-v] |
| pid [interval] |
| |
| Summarize object allocations in high-level languages. |
| |
| positional arguments: |
| pid process id to attach to |
| interval print every specified number of seconds |
| |
| optional arguments: |
| -h, --help show this help message and exit |
| -l {java,ruby,c}, --language {java,ruby,c} |
| language to trace |
| -C TOP_COUNT, --top-count TOP_COUNT |
| number of most frequently allocated types to print |
| -S TOP_SIZE, --top-size TOP_SIZE |
| number of largest types by allocated bytes to print |
| -v, --verbose verbose mode: print the BPF program (for debugging |
| purposes) |
| |
| examples: |
| ./uobjnew -l java 145 # summarize Java allocations in process 145 |
| ./uobjnew -l c 2020 1 # grab malloc() sizes and print every second |
| ./uobjnew -l ruby 6712 -C 10 # top 10 Ruby types by number of allocations |
| ./uobjnew -l ruby 6712 -S 10 # top 10 Ruby types by total size |