aspnet开发的新站点,发现aspnet_wp.exe内存不断上升,很快就到400多M,服务器就出现异常,非常缓慢。
aspnet_wp.exe (PID: 1900)被回收,因为内存消耗超过了 306 MB (可用 RAM 的百分之 60)。 这个过程需要1-3分钟时间。这期间无法访问网站, 会提示:服务器忙!
网上搜索了一下,很多人遇到这个问题。但是都没有完善的解决办法。
听说如果服务器是2003就能解决这个问题,不知道是不是真的。
有没有人遇到这个问题,如何解决的啊?
aspnet_wp.exe (PID: 1900)被回收,因为内存消耗超过了 306 MB (可用 RAM 的百分之 60)。 这个过程需要1-3分钟时间。这期间无法访问网站, 会提示:服务器忙!
网上搜索了一下,很多人遇到这个问题。但是都没有完善的解决办法。
听说如果服务器是2003就能解决这个问题,不知道是不是真的。
有没有人遇到这个问题,如何解决的啊?
解决方案 »
- 怎么回事?未能加载文件或程序集“System.ServiceModel“
- 二级表头
- 我用ASP.NET 基于三层架构 谢了一个小网站,怎么在局域网里面发布啊,求高手指点啊。。。
- 初学者请教某网站内的3个效果如何实现
- janus的问题求解!!
- <script></script>出问题
- 为什么TreeView 中的SelectedIndexChange为什么不执行??
- datagrid问题
- 北京你好众娱文化传播有限公司急速招聘
- 求教查询结果的输出问题!!!!!!!!!!!!!!!!!!
- DataGrid中UpdateCommand自定义textbox的问题!!!不能用啊!!!
- 我想在datagrid中显示空白行
你设置了回收选项.在应用程序池..首先还是要看程序是不是有打开没有关闭的联连..这样联接数多的话CPU就会上升...用2003也有应用程序池..不过性能和安全性应该比2000好点(个人认为.当然还要看自己怎么设法)
2.数据库资源及时关闭
3.适当的时候调用System.GC.Collect();方法,手动回收资源.
比如:dataset ds = ...
ds.dispose();
MemberAccount account = new MemberAccount();
...
account = null;
hashtable htbl = new hashtable();
...
htbl = null;...这样内存增加速度慢了一点点。还是持续增加。我10分钟强制内存回收:System.GC.Collect();
这样也没一点效果。
dataset ds = ...
ds.dispose();
MemberAccount account = new MemberAccount();
...
account = null;
hashtable htbl = new hashtable();
...
htbl = null;...应该用using,using才能保证必然释放。另外递归中的局部变量一定要保持苗条。如:
using ( DataSet ds = ... )
{}
不过你的URL是解决CPU100%问题。我现在是内存上升。CPU正常。
总之优化程序吧。
我同事的机器也有过 你所说的现象而且你的机器装了Visual source safe了吗
{
Hashtable htbl = new Hashtable();
htbl.Add("Item2", dropItem.StsItem);
htbl.Add("Title", txtTitle.Text);
htbl.Add("Commend", radlCommend.SelectedItem.Value);
htbl.Add("PostDate1", txtBDate.Text);
htbl.Add("PostDate2", txtEDate.Text); int pageIndex=pageNewsList.PageIndex;
if(pageIndex==0)pageIndex=1; NewsOperate newscontent=new NewsOperate();
RecordSet rs=newscontent.GetNewsContentList("NewsContentList",htbl,"none",pageIndex,30);
dgrdNewsList.DataSource=rs;
dgrdNewsList.DataBind();
pageNewsList.PageCount = rs.PageCount;
pageNewsList.PageIndex = rs.PageIndex;
pageNewsList.RecordCount = rs.RecordCount;
rs.Clear();
rs.Dispose();
newscontent = null;
htbl = null;
} 贴上一段新闻搜索代码,
public RecordSet GetNewsContentList(string str, Hashtable htbl,string orderName, int pageIndex, int pageSize)
{
NewsContentDB accountDB = new NewsContentDB();
RecordSet rs = accountDB.Record(str,htbl,orderName,pageIndex,pageSize);
return rs;
}
/// <summary>
/// 记录集(带分页信息)
/// </summary>
/// <param name="str">DataSet名</param>
/// <param name="htbl">参数值</param>
/// <param name="orderType">排序方式,1为降序,0为升序</param>
/// <param name="pageIndex">页码</param>
/// <param name="pageSize">每页记录数</param>
/// <returns>返回一个数据集RecordSet</returns>
public virtual RecordSet Record(string str, Hashtable htbl, string orderName, int pageIndex, int pageSize)
{
SqlParameter[] parms = GetRecordParameters(htbl);
SqlParameter[] pparms=new SqlParameter[]{
new SqlParameter("@OrderName",SqlDbType.VarChar,20),
new SqlParameter("@PageIndex",SqlDbType.Int),
new SqlParameter("@PageSize",SqlDbType.Int),
new SqlParameter("@PageCount",SqlDbType.Int),
new SqlParameter("@RecordCount",SqlDbType.Int)
};
pparms[0].Value=orderName;
pparms[1].Value=pageIndex;
pparms[2].Value=pageSize;
pparms[3].Direction=ParameterDirection.Output;
pparms[4].Direction=ParameterDirection.Output; SqlCommand cmd = new SqlCommand();
SqlConnection conn = new SqlConnection(SQLHelper.CONN_STRING_NON_DTC); SQLHelper.PrepareCommand(cmd, conn, null, CommandType.StoredProcedure, RecordSP, parms);
foreach(SqlParameter parm in pparms)
{
cmd.Parameters.Add(parm);
} SqlDataAdapter dap= new SqlDataAdapter();
dap.SelectCommand = cmd;
cmd.ExecuteNonQuery(); RecordSet rst = new RecordSet(pageSize, pageIndex, Convert.ToInt32(cmd.Parameters["@PageCount"].Value), Convert.ToInt32(cmd.Parameters["@RecordCount"].Value)); dap.Fill(rst); conn.Close(); return rst;
}
public static DataSet ExecuteDataset(string DataSetName, string connString, CommandType cmdType, string cmdText, params SqlParameter[] cmdParms)
{
SqlCommand cmd = new SqlCommand();
SqlConnection conn = new SqlConnection(connString); try
{
PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
SqlDataAdapter dap= new SqlDataAdapter();
dap.SelectCommand = cmd;
DataSet dst = new DataSet(DataSetName); dap.Fill(dst); conn.Close();
return dst;
}
catch(Exception e)
{
conn.Close();
SystemLogs.WriteLog(e.ToString());
throw;
}
}
不要这样写,试试htbl.Dispose();
1、如果你的服务器只做web应用,且内存512M还有剩余的话,可以考虑增大aspnet进程的内存限制,默认为60%,超过aspnet就会自动回收,然后重新启动一个aspnet进程提供服务,在machine.config里适当增大memoryLimit的比率(如80%)或IIS(6.0)设定回收上限。注意:aspnet在不启动3gb开关的情况下,只能用到800M,楼主这里就不存在这种情况,不用考虑。2、多个CPU或超线程CPU,内存足够的话,可以考虑启动webgarden,每个CPU启用一个进程。应用
1、对资源的使用、释放要及时,对数据库的连接是否及时释放,可以监控db server的connection确定。2、如果启用了db connectio pool,对pool池的大小控制一下(通常不会超过100个)。3、监测asp.net的0代、1代、2代对象的数目,判定是否适当的进行了释放,条件允许的话,使用clr profiler探测aspnet活动内存究竟是怎样分配掉的。4、是否存在大量的缓冲对象,大量的字串操作(str1+str2)使用StringBuilder。5、使用try finally 及时释放database connections, data readers, files, streams, network connections, and COM object