  Big Data applications suffer from unpredictable and unacceptably high pause
times due to Garbage Collection (GC). This is the case in latency-sensitive
applications such as on-line credit-card fraud detection, graph-based computing
for analysis on social networks, etc. Such pauses compromise latency
requirements of the whole application stack and result from applications'
aggressive buffering/caching of data, exposing an ill-suited GC design, which
assumes that most objects will die young and does not consider that
applications hold large amounts of middle-lived data in memory.
  To avoid such pauses, we propose NG2C, a new GC algorithm that combines
pretenuring with an N-Generational heap. By being able to allocate objects into
different generations, NG2C is able to group objects with similar lifetime
profiles in the same generation. By allocating objects with similar lifetime
profiles close to each other, i.e. in the same generation, we avoid object
promotion (copying between generations) and heap fragmentation (which leads to
heap compactions) both responsible for most of the duration of HotSpot GC pause
times.
  NG2C is implemented for the OpenJDK 8 HotSpot Java Virtual Machine, as an
extension of the Garbage First GC. We evaluate NG2C using Cassandra, Lucene,
and GraphChi with three different GCs: Garbage First (G1), Concurrent Mark
Sweep (CMS), and NG2C. Results show that NG2C decreases the worst observable GC
pause time by up to 94.8% for Cassandra, 85.0% for Lucene and 96.45% for
GraphChi, when compared to current collectors (G1 and CMS). In addition, NG2C
has no negative impact on application throughput or memory usage.
