You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ignite.apache.org by "Aleksey Plekhanov (JIRA)" <ji...@apache.org> on 2019/06/11 11:56:00 UTC
[jira] [Created] (IGNITE-11911) GridToStringBuilder allocates
redundant memory
Aleksey Plekhanov created IGNITE-11911:
------------------------------------------
Summary: GridToStringBuilder allocates redundant memory
Key: IGNITE-11911
URL: https://issues.apache.org/jira/browse/IGNITE-11911
Project: Ignite
Issue Type: Bug
Affects Versions: 2.7
Reporter: Aleksey Plekhanov
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:
{code:java}
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]);
}
}
{code}
Here on the second line about 1 million chars StringBuilder will be allocated, but only about 100 chars needed.
Problem code (SBLimitedLength.java:293):
{code:java}
StringBuilder res = new StringBuilder(impl().capacity() + tailLen + 100);
{code}
Here {{length()}} method can be used instead of {{capacity()}}
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)