当我在项目中使用时间时,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 已满的主要内容,如果未能解决你的问题,请参考以下文章
如何找出我在 Amazon EC2 上的存储空间已满的原因? [关闭]