Hi Michael,

On 4/16/19 4:19 AM, David Holmes wrote:
Hi Michael,

Re-directing to core-libs-dev and hotspot-gc-dev.

Thanks,
David

On 16/04/2019 12:14 pm, Michael Pollmeier wrote:
Quoting
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ref/SoftReference.html


All soft references to softly-reachable objects are guaranteed to have
been cleared before the virtual machine throws an OutOfMemoryError

That statement was true when soft references were first introduced in
java 1.2, but from java 1.3.1 the jvm property
`-XX:SoftRefLRUPolicyMSPerMB` was introduced.

That statement is still true. When the GC gets into a situation where it is having trouble satisfying an allocation, then SoftRefLRUPolicyMSPerMB will be ignored and all soft references will be cleared, before the GC gives up and throws an OOME.

It defaults to 1000 (milliseconds), meaning that if there’s only 10MB
available heap, the garbage collector will free references that have
been used more than 10s ago. I.e. everything else (including young
softly reachable objects) will *not* be freed, leading to an
OutOfMemoryError, contradicting the above quoted 'guarantee'.

That's also the behaviour I observed on various JREs. Would you agree,
i.e. should I propose an updated doc?

Could you elaborate on what kind of test you did to come to this conclusion? Preferably provide a re-producer. In OOME situations, if a SoftReference isn't cleared, it is typically because you have unknowingly made it strongly reachable.

cheers,
Per

Reply via email to