内存管理之堆heap

Posted jiangtongxue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存管理之堆heap相关的知识,希望对你有一定的参考价值。

1、什么是堆?
 堆(heap)是一种内存管理方式。内存管理对操作系统来说是一件非常复杂的事情,因为首先内存容量很大,
 其次就是内存需求在时间和大小块上没有规律(操作系统上运行着几十甚至几百个进程,这些进程可能随时
 都会申请或者是释放内存,并且申请和释放的内存块大小是随意的)。
 堆这种内存管理方式的特点就是自由(随时申请、随时释放、大小块随意)。堆内存是操作系统划归给堆管
 理器(操作系统中的一段代码,属于操作系统的内存管理单元)来管理的,然后向使用者(用户进程)提供
 API(malloc和free)来使用堆内存。
 
 我们什么时候使用堆内存?
 当我们需要的内存容量比较大时,需要反复使用及释放时,很多数据结构(譬如链表)的实现都要使用堆内存。
 
2、堆管理内存的特点(大块内存、手工分配&使用&释放)
 特点一:容量不限(常规使用的需求容量都可以满足)
 特点二:申请及释放都需要手工运行,手工进行的含义就是需要程序员写代码明确进行申请malloc及释放free。
 如果程序员申请内存并使用后未释放,这段内存就丢失了(在堆管理器的记录中,这段内存仍然属于你这个进程,
 但是进程自己又以为这段内存已经不用了,所以进程再次运行的时候,就又会去申请新的内存块,这就叫做吃内存),
    称之为内存泄漏。在C/C++语言中,内存泄漏是最严重的程序bug,这也是别人认为Java/C#等语言比C/C++优秀的地方。
3、C语言操作堆内存的接口(malloc free)
    堆内存释放的时候最简单,直接调用free释放即可。  void free(void *ptr);
 堆内存申请时,有3个可选择的类似功能的函数:malloc ,calloc, realloc
 void *malloc(size_t size);
 void *calloc(size_t nmemb, size_t size);     //nmemb个单元,每个单元size字节
 void *realloc(void *ptr, size_t size);       //改变原来申请的空间的大小的
 
 譬如要申请10个int元素的内存:
 malloc(40);           malloc(10 * sizeof(int));
 calloc(10, 4);        calloc(10, sizeof(int));
 
 数组定义时必须同时给出数组元素个数(数组大小),而且一旦定义在无法更改。
 堆内存在申请时必须给定大小,然后一旦申请完成大小不变,如果要变只能通过realloc接口。
4、堆的优势和劣势(管理大块内存、灵活、容易内存泄漏)
 优势:灵活
 劣势:需要程序员去处理各种细节,所以容易出错,严重依赖于程序员的水平。

以上是关于内存管理之堆heap的主要内容,如果未能解决你的问题,请参考以下文章

程序中内存从哪里来2之堆内存详解

JVM之堆空间

JVM之堆内存

FreeRTOS 动态内存管理

Flink内存管理

FreeRTOS内存管理