RFR: 8149330: Capacity of StringBuilder should not get close to Integer.MAX_VALUE unless necessary

Ivan Gerasimov ivan.gerasimov at oracle.com
Mon Feb 22 23:40:55 UTC 2016



On 22.02.2016 23:43, Vitaly Davidovich wrote:
> 165 final int SAFE_BOUND = (MAX_ARRAY_SIZE >> coder);
> 166 if (((SAFE_BOUND - newCapacity) | newCapacity) < 0) {
> Do the hotspot compiler engineers know you guys are doing manual 
> branch elimination like this? :)
>
>
Well, both these checks will be performed in the common case (and we 
know it in advance), so combining them together seems to be worthwhile.

Sincerely yours,
Ivan

> On Mon, Feb 22, 2016 at 2:20 PM, Ivan Gerasimov 
> <ivan.gerasimov at oracle.com <mailto:ivan.gerasimov at oracle.com>> wrote:
>
>     Hello!
>
>     When the capacity of a StringBuilder needs to be increased (either
>     due to append() or due to explicit call to ensureCapacity()), the
>     new capacity is calculated as "twice the old capacity, plus 2",
>     rounded down to Integer.MAX_VALUE:
>     http://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html#ensureCapacity-int-
>     Because of that, StringBuilder throws OOM early, even though there
>     may be room to grow.
>
>     The proposed solution is to reserve a few bytes at the top of the
>     range and only try to allocate them if absolutely required.
>
>     The regression test is @ignored by default, as it is too greedy
>     for memory.
>
>     Would you please help review the fix?
>
>     BUGURL: https://bugs.openjdk.java.net/browse/JDK-8149330
>     WEBREV: http://cr.openjdk.java.net/~igerasim/8149330/00/webrev/
>     <http://cr.openjdk.java.net/%7Eigerasim/8149330/00/webrev/>
>
>     Sincerely yours,
>     Ivan
>
>




More information about the core-libs-dev mailing list