gpt4 book ai didi

c# - .NET 4.0 中的内存使用率非常高

转载 作者:IT王子 更新时间:2023-10-29 03:44:53 28 4
gpt4 key购买 nike

我有一个最近从 .NET 3.5 迁移到 .NET 4.0 的 C# Windows 服务。没有进行其他代码更改。

在 3.5 上运行时,给定工作负载的内存利用率约为 1.5 GB 内存,吞吐量为每秒 20 倍。 (X 在此问题的上下文中无关紧要。)

在 4.0 上运行的完全相同的服务使用 3GB 到 5GB+ 的内存,并且每秒获取不到 4 X。事实上,随着内存使用量继续攀升,该服务通常会停止运行,直到我的系统达到 99% 的利用率并且页面文件交换变得疯狂。

我不确定这是否与垃圾收集有关,或者是什么,但我无法弄清楚。我的窗口服务通过如下所示的配置文件开关使用“服务器”GC:

  <runtime>
<gcServer enabled="true"/>
</runtime>

将此选项更改为 false 似乎没有什么不同。此外,从我对 4.0 中新 GC 所做的阅读来看,大的变化只影响工作站 GC 模式,而不影响服务器 GC 模式。所以也许 GC 与这个问题无关。

想法?

最佳答案

这很有趣。

根本原因是在 .NET 4.0 上运行时,SQL Server Reporting Services 的 LocalReport 类 (v2010) 的行为发生了变化。

基本上,Microsoft 改变了 RDLC 处理的行为,以便每次处理报告时都在单独的应用程序域中完成。这实际上是专门为了解决由于无法从应用程序域卸载程序集而导致的内存泄漏。当 LocalReport 类处理 RDLC 文件时,它实际上会即时创建一个程序集并将其加载到应用程序域中。

在我的例子中,由于我正在处理大量的报告,这导致创建了大量的 System.Runtime.Remoting.ServerIdentity 对象。这是我对原因的提示,因为我对为什么处理 RLDC 需要远程处理感到困惑。

当然,要调用另一个应用程序域中的类的方法,远程处理正是您所使用的。在 .NET 3.5 中,这不是必需的,因为默认情况下,RDLC 程序集已加载到同一应用程序域中。然而,在 .NET 4.0 中,默认情况下会创建一个新的应用程序域。

修复相当简单。首先,我需要使用以下配置启用旧版安全策略:

  <runtime>
<NetFx40_LegacySecurityPolicy enabled="true"/>
</runtime>

接下来,我需要通过调用以下命令强制在与我的服务相同的应用域中处理 RDLC:

myLocalReport.ExecuteReportInCurrentAppDomain(AppDomain.CurrentDomain.Evidence);

这解决了问题。

关于c# - .NET 4.0 中的内存使用率非常高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6220915/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com