Skip to content

Memory overhead

Ben Manes edited this page Mar 18, 2015 · 18 revisions

The cache and entry objects only require certain fields depending on the configuration options specified when creating the cache. To minimize memory, code generation is used to avoid retaining unnecessary fields.

Estimates were performed using a Java instrumentation agent to calculate the runtime size. The size is may be affected by compressed references, object padding, etc. applied by the JVM. This benchmark may be run using gradle memoryOverhead which executes MemoryBenchmark.

By forking Java 5's ConcurrentHashMap, Guava has a slight advantage with per-entry optimizations. This is evident when weak and soft reference caching is used. Caffeine must retain additional fields to remove a collected entry due to decorating a Java 8 ConcurrentHashMap.

Pending optimizations

Caffeine uses ring buffers to record reads for replaying in batch against the maximum size and expire after access policies. Presently the buffers are fixed to a size optimal for high concurrency. Instead, the buffers should grow dynamically based upon contention so that footprint is minimized.

Unbounded

Cache Baseline Entry
Caffeine 400 bytes 54 bytes
Guava 1,136 bytes 58 bytes

Maximum Size

Cache Baseline Entry
Caffeine 22,832 bytes 74 bytes
Guava 1,560 bytes 74 bytes

Maximum Size & Expire after Access

Cache Baseline Entry
Caffeine 22,944 bytes 82 bytes
Guava 1,560 bytes 74 bytes

Maximum Size & Expire after Write

Cache Baseline Entry
Caffeine 22,976 bytes 90 bytes
Guava 1,728 bytes 90 bytes

Maximum Size & Refresh after Write

Cache Baseline Entry
Caffeine 22,968 bytes 82 bytes
Guava 27,472 bytes 90 bytes

Maximum Weight

Cache Baseline Entry
Caffeine 22,864 bytes 74 bytes
Guava 1,552 bytes 74 bytes

Expire after Access

Cache Baseline Entry
Caffeine 22,904 bytes 82 bytes
Guava 1,560 bytes 74 bytes

Expire after Write

Cache Baseline Entry
Caffeine 584 bytes 82 bytes
Guava 1,360 bytes 74 bytes

Expire after Access & after Write

Cache Baseline Entry
Caffeine 22,968 bytes 98 bytes
Guava 1,728 bytes 90 bytes

Weak Keys

Cache Baseline Entry
Caffeine 432 bytes 98 bytes
Guava 1,416 bytes 66 bytes

Weak Values

Cache Baseline Entry
Caffeine 432 bytes 98 bytes
Guava 1,416 bytes 74 bytes

Weak Keys & Weak Values

Cache Baseline Entry
Caffeine 488 bytes 130 bytes
Guava 1,512 bytes 82 bytes

Weak Keys & Soft Values

Cache Baseline Entry
Caffeine 488 bytes 138 bytes
Guava 1,584 bytes 90 bytes

Soft Values

Cache Baseline Entry
Caffeine 432 bytes 106 bytes
Guava 1,416 bytes 82 bytes
Clone this wiki locally