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,
5 Answers, 1 is accepted
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.
Dimitar
Progress Telerik
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,
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
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,
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.
Dimitar
Progress Telerik