RFR: 6478546: FileInputStream.read() throws OutOfMemoryError when there is plenty available
Brian Burkhalter
bpb at openjdk.java.net
Thu Apr 14 01:49:33 UTC 2022
On Thu, 14 Apr 2022 01:40:50 GMT, Brian Burkhalter <bpb at openjdk.org> wrote:
> Modify native multi-byte read-write code used by the `java.io` classes to limit the size of the allocated native buffer thereby decreasing off-heap memory footprint and increasing throughput.
Currently for `java.io.FileInputStream.read(byte[],int,int)` and `java.io.FileOutputStream.write(byte[],int,int)`, for example, if the number of bytes respectively to be read or written exceeds 8192, an array of the total length of the read or write is allocated. For large reads or writes this could be significant. It is proposed to limit the maximum allocation size to 1 MB and perform the read or write by looping with this buffer. For reading or writing less than 1 MB, there is no effective change in the implementation.
This change both saves off-heap memory and increases throughput. An allocation of 1 MB is only 0.42% the size of the buffer in the JBS issue, 501 x 501 x 501 x 2 (= 251,503,002), so for this case the memory reduction is drastic. Reading throughput is almost doubled and writing throughput improved by about 50%. As measured on macOS, the throughput of the methods mentioned above before the change was:
Benchmark Mode Cnt Score Error Units
ReadWrite.read thrpt 5 10.108 ± 0.264 ops/s
ReadWrite.write thrpt 5 7.188 ± 0.431 ops/s
and that after is:
Benchmark Mode Cnt Score Error Units
ReadWrite.read thrpt 5 20.112 ± 0.262 ops/s
ReadWrite.write thrpt 5 10.644 ± 4.568 ops/s
-------------
PR: https://git.openjdk.java.net/jdk/pull/8235
More information about the core-libs-dev
mailing list