程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> 三個關鍵命令找出ASP.NET程序內存分片的原因

三個關鍵命令找出ASP.NET程序內存分片的原因

編輯:關於ASP.NET

最近一位朋友的ASP.NET程序懷疑有內存洩露問題。幾個簡單的頁面,起來運行幾分鐘後,虛擬內存就到600多MB。從性能監視上看,private bytes只有200多MB。

這樣的問題從經驗上來說,十有八九都是內存碎片了。ASP.NET程序發生內存碎片的原因比較多,我常見的有:

1.Web.config中的debug=true,導致batch compilation=false,使得每一個ASPX頁面都生成一個臨時assembly。當頁面比較多的時候,大量的assembly導致內存洩露。

2.程序中誤用了XmlSerializer。頻繁的XML序列化導致大量的動態assembly

3.程序中有大量的blocking IO操作,而且IO buffer沒有及時釋放。比如程序中有大量的Web Service調用,但是對方web service返回比較慢,使得調用程序中用來接收web service結果的小塊buffer大量堆積,導致內存洩露

下面是我拿到dump後的分析步驟。對於managed程序,找出問題的大致線索還是挺簡單的。

(隨便無恥地推銷下,《Windows高效排錯》書中對這樣的問題有更多的討論。包括更多的案例和命令解釋。該書最初的PDF草稿在http://www.cnblogs.com/lixiong/archive/2006/08/16/475520.html。如果有朋友從這個PDF中找到過排錯的靈感,麻煩也幫忙無恥推銷下。)

首先是看看CLR的版本了。這個直接看mscorwks文件或者mscorsrv文件。如果文件版本比較低,後面的就沒必要仔細看了,升級CLR補丁後再說。

0:000> lmvm mscorwks
start  end    module name
79e70000 7a3d6000  mscorwks  (deferred)      
  Image path: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
  Image name: mscorwks.dll
  Timestamp:    Fri Apr 13 15:15:54 2007 (461F2E2A)
  CheckSum:     00564CA8
  ImageSize:    00566000
  File version:   2.0.50727.832
  Product version: 2.0.50727.832
  File flags:    0 (Mask 3F)
  File OS:     4 Unknown Win32
  File type:    2.0 Dll
  File date:    00000000.00000000
  Translations:   0409.04b0
  CompanyName:   Microsoft Corporation
  ProductName:   Microsoft® .NET Framework
  InternalName:   mscorwks.dll
  OriginalFilename: mscorwks.dll
  ProductVersion:  2.0.50727.832
  FileVersion:   2.0.50727.832 (QFE.050727-8300)
  FileDescription: Microsoft .NET Runtime Common Language Runtime - WorkStation
  LegalCopyright:  © Microsoft Corporation. All rights reserved.
  Comments:     Flavor=Retail

恩,版本還是比較新的。既然是內存問題,先看GC中有多少object,占用了多少內存

0:000> !eeheap -gc
Number of GC Heaps: 4
------------------------------
Heap 0 (000f3f10)
generation 0 starts at 0x02fad2fc
generation 1 starts at 0x02f83ff8
generation 2 starts at 0x02f00038
ephemeral segment allocation context: none
segment  begin allocated   size
00109198 7a72c42c 7a74d308 0x00020edc(134876)
000fdfb0 790d5588 790f4b38 0x0001f5b0(128432)
02f00000 02f00038 03081450 0x00181418(1578008)
Large object heap starts at 0x12f00038
segment  begin allocated   size
12f00000 12f00038 131b00a0 0x002b0068(2818152)
Heap Size 0x47190c(4659468)
------------------------------
Heap 1 (000f50a0)
generation 0 starts at 0x06f5b110
generation 1 starts at 0x06f5acf8
generation 2 starts at 0x06f00038
ephemeral segment allocation context: none
segment  begin allocated   size
06f00000 06f00038 06ff511c 0x000f50e4(1003748)
Large object heap starts at 0x14f00038
segment  begin allocated   size
14f00000 14f00038 14f00048 0x00000010(16)
Heap Size  0xf50f4(1003764)
------------------------------
Heap 2 (000f68a0)
generation 0 starts at 0x0af78634
generation 1 starts at 0x0af09d40
generation 2 starts at 0x0af00038
ephemeral segment allocation context: none
segment  begin allocated   size
0af00000 0af00038 0af92a0c 0x000929d4(600532)
Large object heap starts at 0x16f00038
segment  begin allocated   size
16f00000 16f00038 16f00048 0x00000010(16)
Heap Size  0x929e4(600548)
------------------------------
Heap 3 (000f7bc8)
generation 0 starts at 0x0ef7b270
generation 1 starts at 0x0ef7b264
generation 2 starts at 0x0ef00038
ephemeral segment allocation context: none
segment  begin allocated   size
0ef00000 0ef00038 0ef7d27c 0x0007d244(512580)
Large object heap starts at 0x18f00038
segment  begin allocated   size
18f00000 18f00038 18f00048 0x00000010(16)
Heap Size  0x7d254(512596)
------------------------------
GC Heap Size 0x676638(6776376)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved