2016-11-18 13 views
5

Dường như Điều hướng khung (cụ thể là Khung.Phương pháp (Loại)) đang bị rò rỉ bộ nhớ không được quản lý.
Sau mỗi chuyển hướng khi tôi nhìn vào Visual Studio Tools, Private Bytes đang đi lên nhưng khi tôi có một bản chụp của bộ nhớ, các Heap Kích không tăng. Càng nhiều thành phần trang càng tệ hơn. Bộ nhớ dường như không bao giờ được phát hành. Nó không quan trọng cho dù các ứng dụng được xây dựng trong Debug hoặc Release (cả với. Net Native và không có). Tôi đang sử dụng SDK 14393 (Bản cập nhật kỷ niệm).UWP - Điều hướng khung dường như gây rò rỉ bộ nhớ không được quản lý

Tôi đã tạo một ứng dụng mẫu có trang chính và 2 trang (nội dung) mà nó tiếp tục điều hướng ở giữa (trên sự kiện PageLoaded). Tôi đã đặt CacheSize = "0" vào Khung và Trang có NavigationCacheMode = "Đã tắt" để chúng không được lưu trong bộ nhớ cache. Tôi cũng đang xóa hậu trường trước mỗi lần điều hướng và hủy đăng ký mọi sự kiện trên PageUnloaded.
Dưới đây là file .cs cho một trong những Trang:

public sealed partial class FirstPage : Page 
{ 
    public FirstPage() 
    { 
     this.InitializeComponent(); 
    } 

    private void NavigateToSecondPage() 
    { 
     MainPage.ContentFrame.BackStack.Clear(); 
     MainPage.ContentFrame.Navigate(typeof(SecondPage)); 
    } 

    private void NavigateButton_Click(object sender, RoutedEventArgs e) 
    { 
     NavigateToSecondPage(); 
    } 

    private void Page_Loaded(object sender, RoutedEventArgs e) 
    { 
     if (!MainPage.StopNavigating) 
     { 
      NavigateToSecondPage(); 
     } 
    } 

    private void Page_Unloaded(object sender, RoutedEventArgs e) 
    { 
     this.NavigateButton.Click -= NavigateButton_Click; 
     this.Loaded -= Page_Loaded; 
     this.Unloaded -= Page_Unloaded; 
    } 
} 

Và tương ứng XAML file:

<Page 
    x:Class="LeakTestApp.FirstPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:LeakTestApp" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    Loaded="Page_Loaded" 
    Unloaded="Page_Unloaded"> 

    <StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
     <TextBlock Text="First Page" FontSize="32" /> 
     <Button x:Name="NavigateButton" Content="Navigate to Second Page" Click="NavigateButton_Click" /> 
     <StackPanel Width="350"> 
      <TextBox /> 
      <TextBox /> 
      <TextBox /> 
      <TextBox /> 
      <TextBox /> 
      <TextBox /> 
      <TextBox /> 
      <TextBox /> 
      <TextBox /> 
      <TextBox /> 
      <TextBox /> 
      <TextBox /> 
      <TextBox /> 
      <TextBox /> 
      <TextBox /> 
      <TextBox /> 
      <TextBox /> 
      <TextBox /> 
      <TextBox /> 
     </StackPanel> 
    </StackPanel> 
</Page> 

Các textbox đây đang có để hiển thị tốt hơn vấn đề.
Bạn có thể xem here rằng ngay sau khi tôi bắt đầu điều hướng Byte riêng bắt đầu tăng nhanh nhưng kích thước Heap Heap không tăng.
Bật bộ nhớ cache (NavigationCacheMode = "Bắt buộc") hoặc gọi thủ công GC.Collect() không hữu ích.
Bạn có thể xem mã nguồn đầy đủ here.

Có điều gì hiển nhiên tôi bị thiếu không? Tôi không xóa tất cả mọi thứ đúng cách? Hoặc có lẽ thời gian chạy sẽ giải phóng bộ nhớ cuối cùng?

Cảm ơn bạn

Cập nhật: Nhìn trong các ý kiến ​​cho một video cho thấy hành vi (Tôi không có đủ uy tín để gửi hơn 2 liên kết)

+1

[Ở đây] (http://i.imgur.com/QuQIaFN.png) (Tôi không thể đăng nhiều hơn 2 liên kết trong bài đăng) là so sánh hai ảnh chụp nhanh _Native Heap_. Từ vấn đề này, có vẻ như vấn đề liên quan đến các mẫu và bố cục XAML thay vì Frame.Navigate – Roozi

+0

Tôi đã ghi lại [video ngắn] (http://www.screencast.com/t/MrBT1ozgwu) mà bạn có thể hành vi trên thiết bị của tôi. Bạn cũng có thể thấy rằng việc bật bộ nhớ cache không giúp ích gì. – Roozi

Trả lời

1

tôi không thể tái tạo vấn đề của bạn kể từ khi kết quả giám sát của dự án của bạn là như sau về phía tôi. enter image description here Tôi không thấy bộ sưu tập con thỏ trong ảnh của bạn. Nhưng về phía tôi, nó có GC thường xuyên làm việc. Hãy chú ý rằng GC không phải trong thời gian thực. Bạn có thể thử sử dụng GC.Collect Method() để gabbge tự mình thu thập nhưng không nên sử dụng trong sản phẩm. Chi tiết bạn có thể tham khảo this thread.

+0

Bạn không thể thấy các đại diện GC vì tôi đã đăng ảnh chụp màn hình từ bản dựng Bản phát hành, [đây] (http://i.imgur.com/vjlH4pK.png) là ảnh chụp màn hình từ Debug. Tôi đã có thể tái tạo sự cố trên nhiều thiết bị. Bạn có thể thử chạy nó thêm vài phút nữa không, tôi nghĩ nó sẽ dễ nhìn hơn. – Roozi

+0

@Roozi Tôi buồn Tôi vẫn không thể tái tạo vấn đề bằng cách thử nghiệm trong vài phút. Tôi sẽ tiếp tục thử nghiệm. Một điều nữa, hãy thử đặt 'NavigationCacheMode' thành' Required' ở bên cạnh bạn và kiểm tra lại. Vô hiệu hóa chế độ cache sẽ không cache dữ liệu, thực sự mỗi khi bạn điều hướng đến trang sẽ tạo ra các thể hiện mới có thể dẫn đến bộ nhớ tăng lên. –

+0

@Roozi, kết quả nếu bạn tự GC là gì? –

Các vấn đề liên quan