<div dir="ltr"><div>> It would risky to change the implementation of BAOS.ensureCapacity
to not throw OOME on negative minCapacity.<font color="#888888"><br></font></div><div><br></div><div>Completely agree -- if we wanted the public API contract to match the `ensureCapacity` method behavior elsewhere, we would leave the existing method untouched and private, and add a public version which only delegates to the existing private method if minCapacity > 0 (almost identical to `AbstractStringBuilder`).</div><div><br></div><div>Take care,</div><div><br></div><div>Daniel</div><div><br></div></div><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Tue, Jan 6, 2026 at 8:53 PM Roger Riggs <<a href="mailto:roger.riggs@oracle.com">roger.riggs@oracle.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><u></u>
<div>
Hi Daniel,<br>
<br>
I stand corrected, any current size (>=0) satisfies the request
(zero is greater than -1).<br>
<br>
I would not say it "ignores" it, just that it already is greater or
equal to the request.<br>
The current phrasing of ByteArrayOutputStream.ensureCapacity uses
the "holds at least" phrasing.<br>
It would risky to change the implementation of BAOS.ensureCapacity
to not throw OOME on negative minCapacity.<br>
<br>
Roger<br>
<br>
<br>
<div>On 1/6/26 1:30 PM, Daniel Gredler
wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">
<div>Hi Roger,</div>
<div><br>
</div>
<div>All points noted, thanks -- just wanted to double check on
this:</div>
<div><br>
</div>
<div>> I don't think you could call it `ensureCapacity()` if
it ignores the request.</div>
<div><br>
</div>
<div>If you pass a negative (i.e. invalid) argument, you need to
either throw an exception or ignore the request. Both
`ArrayList` and `StringBuilder` simply ignore calls with
negative arguments (i.e. neither `new
ArrayList().ensureCapacity(-1)` nor `new
StringBuilder().ensureCapacity(-1)` throw an exception, they
just ignore the request). The old `Vector` class does the
same, though few developers will be using it at this stage.</div>
<div><br>
</div>
<div>All of that to say that as a developer, ignoring an
`ensureCapacity()` call with a negative capacity would not
have surprised me in the least, and would be consistent with
the other `ensureCapacity` methods in other core classes.</div>
<div><br>
</div>
<div>Let me know your thoughts on this final point, and I'll
move forward with both the CSR and the PR.</div>
<div><br>
</div>
<div>Thanks!</div>
<div><br>
</div>
<div>Daniel</div>
<div><br>
</div>
<div><br>
</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Tue, Jan 6, 2026 at 3:54 PM
Roger Riggs <<a href="mailto:roger.riggs@oracle.com" target="_blank">roger.riggs@oracle.com</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div> Hi Daniel,<br>
<br>
I don't think you could call it `ensureCapacity()` if it
ignores the request.<br>
<br>
The limit is not specified, different VMs have different
overheads.<br>
<br>
The exception and message are appropriate:
"java.lang.OutOfMemoryError: Requested array size exceeds VM
limit "<br>
<br>
For negative arguments, an IllegalArgumentException might be
an improvement in usability for developers.<br>
<br>
[2] 8258565 is closed as "will not fix" because the memory
limits are an implementation parameter, not specified.<br>
<br>
Thanks, Roger<br>
<br>
p.s. as an API change it will need a CSR. There's a "create
a CSR" menu item on the issue and a template to fill out.<br>
<br>
<br>
<div>On 1/6/26 9:01 AM, Daniel Gredler wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">
<div>Hi Roger,</div>
<div><br>
</div>
<div>Thanks for the feedback, I've created an issue in
JBS [1] and will create the PR in the coming days.</div>
<div><br>
</div>
<div>This method currently throws an OOME if a negative
capacity is requested, but that should never happen
because it's only called internally after careful
parameter validation. Once it's public, users will be
able to request negative capacities directly. For the
public API, I'm leaning towards quietly ignoring calls
with non-positive capacities, a la
`AbstractStringBuilder`, instead of throwing an OOME.
Let me know if you agree?</div>
<div><br>
</div>
<div>Also, do you know what the maximum possible
requested capacity is here? It would be good to avoid
the need for follow-up issues like this one [2] for
`ArrayList`.</div>
<div><br>
</div>
<div>Take care,</div>
<div><br>
</div>
<div>Daniel</div>
<div><br>
</div>
<div>[1] <a href="https://bugs.openjdk.org/browse/JDK-8374610" target="_blank">https://bugs.openjdk.org/browse/JDK-8374610</a></div>
<div>[2] <a href="https://bugs.openjdk.org/browse/JDK-8258565" target="_blank">https://bugs.openjdk.org/browse/JDK-8258565</a></div>
<div><br>
</div>
<div><br>
</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Mon, Jan 5, 2026 at
3:54 PM Roger Riggs <<a href="mailto:roger.riggs@oracle.com" target="_blank">roger.riggs@oracle.com</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi
Daniel,<br>
<br>
That seems reasonable, allowing control over the
timing of resizes.<br>
Making it public is sensible too.<br>
<br>
From a higher point of view, are you sure you want to
be working with <br>
ByteArrayOutputStream and not ByteBuffer or Memory
Segments? There are <br>
more performance possibilities with those APIs.<br>
<br>
Regards, Roger<br>
<br>
<br>
On 1/5/26 7:15 AM, Daniel Gredler wrote:<br>
> Hi,<br>
><br>
> I was recently looking at subclassing
`ByteArrayOutputStream` in an <br>
> application so that I could add a fast
VarHandle-based <br>
> `writeLong(long)` method (writing 8 bytes to the
byte array in one <br>
> go). The internal `ByteArrayOutputStream` buffer
is protected, so no <br>
> issue there, but `ensureCapacity(int)` is private
rather than <br>
> protected, and uses the internal `ArraysSupport`
class, so it's not <br>
> even easy to copy/paste as duplicate code in the
subclass. Similar <br>
> `ensureCapacity` methods in `ArrayList` and
`StringBuilder` are <br>
> public. Would a PR adjusting the visibility of
this method from <br>
> private to protected be accepted?<br>
><br>
> Take care,<br>
><br>
> Daniel<br>
><br>
><br>
<br>
</blockquote>
</div>
</blockquote>
<br>
</div>
</blockquote>
</div>
</blockquote>
<br>
</div>
</blockquote></div>