RFR: 8354954: Typed static memory for late initialization of static class members in Hotspot
Johan Sjölen
jsjolen at openjdk.org
Thu Apr 17 14:50:22 UTC 2025
Hi,
This PR introduces a `StableValue<T>` which is sized and aligned identically to a `T`, with the difference that a `StableValue<T>` needs to be explicitly instantiated.
Dynamic static initalization in C++ leads to unpredictable bugs as there is no defined order in which objects will be initialized, to the degree that 'static initialization fiasco' is a term used. In the code I've worked on in Hotspot we resolve this by having an initialization function, and instead of having static members of `T` we have `T*` instead and use `malloc` in order to gain the memory for the objects.
This is fine, however when working with certain code you may want to allocate before NMT is initialized. This leads to you having to use raw malloc. This is probably something you find out after having used `os::malloc` and already had a strange crash when building your code.
That's why I'd like to have `StableValue<T>`. It let's you avoid the whole `malloc` thing, and we overload `->` to make it behave as if it is actually a `T`. We add in a simple checker in debug mode that checks whether the memory has been initialized before using it.
In the code I've switched two members to be of `StableValue` instead. One is the malloc case above, the second (MemBaseline) is one where I got a bug while developing. The bug occurred because I changed the initializer of `MemBaseline` without knowing that it was dynamic-static-allocated, and the exact change I made caused weird crashes (because of initialization order issues).
This solution is quite practical to me, but I wanted to know what others think.
-------------
Commit messages:
- Remove unused includes
- StableValue::as() is actually needed.
- That's what happens when you make last minute changes
- Rename to StableValue, replace with non-UB definition
- Introduce a StaticArea<T> to avoid unnecessary mallocs.
Changes: https://git.openjdk.org/jdk/pull/24689/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=24689&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8354954
Stats: 87 lines in 5 files changed: 77 ins; 4 del; 6 mod
Patch: https://git.openjdk.org/jdk/pull/24689.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/24689/head:pull/24689
PR: https://git.openjdk.org/jdk/pull/24689
More information about the hotspot-dev
mailing list