19动态内存分配

存储器分配

存储器分配是指 操作系统管理计算机内存的过程。在操作系统中,内存被分为若干个固定大小的区域,称为页面(Page)。这些页面可以被分配给进程,来存储他们的代码、数据和堆栈等消息。
分配原理:
1.请求内存:进程向操作系统请求内存,指定需要内存的大小。
2.分配内存:操作系统为进程分配一定数量的内存页面,将它们地址映射到进程的虚拟地址空间中。
3.使用内存:进程使用分配的内存,存储他们的代码、数据和堆栈等信息。
4.释放内存:进程释放不再需要的内存页面,返回给操作系统进行管理和分配给其他进程。

虚拟内存与存储器的分配的联系
虚拟内存是一种计算机中的一种技术,它允许进程访问比实际可用的内存更大的空间。虚拟内存是用了硬盘空间来扩展内存,使得进程可以使用比实际物理内存更多的内存,从而提高了系统的性能和效率。

使用存储器分配管理虚拟内存的步骤:
1.虚拟内存地址转换
2.页面置换
3.页面调度:需要考虑如何分配物理内存页面给进程,以最大限度地提高系统的性能和效率。
4.页面保护:需要控制进程访问内存的权限

动态内存分配器

动态内存分配器是指一种在程序运行时动态地分配和管理内存的机制,通常被用于在堆中动态分配内存。堆是指操作系统管理的一块动态分配的内存区域。

动态内存分配器的实现步骤:
1.内存分配:动态内存分配器会管理一块内存池(memory pool),并根据需要将这些内存块分配给程序中的对象。常见的内存分配算法有首次适配、最佳适配和最差适配。
2.内存释放:当程序中的对象不再需要使用时,动态内存分配器会将其对应的内存块释放回内存池中,以便其他对象可以使用。
3.内存和并:当相邻的内存块都被释放时,动态内存分配器可以将它们合并成一个更大的内存块,以便后续分配时可以更好地利用这些内存。
4.内存碎片整理:动态内存分配器会在堆中进行频繁的内存分配和释放操作,可能会导致一些小的内存块被分散在堆中,形成碎片。为了避免这些碎片对内存分配器的性能产生负面影响,动态内存分配器通常会进行碎片整理操作,将相邻的小内存块合并成更大的内存块。

分配器的要求和目标

分配器用于管理动态内存分配和释放,一个好的分配器应该满足以下要求和目标:
1.高效性:分配器应该尽可能快的分配和释放内存,以最小化应用程序的等待时间。
2.可伸缩性:分配器应该能够有效地管理内存,并且能够处理多个并发请求。此外,分配器可以动态调整大小来满足不同应用程序的需求。
3.低碎片:分配器应该尽可能地减少内存碎片的产生,以便可以更有效地利用可用内存。
4.可靠性:分配器应该能够保证分配和释放操作的正确性,并且能够避免内存泄漏和非法内存访问。
5.可移植性:分配器应该能够在不同的平台和操作系统上运行

约束:
1.分配器的内部实现必须是线程安全的,以便能够支持多线程应用程序
2.分配器必须管理内存的布局和对齐,来确保内存分配的正确性和效率
3.分配器必须支持内存池技术,以避免频繁的内存分配和释放操作。
4.分配器必须支持内存压缩技术,以最大限度地减少内存碎片和提高内存利用率。

性能的衡量:速度和内存效率
速度通常用吞吐量来衡量,也就是在一定的时间内分配和释放的内存块的数量。吞吐量越高,分配器的性能越好。
内存效率用内存利用率来衡量,也就是已分配的内存和总内存的比率。内存利用率越高,分配器的性能越好。

为了最大化内存的吞吐量和内存的利用率,采取的措施:
1.尽可能减少内存碎片的产生,通过内存池技术和内存压缩技术来实现
2.尽可能地缓存内存块,可以通过使用快速分配器和缓存池来实现
3.尽可能减少内存分配和释放的次数,可以通过使用分块技术和预分配技术来实现。
4.优化内存块的分配和释放算法,可以采用适当的算法来最大化吞叶量和内存利用率。
5.使用线程安全的实现来支持多线程应用程序。

内存碎片、外部碎片

内部碎片指的是分配给进程的内存块中,由于分配的大小比请求的大小多出一些空闲的空间而浪费的内存。例如,如果一个进程请求分配20个字节的内存块,但是系统只有24个字节的空闲内存块可供分配,那么这个进程将分配整个24个字节的内存块,其中4个字节将是浪费的内存,这就是内部碎片。

外部碎片则指的是内存中未被分配但大小过小而不能分配给请求分配的进程的空间。这些空间可能太小,以至于无法满足任何进程的内存需求。例如,如果一个进程需要分配1000个字节的内存块,但是系统中只有一些零散的空间,每个空间大小都不到1000个字节,那么这个进程就无法被满足,即使总空间比1000个字节大,这些空间也将无法被使用,这就是外部碎片。

内部碎片和外部碎片都会浪费内存资源,对于系统的内存管理来说是一个重要的问题。因此,内存管理器需要尽可能地减少内部碎片和外部碎片,以提高内存的利用率和系统的性能。

你可能感兴趣的:(jvm,linux,java)