检测正在运行的进程中未处理的类实例?
我有一个 IIS 应用程序,在 w3wp.exe 中运行。我不能 100% 确定我的其中一个类是否已被处置并随着时间的推移增加内存占用(仅查看任务管理器中的内存使用情况并不那么可靠)。
有没有一种简单的方法来获取内存转储(在 Win2008 中通过任务管理器很容易),将其加载到 WinDbg 或 Visual Studio 中,然后询问“此内存转储中有多少个 Foo.Bar 实例?”
我知道我可以/应该使用内存分析器,但我现在没有这个选项,因为它是一个生产系统。
I have an IIS Application, that runs in w3wp.exe. I'm not 100% sure if one of my classes is disposed and increases memory footprint over time (just looking at Memory usage in Task Manager isn't that reliable).
Is there a simple way to take a memory dump (that's easy in Win2008, through Task Manager), load it into WinDbg or Visual Studio and just ask "How many instances of Foo.Bar are in this memory dump?"
I know I could/should use a Memory Profiler, but I don't have that option right now as it's a production system.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您可以使用 Proc Dump 获取内存转储。
在 WinDbg 中
!dumpheap –stat
将为您按类型分配如果您使用
!dumpheap -type Foo.Bar
您应该只获得以 Foo.Bar 开头的类,请参见SOS.dll(SOS 调试扩展)了解更多信息
You can use Proc Dump to get the memory dump.
In WinDbg
!dumpheap –stat
will give you the allocation by typeIf you use
!dumpheap -type Foo.Bar
you should get just the Classes that start with Foo.Barsee SOS.dll (SOS Debugging Extension) for more information
您可以使用具有终结器和处置方法的装饰器类,并在错过处置时提醒您。因此,如果您的类是这样的:
然后定义一个接口并让客户端代码使用它:
定义一个装饰器并在创建任何这些对象的地方使用它:
然后无论您拥有什么:
CustomerTracker tracker= new CustomerTracker();
将其替换为
ICustomerTracker tracker = new CustomerTrackerMemDecorator(new CustomerTracker());
You can use a decorator class which has a finalizer and dispose method and alerts you on a missed dispose. So if your class is like this:
Then define an interface and make the client code use it:
Define a decorator and use it where you create any of these objects:
Then where ever you have:
CustomerTracker tracker= new CustomerTracker();
replace it with
ICustomerTracker tracker = new CustomerTrackerMemDecorator(new CustomerTracker());