我创建了一个非常基本的Web应用程序,试图通过生产Web应用程序来隔离我认为可能是内存泄漏的内容,其中w3wp进程在每次登录时消耗内存并且似乎不释放该内存。我注意到我的基本Web应用程序也在iisexpress / w3wp进程中消耗内存,只需运行应用程序并点击页面上的刷新即可。刷新页面20次后,托管进程(iisexpress / w3wp)消耗5 MB到14 MB的内存,但它不会释放。当我使用VS 2015的诊断工具拍摄内存快照时,内存量似乎保持相对平稳。
什么会导致托管进程占用这么多内存?如何减少或消除内存使用?
出于好奇,我在Page_Load事件中添加了对垃圾收集GC.Collect(3)的调用,这似乎可以保持内存使用率不变。查看GC.Collect()调用之前和之后的内存快照并不会显示任何一直被清理的内容。这只有在我为每个页面加载调用GC时才有效。每次调用GC并不像是一个很好的解决方案。
我在运行Windows 10的开发计算机上运行此操作。我正在使用IISExpress和IIS的默认主机设置。 Web应用程序是从一个空的4.6.1 asp.net Web应用程序项目构建的。该Web应用程序有一个Web表单页面login.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Login.aspx.cs" Inherits="WebFormTesting.Login" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="login" method="post" runat="server">
<div>
<div style="height: 250px; width: 500px; position: absolute; left: 380px; top: 120px;">
<div class="clsText10">
<asp:TextBox ID="txtUsername" TabIndex="1" Width="160px" runat="server" ToolTip="Enter User Name"
MaxLength="100" Style="position: absolute; right: 130px; top: 5px;"></asp:TextBox>
<br />
<asp:TextBox ID="txtPassword" TabIndex="2" runat="server" ToolTip="Enter Password"
MaxLength="25" Width="160px" TextMode="Password" Style="position: absolute; right: 130px; top: 50px;"></asp:TextBox>
<br />
<asp:Label ID="Label1" runat="server" CssClass="clsText10"
Style="font-weight: bold; position: absolute; right: 120px; top: 85px;" Text="(Please note: Password values are case sensitive.)"></asp:Label>
<asp:Button ID="btnLogin" TabIndex="3" runat="server" Text="Login" CssClass="btn btn-primary"
ToolTip="Verify User Name and Password" OnClick="btnLogin_Click" Width="120"
Style="position: absolute; right: 180px; top: 180px;"></asp:Button>
<div>
<asp:Label ID="lblUsername" Text="User Name: " runat="server" Style="position: absolute; right: 310px; top: 5px;"></asp:Label>
<br />
<asp:Label ID="lblPassword" Text="Password: " runat="server" Style="position: absolute; right: 310px; top: 50px;"></asp:Label>
<br />
<asp:Label ID="txtError" runat="server" Visible="true" Style="z-index: 100; width: 450px; text-align: right; position: absolute; top: 115px; right: 130px;"></asp:Label>
</div>
</div>
</div>
</div>
</form>
</body>
</html>
使用代码隐藏页面,Login.aspx.cs:
using System;
namespace WebFormTesting
{
public partial class Login : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//
}
protected void btnLogin_Click(object sender, EventArgs e)
{
//
}
}
}