ASP.NET 应用程序内存使用率较高

2023-12-13

我们的一些 ASP.Net 应用程序存在问题。我们的一些应用程序从一开始就占用大量内存作为其工作集。

在我们的 2 个 webfarm 服务器(每个 4GB RAM)上运行多个应用程序。我们有一个稳定的环境,大约有 1.2GB 的可用内存。

然后我们添加一个 MVC5 + WebApi v2 + Entity Framework 应用程序,它立即声明 1+gb 作为工作集内存,而实际上只使用了大约 300mb。这会导致其他应用程序抱怨没有足够的内存。

我们已经尝试设置虚拟内存限制和私有内存限制,但没有任何效果。如果我们将其设置为大约 500mb,应用程序仍然使用或多或少相同的内存量(远超过 500),并且似乎不遵守所设置的限制。

作为参考,我使用一个空的 MVC5 项目(VS2013 模板)对此进行了测试,它已经占用了 300mb 的内存,而仅使用了大约 10mb。

将应用程序设置为 32 位应用程序似乎对减少工作集的大小有一些影响。

有什么方法可以减少工作集的大小,或者对其大小实施硬限制?

编辑: 在使用 Web Api v2 和实体框架的项目使用大量内存的情况下,我的 API 控制器如下所示:

namespace Foo.Api
{
public class BarController : ApiController
{
    private FooContext db = new FooContext(); 

    public IQueryable<Bar> GetBar(string bla)
    {
        return db.Bar.Where(f => f.Category.Equals(bla)).OrderBy(f => f.Year);
    }
}

正如他们在我能找到的大多数教程中所看到的那样(包括来自微软的教程)。使用using由于 LINQ 延迟加载,这里不起作用。如果我在任何地方添加一个 ToList (未测试),它就可以工作,但这还会有其他影响吗?

编辑2: 如果我这样做的话它会起作用

namespace Foo.Api
{
public class BarController : ApiController
{
    public List<Bar> GetBar(string bla)
    {
        using(FooContext db = new FooContext){
           return db.Bar.Where(f => f.Category.Equals(bla)).OrderBy(f => f.Year).ToList();
        }
    }
}

ToList() 对 api 的性能有什么影响吗? (我知道我不能像使用 IQueryable 那样继续便宜地查询)

编辑3: 我注意到应用程序的私有工作集相当高。有没有办法限制这个? (不会造成不断的回收)

编辑4: 据我所知,每个 APIController 上都有一个 Dispose。我的前端只是一些简单的 MVC 控制器,但大部分是 .cshtml 和 javascript(角度)文件。

我们有另一个应用程序,只是常规的 mvc,有两个模型和一些简单的视图(没有数据库或其他可能泄漏的外部资源),这也消耗了高达 4-500mb 的内存。如果我对其进行分析,我看不到任何表明内存泄漏的信息,我确实看到实际仅使用了 10 或 20 mb,其余的是未分配的非托管内存(但属于私有内存工作集的一部分,因此由此应用程序无法被任何其他应用程序使用)。


我的一些应用程序也遇到了类似的问题。我能够通过将一次性数据库资源包装在 using 子句中来正确关闭它们,从而解决了该问题。

对于实体框架,这意味着确保您始终在每次请求后关闭上下文。应在请求之间处理连接。

using (var db = new MyEFContext())
{
   // Execute queries here
   var query = from u as db.User
               where u.UserId = 1234
               select u.Name;

   // Execute the query.
   return query.ToList();

   // This bracket will dispose the context properly.
}

您可能需要将上下文包装到请求缓存上下文的服务中,以便在整个请求过程中保持其活动状态,并在完成后将其释放。

或者,如果使用整个控制器具有单个上下文的模式就像 MSDN 中的例子一样,确保您覆盖Dispose(bool)方法,如示例here.

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        db.Dispose();
    }
    base.Dispose(disposing);
}

所以你的控制器(从上面)应该看起来像这样:

namespace Foo.Api
{
    public class BarController : ApiController
    {
        private FooContext db = new FooContext(); 

        public IQueryable<Bar> GetBar(string bla)
        {
             return db.Bar.Where(f => f.Category.Equals(bla)).OrderBy(f => f.Year);
        }

        // WebApi 2 will call this automatically after each 
        // request. You need this to ensure your context is disposed
        // and the memory it is using is freed when your app does garbage 
        // collection.
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}

我看到的行为是应用程序会消耗大量内存,但它可以垃圾收集足够的内存以防止它获得OutOfMemoryException。这使得问题很难找到,但是处理数据库资源解决了问题。其中一款应用程序的 RAM 使用量过去徘徊在 600 MB 左右,现在则徘徊在 75 MB 左右。

但这个建议不仅仅适用于数据库连接。Any实现的类IDisposable如果您遇到内存泄漏,则应该怀疑。但既然您提到您正在使用 EntityFramework,那么它是最有可能的嫌疑。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET 应用程序内存使用率较高 的相关文章

随机推荐

  • ObservableCollection 作为参数和接口传递

    我有一个界面IPerson和两个班级 Adventurer and Worker来实施它 我目前有单独的ObservableCollections 代表冒险家和工人 我有一个方法 我希望能够通过ObservableCollection
  • 使用浏览器登录然后 ruby​​/mechanize 接管它?

