您好,我正在构建 ac# Web 应用程序,它需要对每个页面请求进行大量检查。现在我需要缓存这些产品的产品信息和属性,以便堆积内存(显然)。但是当我重新加载一个包含很多产品的页面时,它会将一些带有这些产品名称的 Sql 请求转换为字符串。我注意到字符串占用了大量内存,但是当我准备好使用这些字符串(在本地创建)时,用于这些字符串的内存会不断增加,直到某个(随机)点下降。然后它又开始建立起来。
我使用 .NET Memory Profiler 来分析内存使用情况,它指出 System.String 甚至比缓存的产品和属性使用更多。
在这种情况下,我优化了一些构建大量内存的字符串:
优化前
string selectSql = "";
for(var i = 0; i < products.count;i++)
{
selectSql += "'"+products[i].Name+"', ";
}
优化后
List<string> listSelect = new List<string>();
for(var i = 0; i < products.count;i++)
{
listSelect.Add(products[i].Name);
}
string joined = "'" + String.Join("', '", listSelect) + "'";
但是据我所见,我没有使用很多会建立那么多内存的情况,我该如何清除该内存?
我不能使用:
GC.Collect();
或者至少有很多人建议反对这种方法,因为它只会提示垃圾收集,而在我的情况下,它不会清理内存。我已经检查过了
GC.GetTotalMemory(true);
在 Collect 语句之后也是如此。
我哪里错了我错过了什么或者我能做些什么来确保这些字符串不会在我的记忆中很长时间?
在此先感谢您的时间。
在请求更多代码之后,我最终将其用作“查询构建器”,listSelect 是前面提到的列表。
StringBuilder sb = new StringBuilder();
sb.Append("SELECT pr.* FROM products pr");
sb.Append("HAVING pr.Name IN(" + "'" + String.Join("', '", listSelect) + "'" + ") ");
sb.Append("ORDER BY pr.`Prijs` ASC LIMIT 1");
db.Sql = sb.ToString();
但是当我做 db.Sql = sb.ToString(); 这不就占用了与创建字符串一样多的内存吗?还是 StringBuilder 仍在以一种好的方式使用它?