The fix for 6687581 (Make CMS work with compressed oops) is conditional on 64 bit and UseCompressedOops. A more general solution has been suggested to make free chunks identifiable from oops in 32 bit as well, but shares bits with the CMS implementation of PromotedObject and ClaimedForwardPtr that would have to be resolved.
A partial fix/patch will be attached as the suggested fix (but it doesn't work).
From email:
>> You won't be just looking at that bit. You look for 111 in the low 3 bits and that will be unique to CMS.
> But wont biased locking, is_marked and is_locked() be looking at those bits individually? I don't know, sounds really confusing to share bits with other things even though different pattern. I can't look at it now anyway because my vnc or system seems to have died.
The biased lock pattern is really 101. That what made it clear to me.
biased_lock_pattern = 5
The biased bit isn't really separate from the other two bits. The patterns we use are really:
101 biased
x00 stack locked
001 unlocked
x10 heavy weight locked
x11 marked
In the stack locked case the pointer isn't necessarily double word aligned but in the marked case it is which means that we could make that into 2 states, 011 for marked and 111 for free. The heavy weight locked case is also probably double word aligned but I don't think we care.
It is unlikely we'll be able to fix this in 7, targeting to 8.