compressed oops and 64-bit header words
Vladimir Kozlov
Vladimir.Kozlov at Sun.COM
Mon May 5 16:15:46 PDT 2008
Coleen is right. In the implementation we are working on
the shift and decode/encode instructions "will" fold into
address expression. So the "only" penalty you will pay is an additional
memory for 64-bit mark words. And on x86 you will win very big even
with this penalty since in 64-bits mode you have more registers
for local values (less stack/memory accesses).
Thanks,
Vladimir
Coleen Phillimore wrote:
>
> Hi,
> It made sense when I first read it but in order to have 32 bit pointers
> in #3, I can't imagine not having to encode and decode them by some heap
> base in order to dereference these pointers, so the only difference
> between #2 and #3 is the shift instruction to get to 32G. We didn't
> believe that the shift causes much of a performance penalty so we didn't
> implement it this way. We would like to measure this at some point
> though, and if it is faster could add this mode fairly easily.
>
> thanks!
> Coleen
>
> Dan Grove wrote:
>> Thanks Colleen and Vladimir-
>>
>> What I'm wondering is whether there could be a third mode:
>>
>> 1. > 32GB - uses uncompressed pointers
>> 2. (something less than 4GB) < Xmx < 32GB - uses compressed pointers
>> (along with 64-bit mark word), 64-bit ABI
>> 3. whole app fits in 4GB - uses 32-bit pointers in heap, but 64-bit ABI.
>>
>> The idea here is that I'd prefer to pay no penalty over 32-bit when my
>> app runs in 64-bit mode and the app fits in 4GB of memory (my reason
>> for this is that I want to support our JNI libraries only in 64-bit
>> mode, and deprecate the 32-bit JNI libraries).
>>
>> Does this make any sense to you?
>>
>> Dan
>>
>> On Mon, May 5, 2008 at 12:20 PM, Coleen Phillimore - Sun Microsystems
>> <Coleen.Phillimore at sun.com> wrote:
>>
>>> Actually, we are using the gap for a field and array length in the code
>>> now, but the code Vladimir showed me makes the allocation code a lot
>>> cleaner
>>> for the instance field case.
>>>
>>> In the array case in 64 bits, compressing the _klass pointer into 32
>>> bits
>>> allows us to move the _length field into the other 32 bits, which
>>> because of
>>> alignment saves 64 bits. There was a 32 bit alignment gap after the
>>> _length
>>> field, if not compressed with the klass pointer.
>>>
>>> The mark word can also contain a forwarding pointer used during GC, so
>>> can't be 32 bits.
>>>
>>> The compression that we use allows for 32G because we shift into the
>>> least
>>> significant bits - the algorithm is (ptr-heap_base)>>3.
>>>
>>> Coleen
>>>
>>>
>>>
>>> Vladimir Kozlov wrote:
>>>
>>>
>>>> Dan,
>>>>
>>>> Only the mark word is 64 bits. The klass pointer is 32-bits but
>>>> in the current implementation the gap after klass is not used.
>>>>
>>>> I am working on to use the gap for a field or array's length.
>>>>
>>>> The mark word may contain a 64-bits tread pointer (for Biased Locking).
>>>>
>>>> Thanks,
>>>> Vladimir
>>>>
>>>> Dan Grove wrote:
>>>>
>>>>
>>>>> Hi-
>>>>>
>>>>> I talked some with the Nikolay Igotti about compressed oops in
>>>>> OpenJDK7. He tells me that the mark word and class pointer remain 64
>>>>> bits when compressed oops are being used. It seems that this leaves a
>>>>> fair amount of the bloat in place when moving from 32->64 bits.
>>>>>
>>>>> I'm interesting in deprecating 32-bit VM's at my employer at some
>>>>> point. Doing this is going to require that 64-bit VM's have as little
>>>>> bloat as possible. Has there been any consideration of making the mark
>>>>> word and class pointer 32 bits in cases where the VM fits within 4GB?
>>>>> It seems like this would be a major win. A second benefit here is that
>>>>> the "add and shift" currently required on dereference of compressed
>>>>> oops could be eliminated in cases where the VM fit inside 4GB.
>>>>>
>>>>> Dan
>>>>>
>>>>>
>
More information about the hotspot-runtime-dev
mailing list