c#数组的内存分配

C#数组内存分配引发的OOM问题探究
本文讲述了作者在排查一起因内存溢出(OOM)问题时,发现并非对象数量过多导致,而是大量数组占据了大量内存。通过分析,了解到数组在内存中的布局,包括method table地址、数组长度、元素地址等,最终揭示了即使对象地址也会在极端情况下造成显著内存消耗,强调了合理程序设计的重要性。

引起我对这个题目的兴趣的原因是这样的,有客户抱怨公司的产品运行时out of memory了,于是我便开始研究这个问题到底出在什么地方。


当时程序的运行状态是这样的,一共有10000个数组(请尽情吐槽程序的结构设计),第一个数组中有6个object,第二个数组有12个object,以此类推,第10000个数组有60000个object。整个程序中该object的数量只有60000个,也就是说第一个数组中的6个object就是最后一个数组的前六个object。


当调试到这里,我立刻想到,难道是60000个object导致了OOM?

于是使用了dotTrace发现这6W个object只占了几百M的内存,而OOM异常起码内存占用要超过2G。


到底是什么东西占用了这么大的内存?

想着这个问题时,突然眼睛瞟到dotTrace内存报告中显示object[]占用了极大的内存,超过了那6w个object。至此,总算找到了OOM的原因:大量的数组占用了大量的内存。与此同时,另外一个问题又出现了。


数组为何会占用如此大量的内存?object数组存储的应该仅仅只是object的地址,地址怎么会占用这么大的内存?对于这个问题,我百思不得其解。


一开始,我以为是ArrayList的内存开辟,因为ArrayList可以动态更改数组长度,也就会动态的开辟内存,而每次内存开辟是在上一次的数组长度上乘2,于是我使用了TrimToSize()方法来削减多余开辟的内存,问题仍然没有解决。


不甘心的我直接将ArrayList改成object[],当然,大家应该可以预见,问题仍不会得到解决。


无计可施的我最后只能求助于google,数组的内存分配到底是怎样的。于是查到了这样一篇文章:

http://stackoverflow.com/questions/487202/memory-layout-of-a-net-array

在回复里面,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值