Hi All,

Native memory allocation for DBBs is tracked in java.nio.Bits, but that 
only includes what the user thinks they are allocating. 

When the VM adds extra memory to the allocation amount this extra bit is 
not represented in the Bits total. A cursory glance 
shows, minimum, that we round the requested memory quantity up to the heap 
word size in the Unsafe.allocateMemory code, and 
something to do with nmt_header_size in os:malloc() (os.cpp) too.

On its own, and in small quantities, align_up(sz, HeapWordSize) isn't that 
big of an issue. But when you allocate a lot of DBBs,
and coupled with the nmt_header_size business, it makes the Bits values 
wrong. The more DBB allocations, the more inaccurate those 
numbers will be.

To get the "+X", it seems to me that the best option would be to introduce 
an native method in Bits that fetches "X" directly 
from Hotspot, using the same code that Hotspot uses (so we'd have to 
abstract-out the Hotspot logic that adds X to the memory 
quantity). This way, anyone modifying the Hotspot logic won't risk 
rendering the Bits logic wrong again.

That's only one way to fix the accuracy problem here though. Suggestions 
welcome.

Best Regards
 
Adam Farley
Unless stated otherwise above:
IBM United Kingdom Limited - Registered in England and Wales with number 
741598. 
Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6 3AU

Reply via email to