2012-03-17 22 views
11

¿Cómo encontrar el tamaño de la memoria dinámica de un programa de C++ bajo la plataforma Linux? Necesito espacio de memoria antes de usar new o malloc y también después de eso. ¿Alguien puede ayudar?cómo obtener el tamaño de Heap de un programa

#include <malloc.h> 
#include <iostream> 
int main() 
{ 

    //here need heap memory space 
    unsigned char* I2C_Read_Data= new unsigned char[250]; 
    //get heap memory space After the usage of new 
    return 0; 
} 
+2

new y malloc no utilizan la misma región ... – UmNyobe

+2

@UmNyobe: Eso es extraño, ya que usualmente 'new' llama a' :: operator new() ', que a su vez se implementa normalmente a través de' malloc() ' ... –

+0

http://stackoverflow.com/questions/1350819/c-free-store-vs-heap – UmNyobe

Respuesta

2

Puede utilizar la llamada a la función getrlimit y pasar el RLIMIT_DATA para el recurso. Eso debería darle el tamaño del segmento de datos para su programa. perfilador montón

+0

Gracias por la respuesta, ¿podría darme un código de muestra? – Anu

+0

Una búsqueda simple habría producido enlaces como este - http://www.linuxquestions.org/questions/programming-9/getrlimit-is-setting-soft-and-hard-limits-to-1-why-160165/ – Gangadhar

+0

Hola, En este se muestra el espacio de la memoria, pero no se modifica después de asignar el espacio. – Anu

5

Uso de valgrind: Massif

+1

+1 otras personas ya lo hicieron por ti ... – UmNyobe

+0

Estoy usando la plataforma 'arm-linux' .... ¿Cómo se puede usar Valgrind's con esta plataforma? ¿Alguna idea? – Anu

4

También puede agregar el seguimiento de pila para sus propios programas por la sobrecarga de los new y delete operadores. En a game engine en el que estoy trabajando, tengo toda la asignación de memoria pasando por funciones especiales, que asocian cada asignación a un objeto de seguimiento de montón en particular. De esta forma, en cualquier momento, puedo obtener un informe y ver cuánta memoria están tomando las entidades, los actores, los guiones de Lua, etc.

No es tan completo como usar un perfilador externo (particularmente cuando está afuera) las bibliotecas manejan su propia administración de memoria), pero es muy bueno ver exactamente de qué memoria era responsable.

sample of my memory tables

0

Además de la inspección externa, puede también instrumento de su implementación de malloc para que pueda inspeccionar esas estadísticas. jemalloc y tcmalloc son implementaciones que, además de tener un mejor rendimiento para el código multiproceso que las implementaciones de libc típicas, agregan algunas funciones de utilidad de ese tipo.

Para profundizar, debe aprender un poco más cómo funciona la asignación de montón. En última instancia, el sistema operativo es el que asigna memoria a los procesos a medida que lo piden, sin embargo, las solicitudes al sistema operativo (llamadas de sistema) son más lentas que las llamadas regulares, por lo que una implementación de malloc solicitará grandes segmentos al sistema operativo (bloques de 4KB u 8KB). son comunes) y los subdivide para que los sirva a sus llamadores.

Debe identificar si le interesa la memoria total consumida por el proceso (que incluye el código en sí), la memoria solicitada desde el sistema operativo dentro de una llamada de procedimiento en particular, la memoria actualmente en uso por malloc implementación (que agrega su propia sobrecarga de contabilidad, por pequeña que sea) o la memoria que solicitó.

Además, la fragmentación puede ser un problema para los dos últimos, y puede difuminar las diferencias entre realmente utilizado y asignado.

2

En Linux puede leer /proc/[pid]/statm para obtener información sobre el uso de la memoria.

Proporciona información sobre el uso de memoria, medido en páginas. Las columnas son :

   size  total program size 
         (same as VmSize in /proc/[pid]/status) 
       resident resident set size 
         (same as VmRSS in /proc/[pid]/status) 
       share  shared pages (from shared mappings) 
       text  text (code) 
       lib  library (unused in Linux 2.6) 
       data  data + stack 
       dt   dirty pages (unused in Linux 2.6) 

Véase el man page para más detalles.

respuesta por Adam Zalcman a este question describe algunos detalles interesantes de la asignación del montón

+0

¿Cuáles son las unidades? bytes? o páginas? – weima

+0

Las unidades son páginas. Puede usar getconf PAGE_SIZE para saber qué tan grande es una página en bytes. –

0

Usted puede tratar de "mallinfo" y "malloc_info". Podrían funcionar. mallinfo tiene problemas cuando asigna más de 2 GB.malloc_info es específico de o/sy notablemente muy raro. Estoy de acuerdo, muchas veces es bueno hacer esto sin herramientas de terceros.

Cuestiones relacionadas