当我在项目中使用时间时,RAM 已满

Posted

技术标签:

【中文标题】当我在项目中使用时间时,RAM 已满【英文标题】:When I use a Time in my project RAM is getting full 【发布时间】:2019-10-31 16:59:28 【问题描述】:

我在我的项目中使用了 Timer,但每次运行 myTimer.Tick 时,myApp 都会使用比以前更多的内存。 开始时使用了 63MB 的 RAM,30 分钟后它使用了 700MB。

private void Window_Loaded_1(object sender, RoutedEventArgs e)
    
    DispatcherTimer tmShowAlarm = new DispatcherTimer();
    tmShowAlarm.Tick += new EventHandler(ShowAlarm);
    tmShowAlarm.Interval = new TimeSpan(1000);
    tmShowAlarm.Start();


private void ShowAlarm(object Sender, EventArgs e)

     string strDate = "2019/10/10";
     DatabaseContext oDatabaseContext = null;
     try
     
         oDatabaseContext = new DatabaseContext();
         var varNote = oDatabaseContext.Notes.Where(_note => _note.NoteDate.CompareTo(strDate ) < 0);

         dgShowResult.ItemsSource = null;
         if (varNote.Count() > 0)
         
             dgShowResult.ItemsSource = varNote.ToList();
             dgShowResult.Visibility = Visibility.Visible;
         
         else
         
             dgShowResult.Visibility = Visibility.Hidden;
          

         varNote = null;
    
    catch (Exception ex)
    
        MessageBox.Show(ex.Message);
    
    finally
    
        oDatabaseContext.Dispose();
        oDatabaseContext = null;
    


当我删除 dgShowResult.ItemsSource = varNote.ToList(); 它不会使用更多内存。

【问题讨论】:

只有 700MB 的 RAM 是如何“满”的?这不重要!垃圾收集器可能正在睡觉,因为真的没有什么可做的...... 您从哪里得到“它使用了 700MB”的想法?从任务管理器? That does not show how much memory is in use。如果您想知道您的应用程序使用了多少内存,您必须运行内存分析器。 在任务管理器中显示 RAM 和 CPU 【参考方案1】:

这不会解决您的问题,但您可能更喜欢使用推荐的 using 标准模式,而不是手动调用 Dispose()

using (var oDatabaseContext = new DatabaseContext() )
  try
  
    //
  
  catch (Exception ex)
  
    MessageBox.Show(ex.Message);
  

为了增加内存,你必须知道GC.Collect()可以随时在后台运行。

因此,您所说的问题是正常的:当您丢失对象的最后一个引用时,托管内存空间不会被释放,它们只会在需要时被标记为稍后释放,通常是在系统可用内存不足的情况下。

所以你可以在方法结束时显式调用它:它不保证它会运行,但在 Windows 上它通常会在你调用它时运行,但会造成一点延迟。

  finally
  
    GC.Collect();
  

因此也许ToList()分配的不再使用的内存将被释放。

https://docs.microsoft.com/dotnet/api/system.gc.collect#System_GC_Collect

【讨论】:

您检查什么类型的内存以及如何检查? 在任务管理器中显示应用程序使用了多少 RAM 和 CPU,30 分钟后 myApp 使用了 700MB RAM 并且计算机正在启动挂机。对不起,我英语说得不好。 列名是内存,当我删除 dgShowResult.ItemsSource = varNote.ToList();它不会使用更多内存 您应该能够选择列以显示更详细的信息...因为有许多类型的内存,例如 WorkingSet、PrivateMemory、PagedMemory... 当前和峰值:***.com/questions/842585/getting-a-processs-ram-usage 和 docs.microsoft.com/dotnet/api/system.diagnostics.process和docs.microsoft.com/en-us/windows/win32/psapi/…。您应该考虑没有峰值的工作集。如果你不能改进你的任务管理器,你可以在你的应用程序中使用一个方法或者Process Hacker。请记住,GC 不在您的控制范围内。【参考方案2】:

它解决了,DispatcherTimer 将使对象保持活动状态,我应该使用 System.Timers.Timer。

【讨论】:

您绝对应该在 WPF 应用程序中使用 DispatcherTimer,尤其是当您想从 Tick 处理程序更新 UI 时。

以上是关于当我在项目中使用时间时,RAM 已满的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 RAM 填满图像分类 (DL)

使用 Keras 的 CNN 深度学习模型中的 PCA

如何找出我在 Amazon EC2 上的存储空间已满的原因? [关闭]

记分牌已满,不在 MaxRequestWorkers

我的程序使用多少RAM?内存分析报告Visual Studio

删除所有文件后,Firebase 存储状态已满