Commit 2317119
authored
[android] fix memory leak in
* [android] fix memory leak in `TabbedPage`
Fixes: #17959
Context: https://github.com/VoznichkaSviatoslav1/TabbedPageMemoryLeak
In the sample app, I added some `GC.Collect()` calls to force the GC
to run, but the following log message never prints:
public partial class MyTabbedPage : TabbedPage
{
public MyTabbedPage()
{
InitializeComponent();
Console.WriteLine("Constructor was called");
}
// Doesn't print!!!
~MyTabbedPage() => Console.WriteLine("Destructor was called");
I took a memory snapshot with `dotnet-gcdump` and found a tree like:
SampleApp.MyTabbedPage ->
Microsoft.Maui.Controls.Platform.MultiPageFragmentStateAdapter<Microsoft.Maui.Controls.Page> ->
Action<Microsoft.Maui.Controls.Platform.AdapterItemKey>
I didn't find an explanation of what was holding
`MultiPageFragmentStateAdapter`. I tried eliminating the `Action<T>`,
but that didn't solve the underlying issue; it just made the object
tree shorter:
SampleApp.MyTabbedPage ->
Microsoft.Maui.Controls.Platform.MultiPageFragmentStateAdapter<Microsoft.Maui.Controls.Page>
I could also reproduce the problem in a new device test.
Reviewing the code, I found we were doing:
_viewPager.Adapter = new MultiPageFragmentStateAdapter<Page>(tabbedPage, FragmentManager, _context) { CountOverride = tabbedPage.Children.Count };
But then in the cleanup code, we never set `Adapter` to `null`:
_viewPager.Adapter = null;
After this change, the memory is released as expected. I am not
exactly sure *why* this leaked, but the change does seem appropriate
and fixes the problem.
Now the new device test passes & the sample app prints:
03-14 15:06:32.394 6055 6055 I DOTNET : Constructor was called
03-14 15:06:37.008 6055 6089 I DOTNET : Destructor was called
* [windows] skip test
I spent 2.5 hours on this, and did not figure it out! Comment for now as original issue is Android.
* Somehow duplicate [Fact]TabbedPage (#21218)1 parent 1b423ab commit 2317119
File tree
2 files changed
+32
-0
lines changed- src/Controls
- src/Core/Platform/Android
- tests/DeviceTests/Elements/TabbedPage
2 files changed
+32
-0
lines changedLines changed: 1 addition & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
123 | 123 | | |
124 | 124 | | |
125 | 125 | | |
| 126 | + | |
126 | 127 | | |
127 | 128 | | |
128 | 129 | | |
| |||
Lines changed: 31 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
426 | 426 | | |
427 | 427 | | |
428 | 428 | | |
| 429 | + | |
| 430 | + | |
| 431 | + | |
| 432 | + | |
| 433 | + | |
| 434 | + | |
| 435 | + | |
| 436 | + | |
| 437 | + | |
| 438 | + | |
| 439 | + | |
| 440 | + | |
| 441 | + | |
| 442 | + | |
| 443 | + | |
| 444 | + | |
| 445 | + | |
| 446 | + | |
| 447 | + | |
| 448 | + | |
| 449 | + | |
| 450 | + | |
| 451 | + | |
| 452 | + | |
| 453 | + | |
| 454 | + | |
| 455 | + | |
| 456 | + | |
| 457 | + | |
| 458 | + | |
| 459 | + | |
429 | 460 | | |
430 | 461 | | |
431 | 462 | | |
| |||
0 commit comments