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.gerasi...@oracle.com <mailto:ivan.gerasi...@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