mallinfo(3) Library Functions Manual mallinfo(3) mallinfo mallinfo2 - (libc -lc) #include struct mallinfo mallinfo(void); struct mallinfo2 mallinfo2(void); malloc(3) . . mallinfo() ( BUGS). BUGS malloc_info(3) . mallinfo2 mallinfo2() : struct mallinfo2 { size_t arena; /* mmap () */ size_t ordblks; /* */ size_t smblks; /* fastbin */ size_t hblks; /* mmap */ size_t hblkhd; /* mmap () */ size_t usmblks; /* */ size_t fsmblks; /* fastbin () */ size_t uordblks; /* () */ size_t fordblks; /* () */ size_t keepcost; /* () */ }; mallinfo mallinfo() int. : arena mmap(2) ( ). . ordblks ( fastbin). smblks fastbin ( mallopt(3)). hblks mmap(2). ( M_MMAP_THRESHOLD mallopt(3).) hblkhd mmap(2). usmblks 0. " " -- () . fsmblks . uordblks . fordblks . keepcost . ( ) malloc_trim(3). attributes(7). +----------------------+------------------------------------+----------+ | | | | +----------------------+------------------------------------+----------+ |mallinfo(), | | MT-Unsafe | |mallinfo2() | | init | | | | const:mallopt | +----------------------+------------------------------------+----------+ mallinfo()/ mallinfo2() . . mallopt const:mallopt mallopt() mallinfo()/ mallinfo2() . . mallinfo() glibc 2.0. SVID. mallinfo2() glibc 2.33. . . malloc_stats(3) malloc_info(3) . mallinfo mallinfo() int. long . mallinfo2() . . malloc(3). free(3). (): ( 1 ) ( 0 ) ( ). . 1000 100 : $ ./a.out 1000 100 2; ============== Before allocating blocks ============== Total non-mmapped bytes (arena): 0 # of free chunks (ordblks): 1 # of free fastbin blocks (smblks): 0 # of mapped regions (hblks): 0 Bytes in mapped regions (hblkhd): 0 Max. total allocated space (usmblks): 0 Free bytes held in fastbins (fsmblks): 0 Total allocated space (uordblks): 0 Total free space (fordblks): 0 Topmost releasable block (keepcost): 0 ============== After allocating blocks ============== Total non-mmapped bytes (arena): 135168 # of free chunks (ordblks): 1 # of free fastbin blocks (smblks): 0 # of mapped regions (hblks): 0 Bytes in mapped regions (hblkhd): 0 Max. total allocated space (usmblks): 0 Free bytes held in fastbins (fsmblks): 0 Total allocated space (uordblks): 104000 Total free space (fordblks): 31168 Topmost releasable block (keepcost): 31168 ============== After freeing blocks ============== Total non-mmapped bytes (arena): 135168 # of free chunks (ordblks): 501 # of free fastbin blocks (smblks): 0 # of mapped regions (hblks): 0 Bytes in mapped regions (hblkhd): 0 Max. total allocated space (usmblks): 0 Free bytes held in fastbins (fsmblks): 0 Total allocated space (uordblks): 52000 Total free space (fordblks): 83168 Topmost releasable block (keepcost): 31168 #include #include #include #define streq(...) (strcmp(__VA_ARGS__) == 0) static void display_mallinfo2(void) { struct mallinfo2 mi; mi = mallinfo2(); printf("Total non-mmapped bytes (arena): %zu\n", mi.arena); printf("# of free chunks (ordblks): %zu\n", mi.ordblks); printf("# of free fastbin blocks (smblks): %zu\n", mi.smblks); printf("# of mapped regions (hblks): %zu\n", mi.hblks); printf("Bytes in mapped regions (hblkhd): %zu\n", mi.hblkhd); printf("Max. total allocated space (usmblks): %zu\n", mi.usmblks); printf("Free bytes held in fastbins (fsmblks): %zu\n", mi.fsmblks); printf("Total allocated space (uordblks): %zu\n", mi.uordblks); printf("Total free space (fordblks): %zu\n", mi.fordblks); printf("Topmost releasable block (keepcost): %zu\n", mi.keepcost); } int main(int argc, char *argv[]) { #define MAX_ALLOCS 500000 char *alloc[MAX_ALLOCS]; size_t blockSize, numBlocks, freeBegin, freeEnd, freeStep; if (argc < 3 || streq(argv[1], "--help")) { fprintf(stderr, "%s num-blocks block-size [free-step " "[start-free [end-free]]]\n", argv[0]); exit(EXIT_FAILURE); } numBlocks = atoi(argv[1]); blockSize = atoi(argv[2]); freeStep = (argc > 3) ? atoi(argv[3]) : 1; freeBegin = (argc > 4) ? atoi(argv[4]) : 0; freeEnd = (argc > 5) ? atoi(argv[5]) : numBlocks; printf("============== Before allocating blocks ==============\n"); display_mallinfo2(); for (size_t j = 0; j < numBlocks; j++) { if (numBlocks >= MAX_ALLOCS) { fprintf(stderr, "Too many allocations\n"); exit(EXIT_FAILURE); } alloc[j] = malloc(blockSize); if (alloc[j] == NULL) { perror("malloc"); exit(EXIT_FAILURE); } } printf("\n============== After allocating blocks ==============\n"); display_mallinfo2(); for (size_t j = freeBegin; j < freeEnd; j += freeStep) free(alloc[j]); printf("\n============== After freeing blocks ==============\n"); display_mallinfo2(); exit(EXIT_SUCCESS); } mmap(2), malloc(3), malloc_info(3), malloc_stats(3), malloc_trim(3), mallopt(3) 3 . . : . 6.18 22 2026 mallinfo(3)