首页 > 系统相关 >OnTheSSH使用技巧(四)直接观看进程内存

OnTheSSH使用技巧(四)直接观看进程内存

时间:2023-10-14 21:13:37浏览次数:42  
标签:1024 技巧 OnTheSSH int cache 内存 进程 include

堆(heap)和栈(stack)是进程中的两片内存区域,这是学习编程过程中,特别是C语言这种直接操作内存的程序员必须要掌握的知识。如果能直观的看到进程运行时堆内存和栈内存的变化,相信对内存知识的掌握和程序的调试都能带来帮助。
OnTheSSH是一款SSH工具,提供了图形化的进程内存的监控功能,今天我们就使用它来分析栈和堆内存。
1、先分析栈内存
在linux中,栈内存大小一般限制在8M,可以用 ulimit -a 命令查看系统对栈内存的限制:

 编写一段C程序来测试栈内存的申请:

// test1.c
#include <stdio.h>

main()
{
  // 4M栈内存
  char cache[1024 * 1024 * 4];

  printf("%X", &cache);

  //这里scanf()用来阻止程序退出
  int a = 0;
  scanf("%d", &a);
}

cache变量是char类型数组,长度定义为4M(1024 * 1024 * 4),然后编译、运行:

 

程序打印出cache变量的地址: FFA15EA0,先记录在这里,一会儿和进程内存栈地址进行比较。

打开 OnTheSSH 软件的进程监控功能,在进程列表中找到a.out进程,然后点击顶部的“进程内存”按钮:

 在进程内存窗口中(下图),显示了a.out进程(进程id 18622)的内存实时状态,上半部分是内存页角度的状态,下半部分是进程在内存中的布局和映射。

 内存映射图中显示,a.out进程的栈内存段大小是4M,和cache变量大小相符,地址范围7fffffa15000-7fffffe17000,程序打印的cache地址是FFA15EA0,去除地址前缀,cache地址正好落在栈地址范围内:

 

2、接下来分析堆内存
C语言中堆内存要用malloc来申请,在64位系统中几乎可以申请到你想得到的任意内存大小(上限极大),比如下面的代码:

//test2.c
#include <stdio.h>
#include <malloc.h>
#include <string.h>

main()
{
  int len = 1024 * 1024 * 1024;
  //申请1G堆内存
  int *p = (int*)malloc(len);

  printf("%X", p);

  int a = 0;
  scanf("%d", &a);
}

通过malloc申请了1G内存,然后编译、运行:

再次查看OnTheSSH的内存映射:

 比对内存地址,malloc申请到的内存地址正落在这段范围:

 内存映射也“真实”反应申请到了1G内存,但情况确实如此吗,不尽然!我们用 OnTheSSH 的系统监控功能查看一下内存在系统层面的使用情况:

 

 

可以看到系统层面只使用了0.51G内存,肯定没有计算a.out进程的内存啊!怎么回事?
其实这里就碰到了Linux中的copy on write机制:进程中申请的内存在没有写入时,它只是声明存在,系统并不分配物理内存,直到这片内存被写入时才真正分配。
继续测试,修改代码,对malloc申请的堆内存进行写入操作:

//test3.c
#include <stdio.h>
#include <malloc.h>
#include <string.h>

main()
{
  int len = 1024 * 1024 * 1024;
  //申请1G堆内存
  int *p = (int*)malloc(len);
  //写内存
  memset(p, 0, len);

  int a = 0;
  scanf("%d", &a);
}

编译运行,再看系统内存监控,可以看到这时内存才真的被使用:

 

标签:1024,技巧,OnTheSSH,int,cache,内存,进程,include
From: https://www.cnblogs.com/dyf029/p/17764711.html

