假设您使用的是共享主机方案,而您的应用程序会存储大量对象 在申请状态。
如果他们开始占用太多内存,这是否意味着服务器会删除它们?
如果不是会发生什么呢?当服务器没有内存时会发生什么?你还可以将对象存储到应用程序或会话状态吗?
我问这个是因为我正在计划开发一个依赖于应用程序状态的大型站点,并且存储在那里的对象不会被破坏是至关重要的。 我担心的是,在某个时刻,我可能在应用程序状态中有太多对象,并且可能会被删除以释放内存。
答案 0 :(得分:3)
有三种不同的阈值:
您的应用的总大小超过了计算机上的最大进程大小(实际上仅适用于x86操作系统)。在这种情况下,您首先会开始出现内存不足错误,通常会在进程崩溃后很快发生。
您的进程以及计算机上运行的所有其他内容不再适合物理内存。在这种情况下,机器将开始翻页,通常会导致性能极差。
您的进程超过IIS自身通过IIS管理器强加的内存限制。在这种情况下,该过程将被杀死并重新启动,就像常规的AppPool回收一样。
使用Application对象,如果您接近上述任何阈值,则不会自动删除条目。使用Cache
对象,可以删除它们,具体取决于您指定的优先级。
正如其他人所说,过度使用Application对象通常不是一个好主意,因为它不可扩展。如果您要添加第二个负载均衡的服务器,那么将信息从一个服务器同步到另一个服务器变得非常具有挑战性。
答案 1 :(得分:1)
当任何应用程序在计算机上占用过多内存时会发生什么?
它会导致服务器运行速度非常慢。甚至是共享计算机的其他站点。
将这么多存储在应用程序状态中并不是一个好主意。使用配置文件和/或数据库。
答案 2 :(得分:1)
听起来你有内存泄漏,进程一直在泄漏内存,直到它因内存不足而崩溃,然后由服务器自动重启。
1.5GB大约是32位进程在用完地址空间之前可以分配的最大内存量。
要寻找的事情:
你自己做缓存吗?什么时候 从缓存中删除的项目?
是否有某些数据被添加到a 每隔一段时间收集一次但是 从未删除?
您是否在每个对象上调用Dispose 实现IDisposable?
您是否访问过任何非托管代码? all(COM对象或使用DllImport) 或分配非托管内存(使用 以元帅级为例)? 那里分配的任何东西都是 从未被垃圾收集者释放, 你必须自己解放。
您是否使用第三方库或任何 来自第三方的代码?它可以有 列表中的任何问题。
答案 3 :(得分:1)
如果使用Cache对象而不是Application对象,则可以最大限度地减少内存不足的问题。如果ASP.Net工作进程的内存利用率接近进程将自动退回的点(回收限制),则将清除Cache中的内存。首先删除尚未使用一段时间的项目,这可能会阻止进程回收。如果数据存储在应用程序中,ASP.Net无法阻止进程回收,并且所有应用程序状态都将丢失。
但是,您需要有一种重新填充Cache对象的方法。您可以通过将缓存的数据保存在数据库中来实现,正如其他人提出的那样。
这是一个short article,它有一个很好的代码示例来处理Cache。
这里有video如何使用缓存。
答案 4 :(得分:0)
存储在应用程序状态的任何内容都应该是可刷新的,并且需要以文件或数据库中的当前状态保存。如果没有其他事情发生,IIS每天至少重启一次工作进程,因此应用程序状态中的任何内容都不会永远存在。
如果你的内存不足,你可能会遇到内存不足的异常。您还可以监视内存使用情况,但在共享主机环境中,这可能不足以避免出现问题。并且您可以将工作流程作为“非自愿”修复进行回收。
如果你说在应用程序状态下存储的对象不会被破坏是至关重要的,那么听起来好像是在为自己设置麻烦。
答案 5 :(得分:0)
我认为您应该使用session而不是应用程序状态并将该会话存储到sql server数据库中。因此,一旦您的应用程序用户结束其将释放您的内存的会话。
如果您需要更具体的答案,请提供有关您的申请的更多信息。