美文网首页
内存分配问题

内存分配问题

作者: 李相赫的乐芙兰 | 来源:发表于2018-07-09 09:45 被阅读4次

 碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出,在他弹出之前,在他上面的后进的栈内容已经被弹出,详细的可以参考数据结构,这里我们就不再一一讨论了。

    生长方向:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。

    分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。

    分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。

    从这里我们可以看到,堆和栈相比,由于大量new/delete的使用,容易造成大量的内存碎片;由于没有专门的系统支持,效率很低;由于可能引发用户态和核心态的切换,内存的申请,代价变得更加昂贵。所以栈在程序中是应用最广 泛的,就算是函数的调用也利用栈去完成,函数调用过程中的参数,返回地址,EBP和局部变量都采用栈的方式存放。所以,我们推荐大家尽量用栈,而不是用堆。

相关文章

  • 内存分配问题

    碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对...

  • Redis字符串的性能优势三

    降低空间分配次数提升内存使用效率 字符串的追加操作会涉及到内存分配问题,然而内存分配问题会牵扯内存划分算法以及系统...

  • HashMap 源码问答

    问题一:HashMap 初始化分配内存了吗? 问题二:HashMap 什么时候分配的内存?第一次分配了多少? 问题...

  • JVM对并发分配内存处理方式

    内存分配部分 为对象分配内存的基本方法:指针碰撞法、空闲列表法 内存分配并发问题的解决:CAS、TLAB JVM对...

  • C,C++内存分配

    C语言内存分配: 静态内存分配,分配内存大小的是固定,问题:1.很容易超出栈内存的最大值 2.为了防止内存不够用会...

  • 管理与分配内存

    1. java的内存管理机制 Java的内存管理就是对象的分配和释放问题 ,分两个部分 分配:内存的分配是由程序完...

  • Netty源码七 ByteBuf

    内存分配概述 介绍netty内存分配,最为底层,负责从底层读据到ByteBuf。 三个问题+内存类别有哪些+如何减...

  • 【019】2020.11.19 周四 Java内存分布与回收策略

    内存分布与回收策略 解决两个问题 自动给对象分配内存 基本上都是堆上分配 自动回收分配给对象的内存 对象优先在新生...

  • 性能优化实践(四)-内存优化

    一、应用层 对应用层来说,最主要的内存问题还是内存泄漏问题。 Java中的内存分配 静态储存区:编译时就分配好,在...

  • android GC 笔记

    回收哪里的内存 栈的内存管理是顺序分配的,而且定长,不存在内存回收问题;而堆 则是为java对象的实例随机分配内存...

网友评论

      本文标题:内存分配问题

      本文链接:https://www.haomeiwen.com/subject/pqrzuftx.html