Hey Anthony, Fair point though. Guess it might be just for consistency, with existing behavior. Anyhow your explanation makes sense, let’s hope it’ll be a temporary limitation as we’re seeing Arrays 2.0 on the horizon and most most most probably will offer 64bit array indexes :-)
Chris > On 12. Mar 2017, at 18:31, Anthony Vanelverdinghe > <anthony.vanelverdin...@gmail.com> wrote: > > Hi Chris > > Point well taken, but being unable to create a native thread is definitely a > VirtualMachineError, and personally I don't care whether the JVM throws an > OOME or any other kind of VirtualMachineError in that case. > > My point was that I don't see how being unable to return a result because of > a language limitation (i.e. arrays being indexed by integers, and thus > limited to 2G for byte[]), has anything to do with OutOfMemoryError. I > believe it would be much more logical to throw a recoverable RuntimeException > in this case (e.g. java.lang.ArrayOverflowException, as an analog of > java.nio.BufferOverflowException). > > Anthony > > On 12/03/2017 15:53, Christoph Engelbert wrote: >> Hey Anthony, >> >> The meaning is already overloaded, as "Cannot create native thread" >> is also an OutOfMemoryError and in like 99% of the cases means >> "Linux ran out of filehandles". The chance the OS really couldn't >> allocate a thread for the reason of no main memory available is very >> narrow :) >> >> Chris >> >> Am 3/12/2017 um 3:24 PM schrieb Anthony Vanelverdinghe: >>> Files::readAllBytes is specified to throw an OutOfMemoryError "if >>> an array of the required size cannot be allocated, for example the >>> file is larger that 2G". Now in Java 9, InputStream::readAllBytes >>> does the same. >>> >>> However, this overloads the meaning of OutOfMemoryError: either >>> "the JVM is out of memory" or "the resultant array would require >>> long-based indices". >>> >>> In my opinion, this overloading is problematic, because: >>> - OutOfMemoryError has very clear semantics, and I don't see the >>> link between OOME and the fact that a resultant byte[] would need >>> to be >2G. If I have 5G of free heap space, and try to read a 3G >>> file, I'd expect something like an UnsupportedOperationException, >>> but definitely not an OutOfMemoryError. >>> - the former meaning is an actual Error, whereas the latter is an >>> Exception from which the application can recover. >>> - developers might be tempted to catch the OOME and retry to read >>> the file/input stream in chunks, no matter the cause of the OOME. >>> >>> What was the rationale for using OutOfMemory here? And would it >>> still be possible to change this before Rampdown Phase 2? >>> >>> Kind regards, >>> Anthony >>> >>> >