Crate implements lightweight memory profiler which allows object traversal and size introspection.
An object implementing
Allocative trait is introspectable, and this crate
provides two utilities to work with such objects:
FlameGraphBuilderto build a flame graph of object tree
size_of_unique_allocated_dataprovides estimation of how much allocated memory the value holds
When allocative is used, binary size is slightly increased due to implementations
Allocative trait, but it has no runtime/memory overhead when it is not used.
Allocative is not a substitute for call stack malloc profiler, it provides a different view on memory usage.
Here are some differences between allocative and call-stack malloc profiler:
- Allocative requires implementation of
Allocativetrait for each type which needs to be measured, and some setup in the program to enable it
- Allocative flamegraph shows object by object tree, not by call stack
- Allocative shows gaps in allocated memory, e.g. spare capacity of collections or too large padding in structs or enums
- Allocative allows profiling non-malloc allocations (for example, allocations within bumpalo)
- Allocative allows profiling of memory for subset of the process data (for example, measure the size of RPC response before serialization)
- Node in flamegraph tree.
- Build a flamegraph from given root objects.
- Hashed string, which is a key while descending into a tree (e.g. type name or field name).
- This trait allows traversal of object graph.
- Register global root which can be later traversed by profiler.
- Size of a piece of data and data allocated in unique pointers in the struct.
- Size of data allocated in unique pointers in the struct.