静态字符串变量即使在null时也占用内存空间?

时间:2015-06-03 07:43:59

标签: c# asp.net

我的要求是将一些参数从一个函数传递到另一个页面。 我考虑了两种方法:1)会话,2)查询字符串。

已知会话会增加服务器上的负载,因为它会与查询字符串相关联。

这是从url中提取参数值的方法(在使用查询字符串之后)

sdp

如果我在使用后将它们分配为null,这些字符串会导致加载内存吗?在内存分配和服务器性能方面,使用会话比查询字符串更好。

3 个答案:

答案 0 :(得分:2)

首先,这些字符串使用的内存在宏观方案中可能相当小,所以可能不值得失去大量的睡眠。

就会话与查询字符串而言,会话变量将在用户会话期间保持不变。还要考虑托管环境是否可以支持会话状态。

此外,您的查询字符串变量无论如何都将作为请求对象的一部分保留。

答案 1 :(得分:1)

我不认为内存消耗是决定是使用查询字符串参数还是会话变量的主要标准。在您的示例中,无论如何变量都是静态的,因此内存消耗不应取决于用户数。请注意,静态变量在Web应用程序中可能会产生各种意外影响,因为它们在所有用户之间共享。

通常,我更喜欢使用查询字符串参数将数据传输到某个页面。查询字符串参数的范围限定为请求,因此它们仅可用于请求的页面,而会话变量可从任何页面访问。

此外,查询字符串参数占用的内存在请求后自动释放,而如果您想要在内存消耗方面非常高效,则需要删除会话变量。当然,如果用户不再活动,会话将超时,但根据您的配置,这可能会导致浪费内存半小时。

没有例外的规则:如果满足以下条件之一,我将使用会话变量而不是查询字符串参数:

  1. 数据是安全关键的:会话变量存储在服务器上,而查询字符串参数传输到客户端并在浏览器中可见。
  2. 如果要将大量数据传输到另一页,那么将数据保存在服务器上也更有效。在某些浏览器中,查询字符串的长度有限制,因此有时您无法使用它。
  3. 数据在应用程序中广泛使用(广泛用于“几乎每一页”),因此查询字符串参数必须一遍又一遍地重复。

答案 2 :(得分:1)

  

即使为null,静态字符串变量是否会占用内存空间?

技术上,是的:所有变量至少具有机器的指针大小。由于它们(当前)是静态的,因此该指针将保持不变,直到您的站点被IIS空闲超时关闭。但每个变量只有一个指针,无论有多少请求。值得花时间考虑。

如果之后将它们设置为null,则内容使用的内存应稍后由GC释放,但指针将保留。

如果你不使用静态,那么一旦它们超出范围,它们就会被释放。

会话总是有额外的开销(尤其是为其配置选择选项),您仍然需要首先将值放入会话中。如果它们仅用于单个请求,那么就不需要将它们放入会话中(理想情况下,它用于在多个请求中存储值)。

不是主题,但值得注意的是: 静态变量在所有请求中共享,因此可能(可能?)如果同时发出两个请求,则一个将从另一个请求获取查询字符串参数,更有可能是在设置值后处理时间越长。最好的建议是使这些非静态,只需根据需要重新创建它们,或者在需要时以多种方法传递它们。