2010-07-29 46 views
2

是否可以恢复从w3wp.exe丢失的内存?我认为session.abandon()应该清理那样的资源?事情是我有一个Web应用程序,某些页面使w3wp.exe显着增长。从40 MB到400 MB。现在,我将严格优化我的代码以减少这种情况,但是,对于w3wp.exe的增长量,即使用户注销并关闭了浏览器,是否仍无法恢复丢失的内存?从w3wp.exe恢复内存

我知道这个工作进程会在空闲使用30分钟(默认)后回收,但是如果长时间没有空闲使用时间并且工作进程仍然有这部分内存,它会一直保持生长?任何想法的人?

+0

当您在关闭旧会话后开始新会话时,您是否看到服务的内存占用增长? – Achilles 2010-07-29 13:38:12

+0

是的。即使在用户注销(session.abandon())后,我的w3wp.exe也会在特定页面上达到400MB,但下一个用户进入后,访问该页面并将w3wp.exe转换为700Mb。 – xeshu 2010-07-29 14:09:38

+0

看来你在会话中投入了大量的数据。相反,使用文件或数据库来存储大量数据。 – 2010-07-29 14:12:08

回答

0

垃圾收集器将处理任何需要释放的内存,只要您正确地处理事情等。GC每次呼叫Session.Abandon()时都不会立即启动,因为这将是一个主要表现来袭。也就是说,每个应用程序都有一个“正常的”内存使用情况,即稳定的内存使用情况(同样,假设您没有泄漏),并且这个数字对于每个应用程序都是不同的。 400MB可能很多,或者它可能什么都不是,取决于你的应用的功能。我的应用程序徘徊在400MB左右,其他人则在1.5GB左右,只要内存使用量稳定在某个位置,就可以了。如果你看到无限的内存使用情况,那么你很可能在你的应用程序的某处发生了泄漏。

将大量数据存储在进程内会话中也可以快速消耗内存使用量。而是使用文件或数据库来存储这些数据。

+0

基本上,我根本没有处理任何物体。我认为c#的'使用'部分应该照顾处理业务?是的,我的生产部署不会执行session.abandon()。我刚刚意识到这一点,并将把它放在代码上,但这可能没有多大用处,因为99.9%的用户并不真正打开注销按钮,他们只是简单地关闭浏览器。 – xeshu 2010-07-29 14:12:02

0

除非您泄漏内存,否则内存管理器将重新使用此内存,因此您不应该看到进程内存不断增长。

+0

嗯重新使用,现在这是一个有趣的概念... – xeshu 2010-07-29 14:10:38