相关文章

  • OnTheSSH使用技巧(三)向多个远端主机发送命令
    OnTheSSH提供将同一条命令发送到多台远端主机运行的功能。使用方式如下:1)勾选要运行命令的远端主机到工作区: 提示:合理将远端主机归纳入分组,可提高勾选的效率。2)在命令输入区输入命令,点击“运行”按钮执行,或使用组合键执行命令,windows中是Ctrl+Enter,MacOS中是Command(⌘)+Enter。......
  • OnTheSSH使用技巧(二) 上传和下载
    上传和下载是SSH工具的基本功能,OnTheSSH提供三种传输方式:1)普通传输2)分割文件传输3)并发传输【普通传输】普通传输使用SSH2/SCP协议上传/下载文件或目录。使用方式如下:上传时,需要在远端主机管理界面中,调整地址栏路径到需要上传的位置,再点击上传文件或上传目录按钮:  弹出窗口......
  • OnTheSSH使用技巧(一) 监控Linux性能
     Linux提供了许多命令进行性能监控,如top、netstat、free等,这些命令通常带有很多参数,使用起来需要一定的经验和技巧。OnTheSSH软件提供图表形式的监控,将linux的各种指标聚合在一个界面中,使用起来也非常简单。【打开监控界面途径】1、在左侧栏用鼠标点击某一个远端主机,再点击顶部......
  • OnTheSSH使用技巧(六)修改文件属性
    OnTheSSh提供了图形化的文件属性修改功能。在远端主机管理界面中,鼠标右键点击列表中的文件或目录:  ......
  • 动态内存管理函数及应用--通讯录管理系统(1)
    引言:我们在创建一个局部变量时,通过下列定义语句向内存申请空间,内存在栈区为变量开辟相应的空间。intval=10;//在内存中栈区中开辟大小为4Byte大小的空间chararray[10]={0};//在内存中栈区中开辟大小为10Byte大小的连续的空间...上述方式开辟空间的特点:空间开辟大小是固定的,开辟好......
  • Java内存区域
    图示Java1.8以前JDK1.8:说明线程私有的:程序计数器机栈本地方法栈线程共享的:堆方法区直接内存(非运行时数据区的一部分)程序计数器程序计数器程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值来选取下一条......
  • 手撕Vue-提取元素到内存
    接着上一篇文章,我们已经实现了构建Vue实例的过程,接下来我们要实现的是提取元素到内存。主要是通过文档碎片来实现,文档碎片是一个轻量级的文档,可以包含和控制节点,但是不会像真实的DOM那样占用内存,所以我们可以通过文档碎片来提高性能。大致的思路是这样的:创建一个空的文档碎片......
  • 使用FMC连接SDRAM扩展STM32内存
    1.引脚初始化BSP_SDRAM_GPIO_InitvoidBSP_SDRAM_GPIO_Init(void){RCC_AHB1PeriphClockCmd(FMC_A0_GPIO_CLK,ENABLE);RCC_AHB1PeriphClockCmd(FMC_A1_GPIO_CLK,ENABLE);RCC_AHB1PeriphClockCmd(FMC_A2_GPIO_CLK,ENABLE);RCC_AHB1PeriphClockCmd(FMC_A3......
  • 树上莫队小技巧
    前言联考有一道树上莫队一眼题,但是我还没学过树上莫队啊!!!于是开始口胡,这个东西好像是说这个东西把树拍成欧拉序,端点一移动,做完了!开始写,一下子过大样例,没有细节!然后在网上一看树上莫队的博客:大家怎么都求了LCA?为什么要分讨有祖先后代关系的情况?坏了,一定是我做法假了!!!然后往SPOJ......
  • 项目经理涨薪秘籍!技巧都在这里了
    好奇前辈们是如何带好团队、做出成功项目,从而升职加薪,成为高级项目经理或项目管理主管的?这是绝大多数新手PM最关注的事情。今天小编给大家揭秘!一、刚入门如何进阶从入门的项目管理者发展到中级的项目管理者,重点提升的能力包括基础专业能力、工具应用能力、资源整合能力、目标整合能......