RFR: [6904367]: (coll) IdentityHashMap is resized before exceeding the expected maximum size
Ivan Gerasimov
ivan.gerasimov at oracle.com
Thu Jul 3 18:29:31 UTC 2014
Thanks Martin!
On 03.07.2014 21:12, Martin Buchholz wrote:
> Martin's law of expanding capacity:
>
> Always grow by using the form
>
> newCapacity = oldCapacity + oldCapacity >> n
>
> for some suitable constant n. This will be efficient and more
> overflow resistant than the alternative
>
> newCapacity = oldCapacity * (2**n + 1) / (2**n)
>
> Here n == 1.
>
More precisely here n == 0, because the capacity gets doubled when
increased.
The formula cap = expSize * 3 / 2 is used to estimate the capacity based
on the expected number of the items to be inserted.
Sincerely yours,
Ivan
>
> On Thu, Jul 3, 2014 at 9:00 AM, Ivan Gerasimov
> <ivan.gerasimov at oracle.com <mailto:ivan.gerasimov at oracle.com>> wrote:
>
> Hello!
>
> IdentityHasMap has a couple of small issues.
> The first one is a performance issue: If you create a map,
> specifying 42 as the expected number of element, you'll be able to
> insert only 41 elements into the preallocated table. Inserting the
> 42th element will trigger resizing of the storage.
>
> Another issue is that resizing occurs only after the element
> insertion.
> In the extreme case it can lead to the situation when the element
> is successfully inserted and then en exception is thrown due the
> map been unable to grow.
>
> Would you please help review the fix?
>
> BUGURL: https://bugs.openjdk.java.net/browse/JDK-6904367
> WEBREV: http://cr.openjdk.java.net/~igerasim/6904367/0/webrev/
> <http://cr.openjdk.java.net/%7Eigerasim/6904367/0/webrev/>
>
> Sincerely yours,
> Ivan
>
>
More information about the core-libs-dev
mailing list