2011-07-22 34 views
0

我想了解用C#編寫的應用程序中發生了什麼。以下是幾個從性能監視器拍攝的圖像。藍線在所有堆中都是#Bytes。綠線是大對象堆大小。我啓動應用程序並登錄。該應用程序保持閒置狀態。第一張圖片顯示,由於某種原因,LOH增加,然後下降。一個模式非常清楚。什麼是這種行爲的責任?C#Windows Form應用程序中的奇怪內存使用模式

enter image description here

更多。我通過ODP.NET使用Oracle數據庫從A開始執行一些繁重的處理(參見下圖)。之後,應用程序保持空閒狀態。 LOH不會下降。相反,它由於某種原因而不斷增加。請注意,該應用程序是空閒的。它只是在我的桌面上打開。我甚至沒有與它互動。

enter image description here

記憶保持增加(每個圖像代表1點15分00秒)。

enter image description here

後超過2小時突然它降低,雖然它開始增加後/再次降低(見下文)作爲第一圖像英寸所有的時間都是空閒的。到底是怎麼回事?這是內存泄漏嗎?我不這麼認爲。我們對該應用進行了分析並找不到任何內容。此外,LOH增加而沒有任何活動。沒有與Oracle數據庫的開放連接。 ODP.NET可能是罪魁禍首嗎?

enter image description here

+0

不要真的相信有人可以幫助你。太項目特定的東西。 – Tigran

+4

使用分析器。 –

+0

我們正在使用一個分析器,我們無法發現任何異常。重點是:GC下正在發生一些事情。爲什麼在應用程序閒置時內存分配增加,以及爲什麼內存突然減少。如果我只是登錄,應用程序會顯示分配/釋放模式,這是沒有意義的。這是幹什麼的? –

回答

0

的問題肯定是因爲ODP.NET。如果我禁用連接池,則問題不會顯示。對於每個連接,ODP.NET似乎創建2個線程,間隔3分鐘(如圖中所示),ODP.NET做了一些管理工作,但由於某種原因分配的內存不會立即釋放。

很容易重現。只需創建一個簡單的應用程序,當按下按鈕時,將打開與Oracle數據庫的連接並執行存儲過程。你會注意到第一幅圖像的圖案。其他圖像的模式是由應用程序創建的連接數量造成的。

相關問題