前面在分析栈的时候我们提到了系统对栈的大小有上限,比如我的系统默认是8MB。那么有个问题就是,那么堆呢?
嗯,这个部分其实就涉及到操作系统的内存管理的策略和方法,是个很大的问题,推荐看一下《深入理解计算机系统》相关的章节或者关于现代的操作系统的书籍。这里我们简单做了一下实验。
我的实验机器的内存是1GB,一个Linux的虚拟机。
当我们设置 m = n = 204800000的时候,相当于要申请800MB的内存。
我们产品status的时候发现VmData > VmRSS, 这在前面m=n的情况下从来没有出现过。
VmSize: 802784 kB
VmLck: 0 kB
VmHWM: 684384 kB
VmRSS: 676808 kB
VmData: 800064 kB
所以一定是有些事情发生变化了。于是我们看了一下系统的内存,以及SWAP的使用情况。
Mem: 900096k total, 893180k used, 6916k free, 1012k buffers
Swap: 2096472k total, 147320k used, 1949152k free, 33012k cached
发现系统的物理内存已经快用了,还留了一些给系统,然后开始使用SWAP了,大家知道这里的SWAP其实是磁盘文件。
在这种情况下,我们也许可以更容易理解驻留内存的意义,以及为什么内存不够会导致性能的明显下降。
如果进一步把m=n加到300M,也是申请1.2GB的内存(已经大于所有物理内存的数目),可能会更明显。
VmSize: 1202784 kB
VmLck: 0 kB
VmHWM: 814064 kB
VmRSS: 793588 kB
VmData: 1200064 kB
Mem: 900096k total, 894128k used, 5968k free, 1104k buffers
Swap: 2096472k total, 541812k used, 1554660k free, 13616k cached
通过这几个小的例子,会发现就是内存使用这样一个指标其实背后都会有很多值得去了解和探讨的细节,其实这里谈到的也只是冰山一角。只有了解并理解了这些重要的细节,我们在测试中去评估我们的产品的时候才会更加的准备,更容易发现和定位问题。另外不要忘记实际中的产品比这两个豆腐块程序要复杂得多。