Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
2.7
-
None
-
None
Description
A lot of classes in Ignite uses GridToStringBuilder to implement their toString() method. GridToStringBuilder uses thread local buffer to generate string representation. This buffer extended on demand but never shrank. On the final step GridToStringBuilder uses java StringBuilder class to produce output string and uses own buffer size as StringBuilder initial capacity. This leads to unnecessary memory allocation since we only need to allocate memory for meaningful data, but not for all buffer.
Reproducer:
public void testSB() { GridToStringBuilder.toString(C1.class, new C1(1_000_000)); GridToStringBuilder.toString(C1.class, new C1(100)); } public class C1 { private String f; C1(int len) { f = new String(new char[len]); } }
Here on the second line about 1 million chars StringBuilder will be allocated, but only about 100 chars needed.
Problem code (SBLimitedLength.java:293):
StringBuilder res = new StringBuilder(impl().capacity() + tailLen + 100);
Here length() method can be used instead of capacity()
Attachments
Issue Links
- links to