2017-10-10 73 views
1

我有一个问题,内存没有得到释放在我的.NET核心Web API。我所做的只是从静态类中返回一个字符串。内存不能释放在Asp.Net核心api

API:

[HttpGet] 
public string Get() 
{ 
    return A.get(); 
} 

public static class A 
{ 
    public static string get() 
    { 
     return "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; 
    } 
} 

客户:

HttpClient hc = new HttpClient(); 
for(int i=0;i<100000;i++) 
{ 
    //var v = hc.GetAsync("http://localhost:52425/api/values").result; 
    hc.GetStringAsync("http://localhost:52425/api/values"); 
    if(i%1000 == 0) 
    { 
     Thread.Sleep(10000); 
     Console.WriteLine("Sleeping-----------" + i); 
    } 
} 

我已经试过没有静态类直接从action方法返回的字符串。我也尝试以同步方式而不是异步方式从客户端调用API。这些没有任何区别。

这个屏幕截图显示了GC被调用了一次,但没有帮助清理内存。

memory from diagnostics

下面是诊断升级到2.0和禁用遥测信息后:

enter image description here

+0

您使用的是什么版本的.NET Core? –

+0

另外,你在IIS或Kestrel上运行WebAPI吗? –

+0

我正在使用netcore1.2,我在IIS上运行。上面的代码在cloudfoundry上运行时,256k的RAM会抛出OOM异常 – VKR

回答

1

看来,当你不使用它的应用见解甚至收集数据,因此你看记忆力增加。一段时间后,这些物体被GC收集。

Visual Studio默认打开应用程序洞察。有两种选项可关闭Application Insights:

  1. TelemetryConfiguration.Active.DisableTelemetry = true;添加到ConfigureServices,您应该看到性能得到改进。
  2. 在launchSettings.json添加ASPNETCORE_preventHostingStartup键:
"environmentVariables": { 
    "ASPNETCORE_ENVIRONMENT": "Development", 
    "ASPNETCORE_preventHostingStartup": "True" 
    } 

这一个可能potentionaly囤了一些其他的东西。阅读更多关于它here

+0

在100k请求之后,我正在非常尴尬的点击服务。我继续运行应用程序几个小时,内存没有下降。我会尝试你提到的选项,并在这里更新结果。感谢您的建议 – VKR

+0

此外,我建议切换到.NET Core 2.0,因为有很多改进。 –

+0

升级到2.0,并关闭遥测性能(处理器)的帮助,但并没有真正帮助记忆。甚至没有一次GC被称为(屏幕截图添加到实际问题)。我在猜测GC在采取行动之前正在寻找可用的RAM(我的PC上有12GB免费)。任何想法如何我可以控制这一点。还有一件事我在使用netcore1.2的cloudfoundry(2个1Gb实例)时观察到,如果内存达到〜900Mb左右,那么gc将清除内存并保持在〜350MB左右。但是,如果同一个云代工厂实例是512每个GC永远不会正常工作,我得到OOM错误。 – VKR