- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在运行我的.net进程很长时间后,我发现GC感知的内存和进程工作集之间存在很大差异。
我正在监视的值是 GC.GetTotalMemory(false) 和 Process.WorkingSet。
如果我检查“任务管理器”(或使用 SysInternals 工具),WorkingSet(进程)的值与“任务管理器”中显示的值不匹配,但它们在某种程度上接近(比方说,100mb)在任务管理器中,WorkingSet 中为 130),但令我震惊的是 GC.GetTotalMemory(false) 大约为 40Mb 左右。
我已经通过探查器运行了几次(我最喜欢的是 ants memory profiler from redgate ),在那里很容易检查是否有一个名为“空闲内存”的值,该值通常是 GC“看到”的内容与实际情况之间的差异。操作系统看到(好的,加上加载的 DLL 等等)。
几个问题:
有没有办法以编程方式监视这个“GC 空闲内存”。是的,我可以使用探查器,但在长时间运行的过程中并不那么容易。
如果你的进程运行了很长一段时间,分配了大量内存然后释放它(分配意味着数千或数百万个对象,而不是像大分配和释放那么简单),问题在于它尽管 GC 值较低且正确,但它永远不会“收缩”到较低值。有没有办法来解决这个问题?可能是我的流程中出现了某些问题,但这些年来已经对其进行了多次分析,看起来并不是泄漏。
谢谢
最佳答案
只是为了复活一个古老的线程,如果你想监控“GC空闲内存”
,你可以定期调用GC.GetTotalMemory(false)
并存储值(value)。将其转储到磁盘或数据库或其他东西。或者,您可以使用像 prometheus-net ( https://github.com/prometheus-net/ ) 这样的库,它将为您导出此数据和一大堆指标。
关于你的第二个问题,有一种方法可以强制你的应用程序缩小,但它不是 dot net native 的,它只是 Windows 的,并且不推荐:
[DllImport("psapi.dll")]
static extern int EmptyWorkingSet(IntPtr hwProc);
static void MinimizeFootprint()
{
EmptyWorkingSet(Process.GetCurrentProcess().Handle);
}
据我所知,我认为如果服务器面临内存压力,操作系统会处理这个问题,并且如果内存仍然分配给您的进程,那么它对您的应用程序和一般服务器来说会更有效。这是因为将来很有可能再次需要它,因此当它只需要再次分配它时,清理它是没有意义的,特别是当您的服务器有足够的内存时。
关于c# - GC.GetTotalMemory(false) 和 Process.WorkingSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4909951/
我在"file"应用程序中遇到工作集枚举器(“最近”选项卡)的问题。我为文件夹实现了一个工作枚举器,它运行 enumerateItems(当我移动到 UI 中的文件夹时用于观察者方法并且一切正常。我也
我尝试使用 pymongo 获取“workingSet”指标。在 MongoDB 中只是 db.runCommand( { serverStatus: 1, workingSet: 1 } )。我在
Environment.WorkingSet 错误地报告了在 Windows 2003 Server 上运行的网站的内存使用情况。(操作系统版本:Microsoft Windows NT 5.2.37
我正在 Eclipse 中重新创建一个资源管理器,它应该启用工作集作为顶层样式。有没有办法访问 eclipse jdt 创建的“其他工作集”?我尝试创建自己的 localWorkingSetManag
无聊的好奇... 我正在查看当前进程的一些属性: using(Process p = Process.GetCurrentProcess()) { // Inspect properties
在运行我的.net进程很长时间后,我发现GC感知的内存和进程工作集之间存在很大差异。 我正在监视的值是 GC.GetTotalMemory(false) 和 Process.WorkingSet。 如
如果我在 C++ 中使用以下调用,我希望进程的 WorkingSet 永远不会低于 100MB。 但是,即使我进行此调用,操作系统仍将工作集缩减为 16MB。 将 WorkingSet 设置为 100
我是一名优秀的程序员,十分优秀!