Memory leak in Grid hierarchy template

6 posts, 0 answers
  1. Kun
    Kun avatar
    44 posts
    Member since:
    Aug 2018

    Posted 15 Apr 2019 Link to this post

    Hello,

    My gridview bounds with two data collections. One collection bounds to the master template, the other bounds to the template in the master template.

    I've found the memory leak during the hierarchy templates refresh.

    I made a simple demo. Please download it from:

    https://www.dropbox.com/s/btzb5go8e4bnrmk/RefreshHierarchy.rar?dl=0

    In the demo, there are two data collections. If I refresh 50 elements in each collections, the memory will leak very fast. Please see the memory diagnosis trace in the attached photos.

    If I collapse all hierarchy template, only refresh the master template, the memory maintains well.

    Thank you by advanced for your support.

    Regards,

  2. Dimitar
    Admin
    Dimitar avatar
    2917 posts

    Posted 16 Apr 2019 Link to this post

    Hi Kun,

    Please note that the garbage collector is non-deterministic and you cannot be sure when it will be executed. In order to properly test this, you need to force the garbage collector after the form is closed. When this is done the memory levels are restored (see attached). I have attached a modified version of the test project as well.

    Should you have any other questions do not hesitate to ask.
     
    Regards,
    Dimitar
    Progress Telerik
    Get quickly onboarded and successful with your Telerik and/or Kendo UI products with the Virtual Classroom free technical training, available to all active customers. Learn More.
  3. Kun
    Kun avatar
    44 posts
    Member since:
    Aug 2018

    Posted 16 Apr 2019 Link to this post

    Hello Dimitar,

    Thank you for your reply.

    Actually, the grid form is my main form. It will be closed only if the user closes the software.

    I've add a timer of GC collector in your demo. The refresh timer is triggered every second, the GC timer is triggered every 2 seconds.

    private void Timer2_Tick(object sender, EventArgs e)
            {
                Console.WriteLine("GC recycle");
                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.WaitForFullGCApproach();
                GC.WaitForFullGCComplete();
                GC.Collect();
            }

     

    The memory seems to be leaking more slowly, but there is still a leak.

    Please see memory trace in the attached photo.

    I don't understand why the memory maintains well only if the master template refreshes. With the hierarchy template, the memory can't stop leaking.

     

    Thank you by advance for your help.

    Regards,

     

  4. Dimitar
    Admin
    Dimitar avatar
    2917 posts

    Posted 17 Apr 2019 Link to this post

    Hello Kun,

    While the grid is being updated and visible there are a lot of internal objects that are used and updated. This is why the memory consumption is not a reliable indicator when the grid is constantly updated. Nevertheless, I can suggest encapsulating the updated operation within BeginUpdate\EndUpdate block. When EndUpdate is called the grid data will be reset at once which will release the objects held by the grid and this way the update works even faster:
    private void timer1_Tick(object sender, EventArgs e)
    {
        radGridView1.BeginUpdate();
     
        childList.Clear();
        masterList.Clear();
     
        for (int i = 0; i < 10; i++)
        {
            masterList.Add(new MasterObject(Guid.NewGuid().ToString(), i + ".Title"));
        }
     
        Random rand = new Random();
        for (int i = 0; i < 5; i++)
        {
            childList.Add(new ChildObject(i, i + ".Name", masterList[rand.Next(0, masterList.Count)].UniqueIdentifier));
        }
     
        radGridView1.EndUpdate();
     
        foreach (GridViewRowInfo row in radGridView1.Rows)
        {
            row.IsExpanded = true;
        }
    }

    With this approach, I am getting a steady memory consumption. Could you please try it and let me know the results on your side. 

    I am looking forward to your reply.

    Regards,
    Dimitar
    Progress Telerik
    Get quickly onboard and successful with your Telerik and/or Kendo UI products with the Virtual Classroom free technical training, available to all active customers. Learn More.
  5. Kun
    Kun avatar
    44 posts
    Member since:
    Aug 2018

    Posted 17 Apr 2019 in reply to Dimitar Link to this post

    Hello Dimitar,

    Thank you for your solution. It works better. But the memory still leaks. With 50 random elements in master template, and 10 random elements in hierarchical template (all expanded), the memory increases about 1M per minute in the demo by using the refresh every second and the GC.collect routine every 2 seconds. Imagine keeping the program running for a day....

    I've done some tests and I've found out :

    If refresh only the master template, the memory is steady. After I expanded all child templates, the memory will increase heavily (it's normal.). And also I can see the gridview control does lots of GC collect. Part of the memory resource is recycled. But globally, the memory increases.

    And then, if I collapse all child templates, keep only the master template refreshing. The memory cannot go back to the level at the first place. But it remains stable.

    Please explain this behavior.

     

    Thank you by advance.

    Regards,

  6. Dimitar
    Admin
    Dimitar avatar
    2917 posts

    Posted 18 Apr 2019 Link to this post

    Hello Kun,

    I have looked at this again and there is indded a small constant memory incerease after a the grid is updated more often. I have logged this so our developers can investigate it and determine what is casing this. You can track its progress, subscribe to status changes and add your comment to it here. I have also updated your Telerik Points.

    Currently I cannot sugest a workaround other than restarting the enitre form when the memory consuption is critical.

    Should you have any other questions do not hesitate to ask.
     
    Regards,
    Dimitar
    Progress Telerik
    Get quickly onboarded and successful with your Telerik and/or Kendo UI products with the Virtual Classroom free technical training, available to all active customers. Learn More.
Back to Top