在对内存分配有疑问之后,我最近开始搜索和阅读有关ALDS和内存管理的信息,经过几天的研究,我学到了很多有关内存管理的知识,但实际的疑问仍未解决。
因此,问题在于,在将内存分配给变量时,系统如何确切地知道哪个内存块可用和哪个空闲,以及类似的,当我们销毁对象或将变量设置为null或GC释放时一些内存,它与该内存块的作用是什么,因为我知道删除时永远不会擦除实际数据,该内存块只是在某张表的某处被标记为空闲,但是该表是否跟踪每个如果是的话,那会不会变成很多数据要存储?
例如,如果我声明一个链表,那么将在堆中分配一个块,下一个块的值为null,因为没有其他节点可引用,现在随着我不断向其中添加更多节点,系统将继续分配更多的块,每个块都包含对下一个块的引用。现在,根据分配时内存的可用性,这些块可以出现在随机的位置,并且只能通过其前进的节点进行访问。
因此,现在,对于任何给定的内存块,系统将如何知道其空闲空间是否仅有垃圾值,或者实际上是某个链表的节点。
答案 0 :(得分:0)
在现代操作系统上,该过程具有逻辑的线性地址空间。该地址空间的一部分为系统保留,并且对于所有进程都是公用的。某些地址空间可能会保留,但其余大部分可用于该进程。
地址空间由PAGE TABLES定义。页表的结构由处理器定义,但是操作系统会为每个进程维护一个表。内存分配给PAGES中的进程。我知道的最小字节数是512字节,但在某些处理器和某些处理器配置中,其大小可以达到兆字节甚至更大。该大小始终为2的幂。
页表定义:
那里的操作系统只知道页面。
在下一级,有内存管理器。这些不是操作系统的一部分。内存管理器管理由操作系统分配的页面组成的堆。内存管理器必须跟踪堆大小以及在其中分配了哪些内存。
内存管理器的操作方式非常多种。您可以将malloc / free实现的丰富性链接到您的代码中以获得不同的行为。