我們有一個每天約有800個用戶的MVC應用程序,最近我們觀察到我們的應用程序池正在自行停止。去日誌我們發現MemoryOutOfException。我們無法弄清楚爲什麼會發生這種情況,所以我們進行了代碼審查。在代碼審查期間,我們發現我們有靜態類,靜態方法/擴展方法。我們沒有任何靜態變量,我們正在使用block來處理DbContext。 那麼有可能我們的靜態類/靜態方法成爲內存問題的原因?在Web應用程序中使用靜態方法和靜態類 - 是否應該避免?
如何在靜態方法和類內部創建實例?他們是通過GC收集的嗎?
請建議我們可以做些什麼來找出問題。
編輯 抱歉,我們無法分享任何代碼。 我想了解Web應用程序中靜態類的生命週期。如果我正在進行需要記憶的複雜操作,他們會產生問題嗎?
例如,如果我翻譯我的域模型視圖模型我的靜態類中,像這樣:
public static class PersonTranslator{
public static PersonVM (this Person p)
{
return new PersonVM{
Name = p.Name,
//etc...
//lots of property here
}
}
}
它是一個很好的做法,或者我應該只使用普通類,而對於去擴展 方法。像這樣的代碼可以創建問題?
由於
編輯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:對不起,沒有分享碼。請參閱我的編輯 –