    这可能吗 我需要传递什么才能实现机械化 那么我可以用什么网址开始呢 我无法 到目前为止 使用 mechanize 登录一个网站 所以我在想是否可以做这个小解决方法 我相信我可以捕获所有 cookie 和其他所有内容 然后将其传递给 ruby
  • JAVA中将时间字段H:M转换为整数字段(分钟)

    JTable 包含时间字段 例如 01 50 我需要将该值读入整数变量 为此 我想将时间转换为分钟 例如 01 50 应转换为 110 为了解决这个任务 首先我将时间值保存为字符串 String minutS tableModel getV
  • 无序列表的li后等间距

    我已经删除了后面的点 li of ol 并给出了 在号码之后 我通过使用下面的代码实现了它 ol counter reset item ol li before content counter item counter increment
  • 将更多值附加到共享首选项而不是覆盖现有值

    在我的应用程序中 我需要将值保存到 Sharedpreferences 文件 RKs Data 中 而不覆盖现有数据 每次 我在应用程序中单击 是 时 我都需要存储在 RKs Data 中的所有值 而不仅仅是将最新的 名称 和 电话号码 添
  • pandas 使用哪种方法计算百分位数?

    我试图理解 pandas 中的下 上百分位数计算 但有点困惑 这是示例代码及其输出 test pd Series 7 15 36 39 40 41 test describe output 我只对 25 75 的百分位感兴趣 我想知道 pa
  • opencv计算矩阵秩

    我正在尝试找到矩阵的秩 在 matlab 中 这相当简单 但我使用的是 Visual Studio 2008 c 我最近安装了 openCV 到目前为止它适用于我的大部分矩阵算术 除了我不知道如何使用 openCV 来获得矩阵的排名 在我的
  • 在 HttpClient 中设置 Authorization 标头安全吗?

    我正在 MVC5 ASP NET 项目中工作 并了解到要从控制器向 WEB API 发送经过身份验证的请求 我可以执行以下操作以将令牌添加到标头 使用示例代码 public static class APICaller Use a sing
  • 当给定参数是两个项目和一个列表时,如何在 DrScheme 中将列表中的一个项目替换为另一个项目?

    当给定参数是两个项目和一个列表时 如何在 DrScheme 中将列表中的一个项目替换为另一个项目 Use map使用一个函数 当其参数等于要替换的项目时返回替换项目 否则返回该参数
  • 如何连接静态字符串数组[重复]

    这个问题在这里已经有答案了 可能的重复 Java中如何连接两个数组 我已将 SET1 声明为静态 String 并且我想将 SET2 声明为 SET1 一些其他参数 是否可以声明 SET2 与 SET1 静态相似 即 private sta
  • 在 Windows 批处理文件中转义用户输入

    我有一个 Windows 批处理文件 它接受密码作为用户输入 SET P PASSWORD Password 该密码可能包含需要转义的字符 例如 The PASSWORD然后使用变量将其传递给其他批处理文件CALL CALL Foo Bat
  • MySQL 逻辑运算符

    鉴于查询 SELECT foo FROM bar WHERE a x AND b y OR c z 它如何解析这个查询 a x AND b y OR c z a x AND b y OR c z 这是一个简单的示例 但如果您将 AND OR
  • 求 R 中函数的最大值

    我有以下功能 设 F 是累积分布函数gamma分布与shape 1 and rate 1 分母是生存函数S X 1 F X The g x 是平均剩余寿命函数 我在r中编写了以下函数 x 5 denominator 1 pgamma x 1
  • 定义一个新变量以进行大量迭代,给我一个错误

    我有一个端点 您可以获取有关产品的信息 URL API 产品 如果我通过该端点执行 GET 方法 我将获取每个产品的信息 但我也可以指定我想了解的产品 即 URL API products 9345TERFER 最后一个代码是产品的id 称
  • 仅显示 PHP 检索到的标题的第一个单词

    所以我试图显示我的另一个网站的列表 一切正常 但只存储 标题 属性的第一个单词 我知道整个标题是从其他网站检索的 所以我如何让它存储所有内容 如果有帮助的话 这是代码
  • JavaFX ListView 中的图像

    有没有办法将图像添加到 JavaFX ListView 中 这就是我当前设置列表视图项目的方式 private ListView
  • 1/0 是合法的 Java 表达式吗?

    以下内容在我的 Eclipse 中编译良好 final int j 1 0 compiles fine throws ArithmeticException by zero at run time Java 从一开始就阻止了许多 哑代码 的
  • 在 Microsoft Visual Studio 2013 的 WinForms 中启用 Entity Framework 6 for MySql (C#)

    昨天我知道实体框架是除了使用 Dataset 或 DataReader 之外访问数据库的另一种方法 然后我尝试使实体框架 6 适用于 MVS 2013 中的 MySql 数据库服务器 我使用 Net FrameWork 4 5 1 打开 W
  • 如何使用 Beautiful Soup 提取没有属性的

    标签?

    假设一个网页包含以下内容 p style display none p
  • ASP.NET 应用程序内存使用率较高

    我们的一些 ASP Net 应用程序存在问题 我们的一些应用程序从一开始就占用大量内存作为其工作集 在我们的 2 个 webfarm 服务器 每个 4GB RAM 上运行多个应用程序 我们有一个稳定的环境 大约有 1 2GB 的可用内存 然