WCF没有释放未使用的缓冲区
本文关键字:缓冲区 未使用 释放 WCF | 更新日期: 2023-09-27 18:01:16
我有一个wcf服务,我使用下面的配置值。
maxItemsInObjectGraph="2147483647"
maxBufferPoolSize="2147483647"
maxReceivedMessageSize="2147483647"
一切正常,只是我的服务一直占用内存。我已经缩小了问题的范围,它占用大量内存的原因是因为它没有释放这些未使用的缓冲区大小。当我使用默认值时,它工作得很好,没有太多的内存。
是否有一种方法可以让服务声明未使用的空间?
我很好奇你是如何确定这些设置是你的问题的原因,你在看什么来确定内存使用情况,以及你让它运行了多少时间和多少请求。
你得到一个OutOfMemory异常后几个请求?
请注意,2147483647字节是2GB,所以如果这些缓冲区被完全分配而没有释放,那么在内存耗尽之前需要大约2到3个请求。
你确定内存没有被GC是因为没有理由?如果堆空间是可用的,并且在一定的阈值下,它没有太多的理由花费时间来回收东西。
编辑:
您还可以根据这些创建的缓冲区和对象的大小看到不同的内存使用情况。这里概述了其中一些。基本上。net将超过85,000字节的对象视为"大",并对它们进行不同的压缩。
但是,如果您从未得到内存异常或实际上耗尽内存,那么您可能没有问题。"不同"的内存使用并不意味着它是"错误的"。您应该对应用程序进行负载测试,看看它是否真的耗尽了内存,这将表明存在真正的内存泄漏。否则,它可能只是构建内存,直到它接近最大堆生成大小,然后GC所有内容。