1

为了让我解释为什么我需要知道,在我的服务器启动器(用于游戏)中,有人要求我添加一个“内存使用过多时重新启动”复选框。所以,经过一个小时左右的冒险,我来到了这里。

我只需要知道如何读取正在运行的应用程序的内存使用情况,剩下的事情我就可以完成。我只是不知道如何使用 ac# 应用程序来做到这一点。

感谢您的帮助!

4

2 回答 2

8

对于像 Windows 这样的按需分页虚拟内存操作系统,“内存”是一个相当不准确的术语。您需要选择以下一个或多个 Process 类属性:

  • NonpagedSystemMemorySize64:高值表示设备驱动程序在非分页内核内存池中分配了大量内存。这种内存用于在设备产生中断时需要执行的关键设备驱动程序操作。除非您依赖有缺陷的驱动程序,否则这不是一个很好的措施。终止进程通常不会有帮助。

  • PagedSystemMemorySize64:另一个驱动程序资源,从分页内核内存池中分配。通常用于 I/O 缓冲区。通常不是一个很好的衡量标准,获得高值仅表明您的程序很忙。但是,您应该将其与稳步增加的 HandleCount 属性值相关联。如果这只是继续上升,那么您在程序中有一个句柄泄漏确实值得杀死它。

  • VirtualMemorySize64:为进程分配的虚拟内存总量。这涵盖了程序使用的代码和数据,当您用完 VM 地址空间中足够大的洞时,会引发 OutOfMemoryException。一般泄漏的一个很好的措施。

  • WorkingSet64:实际映射到 RAM 的虚拟内存总量。随着操作系统取消映射虚拟内存页面以为其他进程腾出空间,这个数字可能会大幅波动。这不是一个好的衡量标准,您可能会因为它很忙而终止该进程。并且一个泄漏的程序不需要有一个大的工作集,许多页面可以被换出并且不会被换回,因为程序通常不再引用泄漏的对象。

  • PrivateMemorySize64:不与其他进程共享的虚拟内存量,否则比 VirtualMemorySize64 更好,因为它代表了为您的进程分配了多少资源。在 .NET 应用程序中,它将是数据以及未经过 ngen 编辑的代码。

  • PagedMemorySize64:分页文件支持的虚拟内存量。如果您正在泄漏数据,这是一个很好的措施,泄漏的 .NET 应用程序中的正常问题。

当您检查程序的这些数字以找出最好的数字时,您可能会很好地了解代码中的错误。内存分析器可以提供很多帮助。修复该错误当然是解决问题的更好方法。

于 2013-10-29T01:13:14.207 回答
0

使用 Process 对象获取有关正在运行的进程的所有信息。要获取有关正在运行的进程的信息,您可以调用静态方法Process.GetProcessByName。这应该为您提供包括内存使用在内的详细信息(此调用返回与您的名称匹配的所有进程的数组)。要获取进程当前使用的内存,请使用Process.WorkingSet64属性。MSDN中引用的链接为您提供了足够的示例来使用 Process 对象。

于 2013-10-28T23:41:24.303 回答