閱界資訊

記一次 .NET 某珠寶公司內部管理系統 內存暴漲分析

閱閱界編輯部1閱讀7分鐘

《記一次 .NET 某珠寶公司內部管理系統 內存暴漲分析》這篇在博客園熱度很高,講的正是大家天天碰到的事。下面幫你把要點捋出來,結尾有能直接抄的結論。

一:背景 1. 講故事 好久都沒寫文章了,看現在各個社區大多都是AI寫的文章,劣幣驅除良幣,文字這塊算是淪陷了,沒多少 passion to continue,但遇到一些經典的還是會人肉堆一堆,這篇我們就來分析一個 內存暴漲 的例子,這是一個朋友在微信上找到我的,有一個linux上的.NET程序,內存在一直暴漲,發現非託管內存佔用不少,讓我幫忙看下咋回事。 二:內存暴漲分析 1. 爲什麼會暴漲 既然是Linux上的dump,用傳統的 !address -summary 就不靠譜了,這裏就需要用 !maddress 命令去看看,截圖如下: [代碼示例略] 從卦中可以看到,程序總計喫了 3.07G ,其中 GCHeap 和 PAGE_READWRITE 喫的差不多,看起來不大樂觀,要先追蹤 PAGE_READWRITE 的調用棧,在 linux 上不是那麼容易的。

一:背景 1. 講故事 好久都沒寫文章了,看現在各個社區大多都是AI寫的文章,劣幣驅除良幣,文字這塊算是淪陷了,沒多少 passion to continue,但遇到一些經典的還是會人肉堆一堆,這篇我們就來分析一個 內存暴漲 的例子,這是一個朋友在微信上找到我的,有一個linux上的.NET程序,內存在一直暴漲,發現非託管內存佔用不少,讓我幫忙看下咋回事。 二:內存暴漲分析 1. 爲什麼會暴漲 既然是Linux上的dump,用傳統的 !address -summary 就不靠譜了,這裏就需要用 !maddress 命令去看看,截圖如下: [代碼示例略] 從卦中可以看到,程序總計喫了 3.07G ,其中 GCHeap 和 PAGE_READWRITE 喫的差不多,看起來不大樂觀,要先追蹤 PAGE_READWRITE 的調用棧,在 linux 上不是那麼容易的。 2. 從託管堆入手 接下來怎麼辦呢?

一:背景 1. 講故事 好久都沒寫文章了,看現在各個社區大多都是AI寫的文章,劣幣驅除良幣,文字這塊算是淪陷了,沒多少 passion to continue,但遇到一些經典的還是會人肉堆一堆,這篇我們就來分析一個 內存暴漲 的例子,這是一個朋友在微信上找到我的,有一個linux上的.NET程序,內存在一直暴漲,發現非託管內存佔用不少,讓我幫忙看下咋回事。 二:內存暴漲分析 1. 爲什麼會暴漲 既然是Linux上的dump,用傳統的 !address -summary 就不靠譜了,這裏就需要用 !maddress 命令去看看,截圖如下: [代碼示例略] 從卦中可以看到,程序總計喫了 3.07G ,其中 GCHeap 和 PAGE_READWRITE 喫的差不多,看起來不大樂觀,要先追蹤 PAGE_READWRITE 的調用棧,在 linux 上不是那麼容易的。 2. 從託管堆入手 接下來怎麼辦呢?先死馬當做活馬醫,因爲畢竟是託管程序,很多非託管內存的root都和託管堆對象有關,本着這個思想,先用 !dumpheap -stat 觀察下託管堆看看。

一:背景 1. 講故事 好久都沒寫文章了,看現在各個社區大多都是AI寫的文章,劣幣驅除良幣,文字這塊算是淪陷了,沒多少 passion to continue,但遇到一些經典的還是會人肉堆一堆,這篇我們就來分析一個 內存暴漲 的例子,這是一個朋友在微信上找到我的,有一個linux上的.NET程序,內存在一直暴漲,發現非託管內存佔用不少,讓我幫忙看下咋回事。 二:內存暴漲分析 1. 爲什麼會暴漲 既然是Linux上的dump,用傳統的 !address -summary 就不靠譜了,這裏就需要用 !maddress 命令去看看,截圖如下: [代碼示例略] 從卦中可以看到,程序總計喫了 3.07G ,其中 GCHeap 和 PAGE_READWRITE 喫的差不多,看起來不大樂觀,要先追蹤 PAGE_READWRITE 的調用棧,在 linux 上不是那麼容易的。 2. 從託管堆入手 接下來怎麼辦呢?先死馬當做活馬醫,因爲畢竟是託管程序,很多非託管內存的root都和託管堆對象有關,本着這個思想,先用 !dumpheap -stat 觀察下託管堆看看。 [代碼示例略] 仔細觀察卦中的數據,很容易發現 SqlClient 相關的對象的數量有點多,尤其是 SNIMarsConnection 高達 3765 個,這個是不正常的,你可以簡單理解底層開了 3765 個 connection 鏈接,每個鏈接都會喫一點非託管資源,所以非託管內存就這樣上去了。

一:背景 1. 講故事 好久都沒寫文章了,看現在各個社區大多都是AI寫的文章,劣幣驅除良幣,文字這塊算是淪陷了,沒多少 passion to continue,但遇到一些經典的還是會人肉堆一堆,這篇我們就來分析一個 內存暴漲 的例子,這是一個朋友在微信上找到我的,有一個linux上的.NET程序,內存在一直暴漲,發現非託管內存佔用不少,讓我幫忙看下咋回事。 二:內存暴漲分析 1. 爲什麼會暴漲 既然是Linux上的dump,用傳統的 !address -summary 就不靠譜了,這裏就需要用 !maddress 命令去看看,截圖如下: [代碼示例略] 從卦中可以看到,程序總計喫了 3.07G ,其中 GCHeap 和 PAGE_READWRITE 喫的差不多,看起來不大樂觀,要先追蹤 PAGE_READWRITE 的調用棧,在 linux 上不是那麼容易的。 2. 從託管堆入手 接下來怎麼辦呢?先死馬當做活馬醫,因爲畢竟是託管程序,很多非託管內存的root都和託管堆對象有關,本着這個思想,先用 !dumpheap -stat 觀察下託管堆看看。 [代碼示例略] 仔細觀察卦中的數據,很容易發現 SqlClient 相關的對象的數量有點多,尤其是 SNIMarsConnection 高達 3765 個,這個是不正常的,你可以簡單理解底層開了 3765 個 connection 鏈接,每個鏈接都會喫一點非託管資源,所以非託管內存就這樣上去了。 3. SNIMarsConnection 是啥 Mars 全稱 multiple active result sets ,主要是解決 command 下的多 reader 問題,這裏大家可以問下大模型,具體就不說了,接下來就從 SNIMarsConnection 入手,看看它的root情況。

建議先收藏再實操:挑其中一個點今天就試試,跑通了再看下一個。知識只有過手纔是你的,你準備先試哪一點? 來源|博客園《記一次 .NET 某珠寶公司內部管理系統 內存暴漲分析》,https://www.cnblogs.com/huangxincheng/p/22983141.html

程式員技術場技术后端

評論(0)

暫無評論,來搶第一條。