我是编写Windows服务的新手。我决定写一个通过Twilio进行出站呼叫的人。当我使用实现IDisposable的资源时,我正在使用using语句。到目前为止,我一直运行该服务共四个小时,这里是我的内存使用情况:
开始:9k
15分钟:10k
30分钟:13k
1小时:13k
2小时:13k
3小时:13k
在30分钟之后它似乎是一致的(在13,100和13,200之间),但我不确定为什么在前30分钟后仍然分配资源。 OnStart()方法启动4个定时器和一些小对象。我的物体的构造肯定不需要30分钟。计时器只是等待特定时间,执行查询,然后使用Twilio将结果排队并等待下一个事件。
此时我是否应该关注内存泄漏?这种应用是否正常?
答案 0 :(得分:1)
一个有根据的猜测可能是,当您执行HTTP请求时,框架仍会分配一些内容。
我不会担心这一点,但如果你真的想,你可以随时使用CLR Profiler或其他.NET内存分析器来查看发生了什么以及是否需要担心。
答案 1 :(得分:1)
不,看起来你不需要担心内存泄漏。
在具有几千兆字节可用内存的计算机上,消耗13k内存......非常小。如果这种情况稳步增长而且从未减少,那么你就会有泄漏:否则你就没事了。
值得记住的是,CLR中的字符串是不变的,因此每次“更改”字符串时,都会创建一个新副本,并将分配给旧版本的内存标记为未使用。所以大多数程序只是在他们日常使用中通过一些内存来回流:这是正常的,只有在边缘条件下需要关注的事情,例如非常紧密循环或巨大的集合或两者兼而有之
即便如此,.NET垃圾收集器(GC)也可以不时地清理和整合这些旧内存。
在某些情况下,字符串(和其他对象)可以分配内存(以及其他资源,如文件句柄),使用后不会释放,这就是您需要使用Dispose()
的地方。