知识大全 如何查找.NET程序内存不断上涨的原因[1]
Posted 知
篇首语:人的影响短暂而微弱,书的影响则广泛而深远。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 如何查找.NET程序内存不断上涨的原因[1]相关的知识,希望对你有一定的参考价值。
如何查找.NET程序内存不断上涨的原因[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
我们知道 NET是带有垃圾回收机制的 出现这种情况一般是由某些数据长期存活在内存中又不能被当成垃圾数据回收的原因造成的
后来就在各搜索引擎上进行了各种搜索 有说使用windebug分析dump 但需要大量时间琢磨 有人说是不是硬件问题 还有人说中毒了 最后找到了一款微软推出的CLRProfiler工具 貌似很强大 遂MSDN了一把 MSDN是这样说的
Who allocates what on the managed heap
Which objects survive on the managed heap
Who is holding on to objects
What the garbage collector does over the lifetime of your application
得到这些信息以后就决定使用一下 让服务端运行了一会儿 停止以后得到分析结果 最终在Allocation Graph视图下了解到原来是下载文件DownloadFile方法下的byte[]数组引起的 短短不到一分钟的时间竟然占用了两百多兆的内存 好了 这下可找到 原凶 了 有得折腾了
方案 :把要下载的数据一并加载到内存 用户在下载的时候通过position来获取byte[]不新建直接返回 是能解决问题 但这就大大降低了服务端的可用性啊 只能当做小文件服务端 太不合理
方案 :由于下载文件的时候返回的是一个可序列化的类 所以想是不是这里出现了问题 可以直接返回byte[] 以最基本的数据头 >数据长度 >数据 >数据尾来实现 但这样一来要改的东西太多了 服务端客户端 协议重构 眼看着就要落幕的项目却要重头再来心有不甘那 再加上还有一堆任务在后面赶着 这不是坑自己吗 也放弃了
然后又回到各种网络资料搜索上 经过一番查找后了解到 byte[]最终也是会被回收的 只要是托管的数据都是能被回收的 只是周期可能会长一些 最后又回到了Remoting本身上 抱着试一试的心态把WellKnowObjectMode由SingleTon改为了SingleCall 跑了一晚上最后稳定在了 M上下 总算松了口气
使用SingleTon本来是想节省内存消耗的 可没想到得不偿失如此的大费周折 遂总结出SingleTon并不适合并发量大的服务端程序 SingleTon是单线程模式 在调用每个方法的时候都会被加锁 猜测造成数据一直不能被释放的原因是由这些锁造成的 由于连接的数量太多导致连接一直处于排队状态 造成了后面连接的客户端响应过慢 连接超时 在这里也给大家一个教训还是用SingleCall实在
上面说了这么多只是跟大家分享一下解决问题的经验 还有叙述了一下问题的所在 如果各位有不同的见解请一定要指出来 毕竟 NET内存分配 垃圾回收本就比较复杂
然事与愿违却柳暗花明
这篇文章的重点是讲如何使用CLRProfiler来查找 NET程序的内存分配情况的 下面就开始吧
下载CLR Profiler://search microsoft /en us/DownloadResults aspx?q=clr% profiler
可根据自己 NET的版本下载相应的CLRProfiler 下面以 NET 版本为例 CLRProfiler可以分析应用程序 服务和ASP NET编写的程序 以下以应用程序为例为大家演示如何简单使用CLRProfiler
下面是一个拆箱装箱的例子CLRProfilerTestDemo 通过这个例子来观察进程托管堆的分配和研究垃圾回收机制的行为表现 代码如下
using System;
using System Collections Generic;
namespace CLRProfilerTestDemo
class Program
static void Main(string[] args)
for (int i = ; i < * ; i++)
Boxing box = new Boxing()
Environment Exit(Environment ExitCode)
class Boxing
private List<object> box = new List<object>()
private List<int> unbox = new List<int>()
public Boxing()
for (int i = ; i < ; i++)
box Add(i)
unbox Add((int)box[i])
cha138/Article/program/net/201311/16135
相关参考
减少.NET应用程序内存占用的一则实践 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 最近一周比
使用VB.Net查找程序的前一个运行结果 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 可以从获
知识大全 使用.NET Profiler API检查并优化程序的内存使用
使用.NETProfilerAPI检查并优化程序的内存使用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一
(1)、重新结账,核实错款金额 (2)、核点现金 (3)、分析原因,全面核查账款 (4)、及早组织人力外部查找
再运行php程序时会出现 Allowedmemorysizeofbytesexhausted(triedtoallocatebytes) 出现该错误的原因在确保不是程序产生的原因(例如死循环)
Java程序里的内存泄漏 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Java程序里的内存泄漏
代码最优化.NET中的内存管理 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在NET中内存管理
.NET对象占内存多少 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一直有一个小小的疑惑——N
浅析.NET框架下的自动内存管理 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一抽象类 抽象
为C++标准库容器写自己的内存分配程序 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &