Currently, `OopHandle::release()` is implemented as follows: inline void OopHandle::release(OopStorage* storage) { if (peek() != NULL) { // Clear the OopHandle first NativeAccess<>::oop_store(_obj, (oop)NULL); storage->release(_obj); } }
However, peek() returns NULL not only if the oop* `_obj` is NULL, but also when `_obj` points to a zero oop. In the latter case, the oop* `_obj` will not be released from the corresponding OopStorage and the slot it occupies will remain alive forever. This behavior can be easily triggered with the `LeakTestMinimal.java` test which is attached to the [JBS issue](https://bugs.openjdk.java.net/browse/JDK-8273902)(thanks to Oli Gillespie from the Amazon Profiler team for detecting the issue and providing a reproducer). This fix should probably also be downported to jdk17 as quickly as possible. ------------- Commit messages: - JDK-8273902: Memory leak in OopStorage due to bug in OopHandle::release() Changes: https://git.openjdk.java.net/jdk/pull/5549/files Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=5549&range=00 Issue: https://bugs.openjdk.java.net/browse/JDK-8273902 Stats: 4 lines in 2 files changed: 0 ins; 2 del; 2 mod Patch: https://git.openjdk.java.net/jdk/pull/5549.diff Fetch: git fetch https://git.openjdk.java.net/jdk pull/5549/head:pull/5549 PR: https://git.openjdk.java.net/jdk/pull/5549