• Linux内存


    4. 查看系统内存

    free -m


    如图所示,红线框中used表示当前系统内存使用量,free表示当前系统内存剩余量,单位M



    3. 查看进程内存

    ps -e -o cmd,sz,rsz,vsz | grep proc_name | awk '{print $2/1024, $3/1024, $4/1024}'



    参数

    rsz对应值即进程实际内存用量,直接影响free -m的结果

    vsz对应值即进程虚拟内存用量,对free -m不具有任何影响

    sz对应值目前无价值


    示例

    free -m的结果为


    开始运行main,查看进程内存


    进程main实际内存400M,则系统内存剩余量会相应扣除400M


    可以看到main进程的虚拟内存为9G,大于系统内存总量,故vsz对应的进程虚拟内存用量与free -m无任何关系,或大或小都不会影响free -m的结果



    2. vsz虚拟内存用量


    程序在编译阶段,即开始计算进程的虚拟内存用量。


    程序一运行,即便没有执行到,或者直接跳过不执行,main进程的虚拟内存即为5.6G,而不管此时系统总的内存大小可能只是4G的事实。


    释放

    如同实际内存用量,栈空间一旦转化为虚拟内存,则不会轻易释放。待到系统内存吃紧时,系统可能开始回收。(未验证)

    即可能存在如下情况:跳出作用域后,局部对象应该销毁,但其对应的虚拟内存并未减少。


    以程序执行堆分配的代码为准,执行到就加虚拟内存,没有执行到就不加。


    释放

    空间释放后,虚拟内存归还系统。

    调用delete释放堆空间后,进程虚拟内存即刻减少对应值。


    如上所述,同样适用于malloc-free



    1. rsz实际内存用量


    栈空间转化为实际内存的条件:

    a. 从栈申请空间

    b. 对申请到的空间赋值

    赋值包括

    申请空间时的初始化,如

    int arr[100*1024*1024] = {0};

    程序中使用,如



    释放

    栈空间一旦转化为实际内存,则非必要不释放。

    待到系统内存吃紧时,系统可能开始回收。(未验证)



    堆空间转化为实际内存的条件:

    a. 申请堆空间

    b. 对空间赋值

    赋值包括

    申请空间时的初始化,如

    int num = 100 * 1024 * 1024;

    int *arr = new int[num]();

    程序中使用,如



    释放

    空间释放后,实际内存归还系统。

    调用delete释放堆空间后,进程实际内存即刻减少对应值,系统(free -m)即刻增加对应值。


    如上所述,同样适用于malloc-free



  • 相关阅读:
    程序员修神之路--容器技术为什么会这么流行
    程序员修神之路--kubernetes是微服务发展的必然产物
    程序员修神之路--有状态的服务其实可以做更多的事情
    程序员修神之路--要想做好微服务架构,并非易事!
    程序员修神之路--为什么有了SOA,我们还用微服务?
    程序员过关斩将--数据库的乐观锁和悲观锁并非真实的锁
    程序员修神之路--设计一套RPC框架并非易事
    计算机的诞生和简史
    记一次Linux修改MySQL配置不生效的问题
    为什么大多数公司都不重视技术?
  • 原文地址:https://www.cnblogs.com/chaikefusibushiji/p/7475583.html
Copyright © 2020-2023  润新知