none
關於ASP.NET會使用記憶體與虛擬記憶體,有何不同? RRS feed

  • 問題

  • 筆者在執行中的ASP.NET網站觀察到如下圖:
    記憶體使用約 340MB
    但虛擬記憶體使用達 1.4 GB

    這兩者跟程式有何關聯:
    例如下使用  Session, Cache 會用到記憶體(我猜) ?
    做什麼動作時會使用到虛擬記憶體 ?

     

    2011年11月30日 上午 01:26

解答

  • 這個跟ASP.NET無關。虛擬記憶體是把硬碟當RAM來用。
    • 已提議為解答 MIS2000 Lab. _ 2011年12月5日 上午 08:28
    • 已標示為解答 robinliks 2011年12月5日 下午 09:46
    2011年11月30日 上午 01:29
    版主
  • 該 w3wp.exe 曾經向系統要記憶體達到 1.4 GB 多,但目前只使用到 337MB(錯)

     

    感謝阿尼提醒。


    該 w3wp.exe 向系統要記憶體達到 1.4GB(虛擬) + 337MB(實體)。

    記憶體的問題,我之前一直弄錯。後來雖然曾弄清楚些,但不細想的情況下還是會回到之前舊的錯誤觀念。

     

    • 已編輯 程湘之間 2011年11月30日 下午 02:31
    • 已提議為解答 Kimxinfo 2011年12月1日 上午 01:30
    • 已標示為解答 robinliks 2011年12月5日 下午 09:47
    2011年11月30日 上午 03:00
  • 虛擬記憶體是作業系統在管的, 不是程式管轄的範圍, 有關ASP.NET的記憶體使用可以參考:Understanding ASP.Net memory
    • 已提議為解答 MIS2000 Lab. _ 2011年12月5日 上午 08:28
    • 已標示為解答 robinliks 2011年12月5日 下午 09:58
    2011年11月30日 上午 09:22
  • 其實這還蠻容易發生的。

    常見如:使用 DataAdapter 將大量資料 Fill 到一個 DataSet,而該 DataSet 佔記憶體太大而無法被 GC 當成 0, 1 Generation 來回收記憶體了。

    總之,與記憶體回收機制有關。

    所以囉, IIS Application Pool 有預設回收 Process 的機制。

    2011年11月30日 上午 10:22
  • 記憶體跑這麼大真是好嚇人啊~

    先說記憶體:

    記憶體在電腦裡面是很珍貴的資源

    再程式運作的時候,為了補足記憶體的不足,會把硬碟當作記憶題來使用。把硬碟當記憶體使用的這個過程,就是所謂的【虛擬記憶體】了。

    兩者雖然速度可是差了好幾級。不過為了讓程式可以繼續執行,不會因記憶體不足而當掉。所以有必要時,電腦還是會把硬碟拿來當記憶體使用。

    ---

    不過您也用得太誇張了

    如果您真的又在Fill大量的資料,又或者您有什麼大量的資料往Session,Application裡面放

    那麼建議這樣做的必要性要研究一下。

    這樣肯定效能不好的(因為用了虛擬記憶體,代表用了大量的硬碟存取IO,速度肯定慢的)

    您可以考量這樣做的目的是什麼,如果是資料的整理(例如來自異質來源的資料要做整併),

    那麼可不可能把這樣的動作挪到資料庫的Server上,讓Server用更有效率的方式去做事情。

    而不是把資料全部丟到Web的主機去做整併的事情。

     

    由於不知道您的程式是為何會造成這樣,這只能靠您多思考一下可能的因素。要把它解決掉,否則您那台Web真是太辛苦了。如果還有別的Web專案在上面跑,可能資源都被您的程式給搶光了。

    加油~

     


    topcat(姍舞之間的極度凝聚)http://www.dotblogs.com.tw/topcat/
    2011年12月2日 上午 11:29
    版主

