zoukankan      html  css  js  c++  java
  • 2.堆.栈和内存映射详解


    1.每个线程都有自己专属的栈(stack),先进后出(LIFO)

    2.栈的最大尺寸固定,超出则引起栈溢出

    3.变量离开作用范围后,栈上的数据会自动释放

    4.堆上内存必须手动释放(C/C++)除非语言执行环境支持GC

    5.栈还是堆?

    --明确知道数据占用多少内存

    --数据很小

    --大量内存

    --不确定需要多少内存



     

     举个例子

    值得注意的是list_buf这个指针变量是在栈区,二list_buf这个指针指向的内存在堆区,还有函数的参数也是在栈区,而且是从右往左入栈

    详细过程如下,值得注意的是,函数的参数如果是引用传递,先在栈区创建一个变量,占四个自己,但指向了一个堆区的内存.

     

    静态区的值是一直不动的,而栈区的值是不断变化的.

     下面我们在linux下演示一下:

     第一步:vi a.c创建一个c语言程序

    esc  :x保存,注意是小写x

    新打开一个终端看看我们写的代码

    然后我们看看运行的情况

    我们往下拉:

    好,我们看到了我们之前写的程序,看到之后我们再进入进程

    我们再来看看maps

     1 cgw@cgw-virtual-machine:/proc/66050$ cat maps
     2 00400000-00401000 r-xp 00000000 08:01 430038                             /home/cgw/桌面/1/a
     3 00600000-00601000 r--p 00000000 08:01 430038                             /home/cgw/桌面/1/a
     4 00601000-00602000 rw-p 00001000 08:01 430038                             /home/cgw/桌面/1/a
     5 0194d000-0196e000 rw-p 00000000 00:00 0                                  [heap]
     6 7efd7cfea000-7efd7d1aa000 r-xp(r:读 x:执行 p:private地址) 00000000 08:01 661234                     /lib/x86_64-linux-gnu/libc-2.23.so
     7 7efd7d1aa000-7efd7d3aa000 ---p 001c0000 08:01 661234                     /lib/x86_64-linux-gnu/libc-2.23.so
     8 7efd7d3aa000-7efd7d3ae000 r--p 001c0000 08:01 661234                     /lib/x86_64-linux-gnu/libc-2.23.so
     9 7efd7d3ae000-7efd7d3b0000 rw-p 001c4000 08:01 661234                     /lib/x86_64-linux-gnu/libc-2.23.so
    10 7efd7d3b0000-7efd7d3b4000 rw-p 00000000 00:00 0 
    11 7efd7d3b4000-7efd7d3da000 r-xp 00000000 08:01 661197                     /lib/x86_64-linux-gnu/ld-2.23.so
    12 7efd7d5bb000-7efd7d5be000 rw-p 00000000 00:00 0 
    13 7efd7d5d7000-7efd7d5d9000 rw-p 00000000 00:00 0 
    14 7efd7d5d9000-7efd7d5da000 r--p 00025000 08:01 661197                     /lib/x86_64-linux-gnu/ld-2.23.so
    15 7efd7d5da000-7efd7d5db000 rw-p 00026000 08:01 661197                     /lib/x86_64-linux-gnu/ld-2.23.so //这些是我们程序需要的库文件
    16 7efd7d5db000-7efd7d5dc000 rw-p 00000000 00:00 0 
    17 7ffc5ed55000-7ffc5ed76000 rw-p 00000000 00:00 0                          [stack]我们可以算出地址大小为:8124字节 也就是8kb
    18 7ffc5edea000-7ffc5edec000 r--p 00000000 00:00 0                          [vvar]
    19 7ffc5edec000-7ffc5edee000 r-xp 00000000 00:00 0                          [vdso]
    20 ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

    下面我们看看堆的内存,首先修改代码

    采用以下指令看内存:

    查看代码指令:cat a.c

    查看进程:ps -u cgw

    找到对应进程号后: cd /proc

    我这里对应的是66050,所以我们cd 66050 进入该进程

    我们再ls查看一下

    然后cat maps 查看内存

     1 cgw@cgw-virtual-machine:/proc/66234$ cat maps
     2 00400000-00401000 r-xp 00000000 08:01 398616                             /home/cgw/桌面/1/a
     3 00600000-00601000 r--p 00000000 08:01 398616                             /home/cgw/桌面/1/a
     4 00601000-00602000 rw-p 00001000 08:01 398616                             /home/cgw/桌面/1/a
     5 0117d000-0119e000 rw-p 00000000 00:00 0                                  [heap]修改后的代码我们看到这里,是堆区,可读可写,为什么我们分配1k会分配这么多呢?因为最小会给你这么多,申请一个字节也是这么多内存
     6 7f4a849e9000-7f4a84ba9000 r-xp 00000000 08:01 661234                     /lib/x86_64-linux-gnu/libc-2.23.so
     7 7f4a84ba9000-7f4a84da9000 ---p 001c0000 08:01 661234                     /lib/x86_64-linux-gnu/libc-2.23.so
     8 7f4a84da9000-7f4a84dad000 r--p 001c0000 08:01 661234                     /lib/x86_64-linux-gnu/libc-2.23.so
     9 7f4a84dad000-7f4a84daf000 rw-p 001c4000 08:01 661234                     /lib/x86_64-linux-gnu/libc-2.23.so
    10 7f4a84daf000-7f4a84db3000 rw-p 00000000 00:00 0 
    11 7f4a84db3000-7f4a84dd9000 r-xp 00000000 08:01 661197                     /lib/x86_64-linux-gnu/ld-2.23.so
    12 7f4a84fba000-7f4a84fbd000 rw-p 00000000 00:00 0 
    13 7f4a84fd6000-7f4a84fd8000 rw-p 00000000 00:00 0 
    14 7f4a84fd8000-7f4a84fd9000 r--p 00025000 08:01 661197                     /lib/x86_64-linux-gnu/ld-2.23.so
    15 7f4a84fd9000-7f4a84fda000 rw-p 00026000 08:01 661197                     /lib/x86_64-linux-gnu/ld-2.23.so
    16 7f4a84fda000-7f4a84fdb000 rw-p 00000000 00:00 0 
    17 7fff5dd57000-7fff5dd78000 rw-p 00000000 00:00 0                          [stack]
    18 7fff5dd8a000-7fff5dd8c000 r--p 00000000 00:00 0                          [vvar]
    19 7fff5dd8c000-7fff5dd8e000 r-xp 00000000 00:00 0                          [vdso]
    20 ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
  • 相关阅读:
    MyEclipse10.7 10.6导出war文件报错 “SECURITY ALERT: INTEGERITY CHECK ERROR”
    基于ssh框架的highcharts前后台数据交互实例
    java自定义注解知识实例及SSH框架下,拦截器中无法获得java注解属性值的问题
    新特性:postgresql的vacuum漫谈
    postgresql vacuum操作
    __declspec(dllexport) 的意思与DEF导出函数的区别(转)
    一个睡五分钟等于六个钟头的方法(转)
    【转】应届毕业生要知道的几个小东西,,三方协议,,报到证,,干部身份
    测试word客户端发布Blog
    66句震撼人心的禅语(转)
  • 原文地址:https://www.cnblogs.com/xiaochi/p/7992245.html
Copyright © 2011-2022 走看看