RFR: 8332139: SymbolTableHash::Node allocations allocates twice the required memory

Axel Boldt-Christmas aboldtch at openjdk.org
Wed Jun 5 08:21:59 UTC 2024


On Tue, 4 Jun 2024 15:05:46 GMT, Johan Sjölen <jsjolen at openjdk.org> wrote:

>> The symbols are inline and allocated together with the ConcurrentHashTable (CHT) Nodes. The calculation used for the required size is `alloc_size = size + value.byte_size() + value.effective_length();`
>> 
>> Where
>>   * `size == sizeof(SymbolTableHash::Node) == sizeof(void*) + sizeof(Symbol)`
>>   * `value.byte_size() == dynamic_sizeof(Symbol) == sizeof(Symbol) + <bytes beyond object>`
>>   * `value.effective_length() == dynamic_sizeof(Symbol) - sizeof(Symbol) == <bytes beyond object>`
>> 
>> So `alloc_size` ends up being `sizeof(void*) /* node metadata */ + 2 * dynamic_sizeof(Symbol)`
>> 
>> Because using the CHT with dynamically sized (and inlined)  types requires knowing about its implementation details I chose to make the functionality for calculating the the allocation size a property of the CHT. It now queries the CHT for the node allocation size given the dynamic size required for the VALUE. 
>> 
>> The only current (implicit) restriction regarding using  dynamically sized (and inlined) types in CHT is that the _value field C++ object ends where the Node object ends, so there is not padding bytes where the dynamic payload is allocated. (effectively `sizeof(VALUE) % alignof(Node) == 0` as long as there are no non-standard alignment fields in the Node metadata).  I chose to test this as a runtime assert that the _value ends where the Node object ends, instead of a static assert with the alignment as it seemed to more explicitly show the intent of the check. 
>> 
>> Running testing tier1-7
>
> src/hotspot/share/utilities/concurrentHashTable.inline.hpp line 1065:
> 
>> 1063:   assert(value_size >= sizeof(VALUE), "must include the VALUE");
>> 1064:   return sizeof(Node) - sizeof(VALUE) + value_size;
>> 1065: }
> 
> Style, suggestion:
> ```c++
> template <typename CONFIG, MEMFLAGS F>
> inline size_t ConcurrentHashTable<CONFIG, F>::get_dynamic_node_size(size_t value_size) {
> 
> 
> That's 88 characters, well within what we accept.

This choice was not based on line length. But on the fact that this whole file follows the style:
```C++
template <typename CONFIG, MEMFLAGS F>
inline ReturnType ConcurrentHashTable<CONFIG, F>::
  function_name(...)
{
  // Function Body
}


This is the only file in HotSpot which has this style, but it is also consistent throughout the file. I would rather not introduce inconsistent styles. 

Harmonizing CHTs C++ style with the rest of the HotSpot code base is a different RFE.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/19214#discussion_r1627232077


More information about the hotspot-dev mailing list