内存分配和进程内存使用

时间:2016-07-21 00:54:24

标签: c memory-management malloc dynamic-memory-allocation static-memory-allocation

我想了解为什么动态分配多次调用的数据使用的内存比直接在代码上指定的数据要多,或者只用malloc调用一次。

实施例

例如,我在C:

中制作了以下两个代码

test1.c: int x分配有malloc

int main (void)
{
    int *x;
    int i, n=1048576; //n=1024*1024;

    printf("size = %lu\n", n* sizeof(int));

    for(i=0; i<n; i++)
    {
        x = malloc(sizeof(int));
        *x=i;
    }
    printf("Look at top and then press something to finish.");fflush(stdout);
    getc(stdin);
    return 0;
}

我这里没有使用免费来保持简单。 当程序在等待交互时,我会查看另一个终端中的top函数,它显示了这个:

PID  USER   PR  NI  VIRT   RES    SHR  S  %CPU %MEM  TIME+   COMMAND                                    
1384 root   20  0   41300  34076  1300 S  0.0  3.3   0:00.47 test1

test2.c: int x未动态分配

int main (void)
{
    int x[1048576]; //x[1024*1024]
    int i, n=1048576;

    printf("size = %lu\n", n* sizeof(int));

    for(i=0; i<n; i++)
    {
        x[i]=i;
    }
    printf("Look at top and then press something to finish.");fflush(stdout);
    getc(stdin);
    return 0;
}

顶部告诉我:

PID  USER   PR  NI  VIRT    RES    SHR  S  %CPU %MEM  TIME+   COMMAND                                    
1352 root   20  0   12404   5500   1304 S  0.0  0.5   0:00.05 test2 

我还做了第三个代码,其结果与test2相同,我使用过:

x = malloc(n*sizeof(int));
for(i=0; i<n; i++)
    {
        x[i]=i;
    }

为什么这些进程的内存使用有这么大的差异?那是因为malloc请求新的内存页面并且内存被浪费了吗?或malloc分配更多内存?

test1使用 3.3%的总内存,test2使用 0.5%

环境:

我正在docker内的Centos 5 64位上执行这些测试。

虚拟环境中的内存:

$ free -m
              total        used        free      shared  buff/cache   available
Mem:            995          98         845           3          51         808
Swap:          1162         194         967

2 个答案:

答案 0 :(得分:5)

必须跟踪每个内存分配,以便{{1}}可以释放空间以供重用。实际上,这意味着已经分配了最小内存大小;对于32位程序,它可以是8或16字节,对于64位程序,它可以是16-32字节(取决于系统和正在使用的C库的版本)。

当你分别分配一百万个整数时,每个整数使用8-32个字节,所以你实际上使用了8-32 MiB的内存。当您在堆栈中的单个阵列中分配一百万个整数时,您将使用4 MiB的内存。

因此,您会发现流程大小存在很大差异。

当然,第一个程序泄漏了几乎所有的记忆,但这与您提出的问题相关。

答案 1 :(得分:2)

每次用户要求记忆时,系统都需要做一些内务处理。当只用你的指针调用free就足以让系统取消分配它的内存时,应该记住这一点。

因此,在您的第一个示例中,您请求内存n次,而在第二个示例中请求内存@RunWith(PowerMockRunner.class) @PrepareForTest(Helper.class) public class YourTestCase { @Test public void testMethodThatCallsStaticMethod() { // mock all the static methods in a class called "Static" PowerMockito.mockStatic(Helper.class); // use Mockito to set up your expectation Mockito.when(Helper.getName("abc")).thenReturn("foo"); // execute your test String result = Helper.getName("abc"); //assert the result Assert.assertEquals("foo", result); // to start verifying behavior PowerMockito.verifyStatic(Mockito.times(1)); // IMPORTANT: Call the static method you want to verify Helper.getName("abc"); } } 次。您打算使用的内存是相同的,但系统必须记住的信息&#34;记住&#34;不是。