引起我对这个题目的兴趣的原因是这样的,有客户抱怨公司的产品运行时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
在回复里面,