对未正确管理的内存分配和解除分配函数进行调用可能会造成数据的使用效率降低,从而导致应用程序的性能降低。在堆跟踪中,收集器通过插入 C 标准库内存分配函数 malloc、realloc、valloc 和 memalign 以及解除分配函数 free 跟踪内存分配和解除分配请求。对 mmap 的调用被视为内存分配,它允许记录 Java 内存分配的堆跟踪事件。由于 Fortran 函数 allocate 和 deallocate 调用 C 标准库函数,因此还会间接跟踪这些例程。
不支持对 Java 程序的堆分析。
表 2–3 内存分配(堆跟踪)度量
度量 |
定义 |
---|---|
分配数 |
对内存分配函数的调用数。 |
分配的字节 |
每次调用内存分配函数时分配的字节总数。 |
泄漏数 |
调用内存分配函数(未对解除分配函数进行相应的调用)的数量。 |
泄漏的字节 |
已分配但未解除分配的字节数。 |
收集堆跟踪数据有助于识别程序中的内存泄漏,或定位内存分配效率不高的位置。
内存泄漏的另一个常用定义(例如在 dbx 调试工具中)为:内存泄漏是一个动态分配的内存块,在程序的数据空间中没有任何指向它的指针。此处所使用的泄漏定义包括这种替换的定义,但也包括存在指针的内存。