  Memory bloat is an important source of inefficiency in complex production
software, especially in software written in managed languages such as Java.
Prior approaches to this problem have focused on identifying objects that
outlive their life span. Few studies have, however, looked into whether and to
what extent myriad objects of the same type are identical. A quantitative
assessment of identical objects with code-level attribution can assist
developers in refactoring code to eliminate object bloat, and favor reuse of
existing object(s). The result is reduced memory pressure, reduced allocation
and garbage collection, enhanced data locality, and reduced re-computation, all
of which result in superior performance.
  We develop OJXPerf, a lightweight sampling-based profiler, which
probabilistically identifies identical objects. OJXPerf employs hardware
performance monitoring units (PMU) in conjunction with hardware debug registers
to sample and compare field values of different objects of the same type
allocated at the same calling context but potentially accessed at different
program points. The result is a lightweight measurement, a combination of
object allocation contexts and usage contexts ordered by duplication frequency.
This class of duplicated objects is relatively easier to optimize. OJXPerf
incurs 9% runtime and 6% memory overheads on average. We empirically show the
benefit of OJXPerf by using its profiles to instruct us to optimize a number of
Java programs, including well-known benchmarks and real-world applications. The
results show a noticeable reduction in memory usage (up to 11%) and a
significant speedup (up to 25%).