所有回覆

  • 這個跟ASP.NET無關。虛擬記憶體是把硬碟當RAM來用。
    • 已提議為解答 MIS2000 Lab. _ 2011年12月5日 上午 08:28
    • 已標示為解答 robinliks 2011年12月5日 下午 09:46
    2011年11月30日 上午 01:29
    版主
  • 看看有沒有幫助

    http://support.microsoft.com/kb/893660/en-us

     


    軟體開發領域裡區區一個迷途工程師
    MyBlog: http://www.dotblogs.com.tw/ian/
    開發ASP.NET您要瞭解的基楚
    2011年11月30日 上午 01:37
    版主
  • 該 w3wp.exe 曾經向系統要記憶體達到 1.4 GB 多,但目前只使用到 337MB(錯)

     

    感謝阿尼提醒。


    該 w3wp.exe 向系統要記憶體達到 1.4GB(虛擬) + 337MB(實體)。

    記憶體的問題,我之前一直弄錯。後來雖然曾弄清楚些,但不細想的情況下還是會回到之前舊的錯誤觀念。

     

    • 已編輯 程湘之間 2011年11月30日 下午 02:31
    • 已提議為解答 Kimxinfo 2011年12月1日 上午 01:30
    • 已標示為解答 robinliks 2011年12月5日 下午 09:47
    2011年11月30日 上午 03:00
  • 觀察虛擬記憶體似忽是持續漸長,不會下降

    可以讓 虛擬記憶體 回收 ?

    2011年11月30日 上午 08:34
  • 虛擬記憶體是作業系統在管的, 不是程式管轄的範圍, 有關ASP.NET的記憶體使用可以參考:Understanding ASP.Net memory
    • 已提議為解答 MIS2000 Lab. _ 2011年12月5日 上午 08:28
    • 已標示為解答 robinliks 2011年12月5日 下午 09:58
    2011年11月30日 上午 09:22
  • 您可以設定iis的application pool的回收時機哦!
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    2011年11月30日 上午 09:25
  • 虛擬記憶體似忽是持續漸長,不會下降

     

    這情況感覺得應該是程式寫的有問題,以致於資源用了,但使用後並未釋放

    看能不能找出是哪一個功能造成如此現象,這樣比較有可能找到問題根源並解決它

     




    軟體開發領域裡區區一個迷途工程師
    MyBlog: http://www.dotblogs.com.tw/ian/
    開發ASP.NET您要瞭解的基楚
    2011年11月30日 上午 09:58
    版主
  • 其實這還蠻容易發生的。

    常見如:使用 DataAdapter 將大量資料 Fill 到一個 DataSet,而該 DataSet 佔記憶體太大而無法被 GC 當成 0, 1 Generation 來回收記憶體了。

    總之,與記憶體回收機制有關。

    所以囉, IIS Application Pool 有預設回收 Process 的機制。

    2011年11月30日 上午 10:22
  • 應該是:該 w3wp.exe 曾經向系統要記憶體達到 1.4 GB 多,但目前只使用到 337MB。


    程湘大哥,關於這點有相關連結可供小弟研究嗎?

    因為您說的與我認知的不同,所以很想了解得徹底一點,謝謝您了。

     

    我的認知是現在就用了1.4G+337M,只是因為1.4G不常用所以寫入了虛擬記憶體裡面,例如使用者已不在線上,但Session還沒逾時之類的情況。

     

    2011年11月30日 上午 11:00
    版主
  • 應該是:該 w3wp.exe 曾經向系統要記憶體達到 1.4 GB 多,但目前只使用到 337MB。


    程湘大哥,關於這點有相關連結可供小弟研究嗎?

    因為您說的與我認知的不同,所以很想了解得徹底一點,謝謝您了。

     

    我的認知是現在就用了1.4G+337M,只是因為1.4G不常用所以寫入了虛擬記憶體裡面,例如使用者已不在線上,但Session還沒逾時之類的情況。

     

    我猜應該是虛擬記憶體就算沒在用了,也不會這麼快就釋放或回收。等到有需要的時候,才會去作回收或分配的動作。但數字仍會維持在剛剛用這麼多的虛擬記憶體。

    所以才會變成『曾經向系統要記憶體要這麼多』

     


    若您的程式碼有SQL injection的問題,在修改完畢之前,我不願意給您任何解答。因為解決了您的程式問題,造成更大的系統漏洞問題,還不如讓程式壞掉。

    請參考:SQL injection簡介與解決方式

    常用資源參考:
    小弟的blog: In 91,wiki: my wiki
    2011年11月30日 下午 12:41
    版主
  • Robin Li 李瑞彬您好,
    你的問題不知是否已獲得解答 ?

    歡迎提出來跟大家分享 。

     


    Windows 7 技術支援中心 - 在這裡全部都找得到!


    2011年12月2日 上午 03:31
    版主
  • 感謝大家解答,雖然我的網站問題尚未改善

    不過有點頭緒,還在測試中

    目前發生的源頭有可能是

    使用 DataAdapter 將大量資料 Fill 到一個 DataSet,而該 DataSet 佔記憶體太大而無法被 GC 當成 0, 1 Generation 來回收記憶體了。

    2011年12月2日 上午 08:03
  • 那就找到兇手在哪囉。

    DataAdapter/DataSet/DataTable本來就沒法子放太大的資料,有可能導致OutOfMemory exception,也容易影響到整個站台的運作。


    若您的程式碼有SQL injection的問題,在修改完畢之前,我不願意給您任何解答。因為解決了您的程式問題,造成更大的系統漏洞問題,還不如讓程式壞掉。

    請參考:SQL injection簡介與解決方式

    常用資源參考:
    小弟的blog: In 91,wiki: my wiki
    2011年12月2日 上午 08:09
    版主
  • 記憶體跑這麼大真是好嚇人啊~

    先說記憶體:

    記憶體在電腦裡面是很珍貴的資源

    再程式運作的時候,為了補足記憶體的不足,會把硬碟當作記憶題來使用。把硬碟當記憶體使用的這個過程,就是所謂的【虛擬記憶體】了。

    兩者雖然速度可是差了好幾級。不過為了讓程式可以繼續執行,不會因記憶體不足而當掉。所以有必要時,電腦還是會把硬碟拿來當記憶體使用。

    ---

    不過您也用得太誇張了

    如果您真的又在Fill大量的資料,又或者您有什麼大量的資料往Session,Application裡面放

    那麼建議這樣做的必要性要研究一下。

    這樣肯定效能不好的(因為用了虛擬記憶體,代表用了大量的硬碟存取IO,速度肯定慢的)

    您可以考量這樣做的目的是什麼,如果是資料的整理(例如來自異質來源的資料要做整併),

    那麼可不可能把這樣的動作挪到資料庫的Server上,讓Server用更有效率的方式去做事情。

    而不是把資料全部丟到Web的主機去做整併的事情。

     

    由於不知道您的程式是為何會造成這樣,這只能靠您多思考一下可能的因素。要把它解決掉,否則您那台Web真是太辛苦了。如果還有別的Web專案在上面跑,可能資源都被您的程式給搶光了。

    加油~

     


    topcat(姍舞之間的極度凝聚)http://www.dotblogs.com.tw/topcat/
    2011年12月2日 上午 11:29
    版主
  • 85k以上算大型物件,但是不代表就不會被回收。

    我覺得你的狀況是Memory Leak,你得想辦法把memory dump出來找問題。

    2011年12月2日 下午 12:07
    版主
  • 我會認為他放在 Session 或全域變數內。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年12月2日 下午 12:49