2015-08-22 61 views
-1

我們有一個每天約有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(); 

      } 


     } 
    } 
+0

我們怎樣才能在沒有看到任何代碼的情況下回答這個問題? –

+0

這可能會有所幫助:http://blogs.msdn.com/b/webtopics/archive/2009/05/22/troubleshooting-system.outofmemoryexceptions-in-asp.net.aspx –

+0

@GertArnold:對不起,沒有分享碼。請參閱我的編輯 –

回答

0

坦白地說這可能是任何東西:

  • 多少RAM你們的服務器有哪些?
  • 服務器上有多少個其他網站正在運行?
  • 您使用緩存的程度如何?
  • 您正在使用什麼類型的會話存儲,以及允許用戶在會話中存儲什麼?

此時,Id建議使用性能嚮導來分析您的應用程序。通常情況下,你會在生產之前完成這些工作,並且已經安裝了應用程序,因爲如何才能決定應用程序需要的服務器/虛擬機的大小?

enter image description here

.NET內存分配給你洞察 應用程序的內存管理,因爲它分析從 建立垃圾收集在內存中的對象。顯示器可以以兩種不同的方式工作。第一個也是影響較小的是通過抽樣。它也可以通過在代碼中加入 的工具深入瞭解二進制文件以跟蹤內存工作。

你也可以考慮在服務器上使用性​​能計數器和perfmon。至少你應該在AppPool被drop.i.e之前得到警報。例如,容量的80%。

它甚至可能沒有「代碼」問題。您可能剛剛低估了運行網站所需的資源類型(考慮增長模式),因爲如果沒有進行性能分析預生產,則可能只是猜測您實際需要的內容。

相關問題