ignite-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Aleksey Plekhanov (JIRA)" <j...@apache.org>
Subject [jira] [Created] (IGNITE-11911) GridToStringBuilder allocates redundant memory
Date Tue, 11 Jun 2019 11:56:00 GMT
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)

Mime
View raw message