程序存储区、
静态存储区、
动态存储区。
程序的数据一般存放在静态存储区和动态存储区。
静态存储区是当程序开始的时候就分配好的一块固定的内存区。
动态存储区一般是在程序运行过程中根据需要动态去分配和释放的内存区域。这块内存区域需要开发人员在使用完毕之后进行释放,如果没有释放动态分配的内存区域就会造成内存泄漏。相应的这块区域也不能够被使用。
举个例子:有一个可以装50ml水的空杯子,但是你非得向这个被子里面倒了100ml水,那么这个时候多余的水肯定会流出来,这就是水溢出了。那么放到内存来讲,就是内存溢出。
内存碎片分为外部碎片和内部碎片
外部碎片指的是还没有被分配出去(不属于任何进程),但由于太小了无法分配给申请内存空间的新进程的内存空闲区域。
外部碎片是出于任何已分配区域或页面外部的空闲存储块。这些存储块的总和可以满足当前申请的长度要求,但是由于它们的地址不连续或其他原因,使得系统无法满足当前申请。
内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的
空间;
内部碎片是处于内部或页面内部的存储块。占有这些区域或页面的进程并不使用这个存储块。而在进程占有这块存储块时,系统无法利用它。直到进程释放它,或进程结束时,系统才有可能利用这个存储块。
碎片现象的存在使得内存空间利用率降低 。
“碎片的内存”描述一个系统中所有不可用的空闲内存。这些资源之所以仍然未被使用,是因为负责分配内存的分配器使这些内存无法使用。这一问题通常都会发生,原因在于空闲内存以小而不连续方式出现在不同的位置。由于分配方法决定内存碎片是否是一个问题,因此内存分配器在保证空闲资源可用性方面扮演着重要的角色。
掌握可供使用的数据寿命,好处在于可以使数据以后进先出的方式叠加起来。这样就可以使内存分配程序工作效率更高,而不会出现内存碎片。一般来说,运行时间内的内存分配是不可叠加的。内存分配在时间上是独立的,从而使得碎片问题难以解决。
内部碎片的产生:因为所有的内存分配必须起始于可被 4、8 或 16 整除(视处理器体系结构而定)的地址或者因为MMU的分页机制的限制,决定内存分配算法仅能把预定大小的内存块分配给客户。
假设当某个客户请求一个 43 字节的内存块时,因为没有适合大小的内存,所以它可能会获得 44字节、48字节等稍大一点的字节,因此由所需大小四舍五入而产生的多余空间就叫内部碎片。
不会根据 *** 作系统的架构和 Redis jemalloc 分配策略,应用程序申请内存大小必须是一块连续的内存地址空间的 N 个字节(N 表示需要向物理内存申请大于等于实际需要存储数据的内存空间的大小)
虽然 *** 作系统的剩余内存空间足够,但是应用程序申请的是一块连续的地址空间的 N 个字节,而实际已申请的剩余的内存空间中没有大小为 N 字节的连续空间,导致这块剩余空间不可用,那么这些剩余空间对于内存整体来说就是内存碎片
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)