内存堆栈没有充分理由?

时间:2013-11-08 10:03:06

标签: c# string memory garbage-collection

您好我正在构建一个c#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);

收集声明后也是如此。

我哪里错了我错过了什么,或者我该怎样做以确保这些字符串不会在我的记忆中长久存在?

提前感谢您的时间。

在请求更多代码之后,这是我最终用作“查询构建器”的内容,listSelect是之前提到的List。

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仍在使用它?

1 个答案:

答案 0 :(得分:2)

您正在观察垃圾收集器正在完成其工作。当它需要回收内存时,就会这样做。

除非您遇到性能问题,否则可以使用内存并且您的应用程序运行正常。你不需要尝试修复没有破坏的东西。