RFR [9]8134424: BlockDataInputStream.readUTFBody: examine sizing local StringBuffer with the given length
Chris Hegarty
chris.hegarty at oracle.com
Thu Feb 11 15:45:04 UTC 2016
Ha, such a seemingly innocuous little perf change has generated much noise ;-)
You are of course right.
On 11 Feb 2016, at 15:23, Roger Riggs <Roger.Riggs at oracle.com> wrote:
> Hi Chris,
>
> The change to preallocate the StringBuffer is fine.
>
> But I have misgivings about not consuming the data from the stream and returning the empty string
> for out of range lengths. It will silently leave the input stream in an unusable state.
>
> I think it should throw an exception (StreamCorruptedException would be appropriate)
> if the size is negative or too large.
>
> BTW, a UTF string can be up to three times the length of a Java string due to the encoding.
> So utflen should be allowed to be Integer.MAX_VALUE * 3 (in the absence of some other implementation limitation).
How about this, preserving existing behaviour for non-common cases:
diff --git a/src/java.base/share/classes/java/io/ObjectInputStream.java b/src/java.base/share/classes/java/io/ObjectInputStream.java
--- a/src/java.base/share/classes/java/io/ObjectInputStream.java
+++ b/src/java.base/share/classes/java/io/ObjectInputStream.java
@@ -3144,7 +3144,14 @@
* utflen bytes.
*/
private String readUTFBody(long utflen) throws IOException {
- StringBuilder sbuf = new StringBuilder();
+ StringBuilder sbuf ;
+ if (utflen > 0 && utflen < Integer.MAX_VALUE) {
+ // a reasonable initial capacity based on the UTF length
+ int initialCapacity = Math.min((int)utflen, 16384);
+ sbuf = new StringBuilder(initialCapacity);
+ } else {
+ sbuf = new StringBuilder();
+ }
if (!blkmode) {
end = pos = 0;
}
-Chris.
More information about the core-libs-dev
mailing list