  Just-in-time (JIT) compilation coupled with code caching are widely used to
improve performance in dynamic programming language implementations. These code
caches, along with the associated profiling data for the hot code, however,
consume significant amounts of memory. Furthermore, they incur extra JIT
compilation time for their creation. On Android, the current standard JIT
compiler and its code caches are not shared among processes---that is, the
runtime system maintains a private code cache, and its associated data, for
each runtime process. However, applications running on the same platform tend
to share multiple libraries in common. Sharing cached code across multiple
applications and multiple processes can lead to a reduction in memory use. It
can directly reduce compile time. It can also reduce the cumulative amount of
time spent interpreting code. All three of these effects can improve actual
runtime performance.
  In this paper, we describe ShareJIT, a global code cache for JITs that can
share code across multiple applications and multiple processes. We implemented
ShareJIT in the context of the Android Runtime (ART), a widely used,
state-of-the-art system. To increase sharing, our implementation constrains the
amount of context that the JIT compiler can use to optimize the code. This
exposes a fundamental tradeoff: increased specialization to a single process'
context decreases the extent to which the compiled code can be shared. In
ShareJIT, we limit some optimization to increase shareability. To evaluate the
ShareJIT, we tested 8 popular Android apps in a total of 30 experiments.
ShareJIT improved overall performance by 9% on average, while decreasing memory
consumption by 16% on average and JIT compilation time by 37% on average.
