我正在开发一个 .NET Windows 服务,该服务创建几个线程,然后使用这些线程将打印作业发送到打印机(每个打印机都有一个线程)。我遇到一些问题,有时可以通过重新启动服务来解决。当服务运行一段时间后,也会出现一些问题。这让我怀疑可能存在内存泄漏。那么,有几个问题:
如果对象是在线程内创建的,垃圾收集器是否会收集该对象,或者该对象会一直存在直到线程停止/终止吗?
我可以使用哪些工具来监视 Windows 服务和我以编程方式启动的线程使用的内存量?
最佳答案
所有对象都是在线程内创建的。执行的每条指令都在线程内。在没有对对象的实时引用之后,对象将在某个时刻被垃圾收集。对象不“属于”创建它们的线程。
为了监视服务,您可以使用 perfmon
,它有大量计数器用于垃圾收集等操作。要更详细地分析可能泄漏对象的位置,您应该使用探查器。如果您的程序也可以作为非服务运行,那么所有这一切都可能会变得更简单。 (您可能希望将其分离为“启动器”部分,然后是一个可以从服务或控制台应用程序使用的库。)
关于.NET Windows 服务、线程和垃圾收集(可能存在内存泄漏),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2605444/