On Wed, 9 Mar 2022 07:47:19 GMT, Thomas Stuefe <stu...@openjdk.org> wrote:
>> Ioi Lam has updated the pull request incrementally with one additional >> commit since the last revision: >> >> Fixed zero build > > src/hotspot/share/utilities/hashtable.hpp line 42: > >> 40: >> 41: LP64_ONLY(unsigned int _gap;) >> 42: > > For 64-bit, you now lose packing potential in the theoretical case the > following payload does not have to be aligned to 64 bit. E.g. for T=char, > where the whole entry would fit into 8 bytes. Probably does not matter as > long as entries are allocated individually from C-heap which is a lot more > wasteful anyway. > > For 32-bit, I think you may have the same problem if the payload starts with > a uint64_t. Would that not be aligned to a 64-bit boundary too? Whether or > not you build on 64-bit? > > I think setting the memory, or at least the first 8..16 bytes, of the entry > to zero in BasicHashtable<F>::new_entry could be more robust: > > (16 bytes in case the payload starts with a long double but that may be > overthinking it :) > > > template <MEMFLAGS F> BasicHashtableEntry<F>* > BasicHashtable<F>::new_entry(unsigned int hashValue) { > char* p = :new (NEW_C_HEAP_ARRAY(char, this->entry_size(), F); > ::memset(p, 0, MIN2(this->entry_size(), 16)); // needs reproducable > BasicHashtableEntry<F>* entry = ::new (p) BasicHashtableEntry<F>(hashValue); > return entry; > } > > If you are worried about performance, this may also be controlled by a > template parameter, and then you do it just for the system dictionary. Thanks for pointing this out. I ran more tests and found that on certain platforms, there are other structures that have problems with uninitialized gaps. I ended up changing `os::malloc()` to zero the buffer when running with -Xshare:dump. Hopefully one extra check of `if (DumpSharedSpaces)` doesn't matter too much for regular VM executions because `os::malloc()` already has a high overhead. ------------- PR: https://git.openjdk.java.net/jdk/pull/7748