堆内存
程序员手动管理,足够大,使用麻烦。
为什么使用堆内存:
1.复杂数据量增多。
2.其他内存段申请释放不受控制,堆内存可以控制。
malloc的内存管理机制:
1.当首次向malloc申请内存时,malloc会向操作系统申请堆内存,操作系统会直接分配33页(1页=4096字节)内存给malloc管理,但不意味着可以越界访问,因为malloc可能会把内存分配给“其他人”使用,会产生脏数据。
2.每个内存块之间一定会有一些空隙(4~12字节),一部分空隙是为了内存对齐,其中一定有4字节用于记录malloc的维护信息,如果维护信息遭到破坏会影响下一次的free调用。
内存泄漏:
内存无法使用,也无法被释放,当再次需要时只能重新申请,然后又重复以上过程,日积月累后会导致系统中可用的内存越来越少。
程序一旦结束,属于它的所有资源都会被操作系统回收。
如何尽量避免内存泄漏:
谁申请的谁释放,谁知道该释放谁释放。
如何判断定位内存泄漏
1.查看内存的使用情况
windows 任务管理器
Linux 命令 ps -aux
2.代码分析工具mtrace,检查malloc、free的使用情况
3.封装新的malloc和free函数,记录调用信息到日志中
内存碎片:
已经被释放但是又无法继续使用的内存叫做内存碎片,是由于申请和释放的时间不协调导致的,内存碎片无法避免只能尽量减少。
如何减少内存碎片:
1.尽量使用栈内存,占内存不会产生内存碎片
2.不要频繁地申请和释放内存
3.尽量申请大块内存自己管理