记一次 .NET 某珠宝公司内部管理系统 内存暴涨分析
《记一次 .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)
暂无评论,来抢第一条。