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