检测正在运行的进程中未处理的类实例?

发布于 2024-11-14 12:31:49 字数 256 浏览 2 评论 0原文

我有一个 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

野稚 2024-11-21 12:31:49

有没有一种简单的方法来获取记忆
dump(在Win2008中很容易,通过
任务管理器),将其加载到 WinDbg 或
Visual Studio,只需询问“有多少
Foo.Bar 的实例位于此
内存转储?

您可以使用 Proc Dump 获取内存转储。

在 WinDbg 中 !dumpheap –stat 将为您按类型分配

如果您使用 !dumpheap -type Foo.Bar 您应该只获得以 Foo.Bar 开头的类,

请参见SOS.dll(SOS 调试扩展)了解更多信息

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?

You can use Proc Dump to get the memory dump.

In WinDbg !dumpheap –stat will give you the allocation by type

If you use !dumpheap -type Foo.Bar you should get just the Classes that start with Foo.Bar

see SOS.dll (SOS Debugging Extension) for more information

独自唱情﹋歌 2024-11-21 12:31:49

您可以使用具有终结器和处置方法的装饰器类,并在错过处置时提醒您。因此,如果您的类是这样的:

public class CustomerTracker
{
   public bool IsNew() {...}
}

然后定义一个接口并让客户端代码使用它:

public interface ICustomerTracker
{
   public bool IsNew();
}

定义一个装饰器并在创建任何这些对象的地方使用它:

public class CustomerTrackerMemDecorator : ICustomerTracker
{
   ICustomrTracker tracker;

    CustomerTrackerMemDecorator (ICustomrTracker tracker)
    {
            this.tracker = tracker;
    }

    public bool IsNew() { return tracker.IsNew(); }

    ~CustomerTrackerMemDecorator
    {
            Debug.Assert("Missed dispose found!");
    }

    public override Dispose()
    {
            tracker.Dispose();
            GC.SupressFinalize(this);
    }
}

然后无论您拥有什么:

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:

public class CustomerTracker
{
   public bool IsNew() {...}
}

Then define an interface and make the client code use it:

public interface ICustomerTracker
{
   public bool IsNew();
}

Define a decorator and use it where you create any of these objects:

public class CustomerTrackerMemDecorator : ICustomerTracker
{
   ICustomrTracker tracker;

    CustomerTrackerMemDecorator (ICustomrTracker tracker)
    {
            this.tracker = tracker;
    }

    public bool IsNew() { return tracker.IsNew(); }

    ~CustomerTrackerMemDecorator
    {
            Debug.Assert("Missed dispose found!");
    }

    public override Dispose()
    {
            tracker.Dispose();
            GC.SupressFinalize(this);
    }
}

Then where ever you have:

CustomerTracker tracker= new CustomerTracker();

replace it with

ICustomerTracker tracker = new CustomerTrackerMemDecorator(new CustomerTracker());

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文