The total amount of live memory in Hummingbird was fixed at about 217 MB. Note that many memory allocation events in the trace have no corresponding deallocation events. These events correspond to the allocation of memory objects that stayed in memory when the run ended.
Figure 1 depicts the distribution of Hummingbird's object sizes
against their frequency.
The left portion of the graph, which corresponds to objects less than 128
bytes in size, indicates that there
is a large number of
fixed-sized objects holding meta-data,
and these objects are only of a few fixed sizes.
The graph also shows that there is a large number of object sizes
longer than 128 bytes.
These are the variable-sized objects holding the file data.
There are no object sizes which are especially
common, except for 32 KB, which is the cluster size.
A unique feature of the graph is that the distribution of objects larger
than 128 bytes is represented by almost a straight line on the
scale.
This feature suggests that the distribution of the variable-sized
objects is Zipfian [10].
In a Zipf distribution,
the frequency of occurrences of an event is inversely proportional to its
rank using the formula
, where
is close to unity.
In other words,
the relative frequency of the most common event is 1, since its rank is also 1.
The relative frequency of the
th most common event is
, since its rank is
.
Table 1 shows the most common Hummingbird object sizes, their relative frequency, and the fraction of the memory allocated to objects of this size. The ``total size allocated'' column is the total amount of memory allocated for objects of this size (or size range) during the entire run. Note that more than half of the total allocated memory was for objects of size 32 KB, which is the Hummingbird cluster size. Since most disk accesses (reads and writes) are to full clusters, objects containing clusters are created and deleted frequently.
Figures 2 and 3 depict the lifetime of objects. The object lifetime is presented in two metrics: the average amount of new dynamic memory allocated during the lifetime of the object (Figure 2), and the average number of new dynamic memory objects allocated during the lifetime of the object (Figure 3). Both figures show that objects larger than 128 bytes and less than 32 KB are very long-lived, that is, an absence of locality in the patterns of sizes of deallocations and requests for new chunks of memory.
![]() |
From the above discussion, we can observe that Hummingbird's
dynamic memory activity is
very different from the kind of activity that memory allocators are designed and
optimized for.
Most studies conclude that there are a small number of distinct dynamic
object sizes in real programs.
Johnstone and Wilson [2] say
that of the objects are of just 141 sizes!
However, Hummingbird allocates
a very large number of object sizes (more than 18000).
Many mallocs assume that there is a strong temporal correlation between
allocation and deallocation sizes. In other words, an allocation is likely
to specify the memory size of a recently deallocated object.
However, Hummingbird's dynamic memory activity has
little correlation between the recently freed objects and new allocation
requests.