Soft References in Java

I just announced the new Spring 5 modules in REST With Spring:

1. Overview

In this quick article, we’ll be talking about soft references in Java.

We’ll explain what they are, why we need them, and how to create them.

2. What Are Soft References?

A soft reference object (or a softly reachable object) can be cleared by the Garbage Collector in response to a memory demand. A softly reachable object has no strong references pointing to it.

When a Garbage Collector gets called, it starts iterating over all elements in the heap. GC stores reference type objects in a special queue.

After all objects in the heap get checked, GC determines which instances should be removed by removing objects from that queue mentioned above.

These rules vary from one JVM implementation to another, but the documentation states that all soft references to softly-reachable objects are guaranteed to be cleared before a JVM throws an OutOfMemoryError.

Though, no guarantees are placed upon the time when a soft reference gets cleared or the order in which a set of such references to different objects get cleared.

As a rule, JVM implementations choose between cleaning of either recently-created or recently-used references.

Softly reachable objects will remain alive for some time after the last time they are referenced. The default value is a one second of lifetime per free megabyte in the heap. This value can be adjusted using the -XX:SoftRefLRUPolicyMSPerMB flag.

For example, to change the value to 2.5 seconds (2500 milliseconds), we can use:

-XX:SoftRefLRUPolicyMSPerMB=2500

In comparison to weak references, soft references can have longer lifetimes since they continue to exist until extra memory is required.

Therefore, they’re a better choice if we need to hold objects in memory as long as possible.

3. Soft References’ Use Cases

Soft references can be used for implementing memory-sensitive caches where memory management is a very important factor.

As long as the referent of a soft reference is strongly reachable, that is – is actually in use, the reference won’t be cleared.

A cache can, for example, prevent its most recently used entries from being discarded by keeping strong referents to those entries, leaving the remaining entries to be discarded at the discretion of the Garbage Collector.

The second option implies passing a reference to a java.lang.ref.ReferenceQueue as well as a reference to a referent. Reference queues are designed for making us aware of actions performed by the Garbage Collector. It appends a reference object to a reference queue as it decides to remove the referent of this reference.