Hi Daniel,

CSR's get few reviewers than PR's.

A broader review in the PR can improve the prose and get comments on additional use cases. For myself, I do them in parallel, putting the initial CSR in proposed state to get early feedback from the CSR review. Comments on the PR accumulate and are addressed in the PR and when that settles down, update the PR and finalize.

In the CSR, the Compatibility Risk description highlights a typical more serious risk, that of superseding an existing method in an implementation and possibly changing or being in conflict with its semantics. As a protected method, its potential to be in conflict with existing implementations is reduced somewhat.

The diff in the CSR should focus on the specification change, not the implementation changes unless they affect visible behavior. (Generally, avoid irrelevant information in the CSR).

BTW, P4 is a better priority for this useful addition, P5 is pretty much ignored or trivial and not worth it.

Thanks for the followup, Roger


On 1/7/26 4:07 PM, Daniel Gredler wrote:
Hi Roger,

I've created the CSR here: https://bugs.openjdk.org/browse/JDK-8374739

Alan also provided some feedback on the original issue here: https://bugs.openjdk.org/browse/JDK-8374610

I was going to wait to create the PR until the CSR has been approved, if that's OK?

Take care,

Daniel


On Tue, Jan 6, 2026 at 9:05 PM Daniel Gredler <[email protected]> wrote:

    > It would risky to change the implementation of
    BAOS.ensureCapacity to not throw OOME on negative minCapacity.

    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`).

    Take care,

    Daniel


    On Tue, Jan 6, 2026 at 8:53 PM Roger Riggs
    <[email protected]> wrote:

        Hi Daniel,

        I stand corrected, any current size (>=0) satisfies the
        request (zero is greater than -1).

        I would not say it "ignores" it, just that it already is
        greater or equal to the request.
        The current phrasing of ByteArrayOutputStream.ensureCapacity
        uses the "holds at least" phrasing.
        It would risky to change the implementation of
        BAOS.ensureCapacity to not throw OOME on negative minCapacity.

        Roger


        On 1/6/26 1:30 PM, Daniel Gredler wrote:
        Hi Roger,

        All points noted, thanks -- just wanted to double check on this:

        > I don't think you could call it `ensureCapacity()` if it
        ignores the request.

        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.

        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.

        Let me know your thoughts on this final point, and I'll move
        forward with both the CSR and the PR.

        Thanks!

        Daniel



        On Tue, Jan 6, 2026 at 3:54 PM Roger Riggs
        <[email protected]> wrote:

            Hi Daniel,

            I don't think you could call it `ensureCapacity()` if it
            ignores the request.

            The limit is not specified, different VMs have different
            overheads.

            The exception and message are appropriate:
            "java.lang.OutOfMemoryError: Requested array size exceeds
            VM limit "

            For negative arguments, an IllegalArgumentException might
            be an improvement in usability for developers.

            [2] 8258565 is closed as "will not fix" because the
            memory limits are an implementation parameter, not specified.

            Thanks, Roger

            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.


            On 1/6/26 9:01 AM, Daniel Gredler wrote:
            Hi Roger,

            Thanks for the feedback, I've created an issue in JBS
            [1] and will create the PR in the coming days.

            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?

            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`.

            Take care,

            Daniel

            [1] https://bugs.openjdk.org/browse/JDK-8374610
            [2] https://bugs.openjdk.org/browse/JDK-8258565



            On Mon, Jan 5, 2026 at 3:54 PM Roger Riggs
            <[email protected]> wrote:

                Hi Daniel,

                That seems reasonable, allowing control over the
                timing of resizes.
                Making it public is sensible too.

                 From a higher point of view, are you sure you want
                to be working with
                ByteArrayOutputStream and not ByteBuffer or Memory
                Segments? There are
                more performance possibilities with those APIs.

                Regards, Roger


                On 1/5/26 7:15 AM, Daniel Gredler wrote:
                > Hi,
                >
                > I was recently looking at subclassing
                `ByteArrayOutputStream` in an
                > application so that I could add a fast
                VarHandle-based
                > `writeLong(long)` method (writing 8 bytes to the
                byte array in one
                > go). The internal `ByteArrayOutputStream` buffer
                is protected, so no
                > issue there, but `ensureCapacity(int)` is private
                rather than
                > protected, and uses the internal `ArraysSupport`
                class, so it's not
                > even easy to copy/paste as duplicate code in the
                subclass. Similar
                > `ensureCapacity` methods in `ArrayList` and
                `StringBuilder` are
                > public. Would a PR adjusting the visibility of
                this method from
                > private to protected be accepted?
                >
                > Take care,
                >
                > Daniel
                >
                >



Reply via email to