У нас есть приложение MVC с трафиком около 800 пользователей в день, в последнее время мы наблюдаем, что наш пул приложений прекращается сам по себе. Переходя к журналам, мы обнаружили MemoryOutOfException. Мы не смогли понять, почему это может происходить, поэтому мы просмотрели код. Во время обзора кода мы выяснили, что у нас есть статические классы, статические методы/методы расширения. У нас нет никаких статических переменных, и мы используем блок для размещения DbContext. Возможно ли, что наши статические методы класса/статики являются причиной проблем с памятью?Использование статических методов и статических классов в веб-приложениях - Следует ли его избегать?
Как создаются экземпляры внутри статических методов и классов? Собираются ли они GC?
Пожалуйста, предложите, что еще мы можем сделать, чтобы выяснить проблему.
EDIT Извините, что не предоставили никаких кодов. Я хочу понять жизненный цикл статического класса в веб-приложении. Могут ли они создать проблему, если я выполняю сложную операцию, которая занимает память?
Например, если я перевести мою модель домена для просмотра модели в моем статическом классе, как так:
public static class PersonTranslator{
public static PersonVM (this Person p)
{
return new PersonVM{
Name = p.Name,
//etc...
//lots of property here
}
}
}
Это хорошая практика, или я должен просто использовать обычные классы, а буду для методов расширения. Может ли код как это создавать проблемы?
Благодаря
EDIT 2: контекста Нашей дб реализуется в базовом классе и весь класс доступа к данным derieve от него. Я думаю (и я могу ошибаться), что здесь что-то не так.
public class DataAccessBase : IDisposable
{
protected ApplicationDataContext dataContext = null;
public DataAccessBase()
{
dataContext = new ApplicationDataContext();
}
public DataAccessBase(ApplicationDataContext dataContext)
{
if (dataContext == null)
dataContext = new ApplicationDataContext();
this.dataContext = dataContext;
}
~DataAccessBase()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
// The bulk of the clean-up code is implemented in Dispose(bool)
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// free managed resources
}
// get rid of unmanaged resources
if (dataContext != null)
{
dataContext.Dispose();
}
}
}
Как мы можем ответить на этот вопрос, не видя никакого кода? –
Возможно, вам будет полезно: http://blogs.msdn.com/b/webtopics/archive/2009/05/22/troubleshooting-system.outofmemoryexceptions-in-asp.net.aspx –
@GertArnold: Извините, что не делитесь код. Пожалуйста, см. Мое редактирование –