On Thu, 7 Apr 2022 18:28:42 GMT, Roman Kennke <rken...@openjdk.org> wrote:
>> JVMTI heap walking marks objects in order to track which have been visited >> already. In order to do that, it uses bits in the object header. Those are >> the same bits that are also used by some GCs to mark objects (the lowest two >> bits, also used by locking code). Some GCs also use the bits in order to >> indicate 'forwarded' objects, where the upper bits of the header represent >> the forward-pointer. In the case of Shenandoah, it's even more problematic >> because this happens concurrently, even while JVMTI heap walks can >> intercept. So far we carefully worked around that problem, but it becomes >> very problematic in Lilliput, where accesses to the Klass* also requires to >> decode the header, and figure out what bits means what. >> >> In addition to that, marking objects in their header requires that the >> original header gets saved and restored. We only do that for 'interesting' >> headers, that is headers that have a stack-lock, monitor or hash-code. All >> other headers are reset to their default value. This means we are losing >> object's GC age. This is not catastrophic, but nontheless interferes with >> GC. >> >> JFR already has a datastructure called BitSet to support object marking >> without messing with object's headers. We can use that in JVMTI too. >> >> Testing: >> - [x] tier1 >> - [x] tier2 >> - [x] tier3 >> - [x] serviceability/jvmti >> - [x] vmTestbase/nsk/jvmti > > Roman Kennke has updated the pull request incrementally with one additional > commit since the last revision: > > Move JFRBitSet typedef into its own header; Make _bitset a direct member, > not dynamically allocated > > > One open question is which MEMFLAGS to use. mtTracing doesn't seem to be > > > exactly right. Should I templatize BitSet and make JVMTI use > > > mtServiceability and JRF use mtTracing as it did before? > > > > > > Yes, I think templatizing for MEMFLAGS makes sense (concurrentHashTable.hpp > > is too). > > Slapping a template parameter on everything isn't necessarily a good idea. > [...] There is a design principle that one should strive to only impose a template parameter on code that actually needs it. According to that principle, most of the bitset is completely independent of the MEMFLAGS value, and shouldn't be parameterized on it. There's a well-known paper about this: http://www.open-std.org/jtc1/sc22/WG21/docs/papers/2009/n2911.pdf (the so-called SCARY paper). I learned a lot from that paper. ------------- PR: https://git.openjdk.java.net/jdk/pull/7964