内存管理发展历程
一、 DOS时代:(单进程)同一时间只有一个进程运行 (也有一些特殊算法可以支持多进程)
二、 windows9x - 多个进程装入内存
问题:
1)内存不够用
2)互相打扰
三、为了解决这两个问题,诞生了现在的内存管理系统:虚拟地址 分页装入 软硬件结合寻址
- 内存分页:分成固定大小的页框(page frame)最基本的分页大
是4k。把程序(硬盘上)分成4k大小的块,用到哪一块加载哪一块。
加载中,内存满就交换分区。
流程举例:把进程分页后,记录到页表。之后告诉进程调度器有个进程要进入内存。假如程序入口在第三页,那么进程调度器会通知进程,先将第3页内容装入内存执行。在执行中,如果用到第4块,就把第四块装入。要是满了,进行交换分区(LRU算法,把最近最久没用的拿到SWAP分区
【硬盘实现,速度慢】)
虚拟内存(解决相互打扰问题)
1)DOS Win31 … 可以互相干掉对方的内存
2)为了保证互不影响 - 让进程工作在虚拟空间,程序中用到的空间地址不再是直接的物理地址,而是虚拟的地址,这样,A进程永远不可能访问到B进程的空间
3)虚拟空间多大呢?寻址空间 - 64位系统 2 ^ 64,比物理空间大很多 ,单位是byte
4)站在虚拟的角度,进程是独享整个系统 + CPU
5)内存映射:偏移量 + 段的基地址 = 线性地址 (虚拟空间)
6)线性地址通过 OS + MMU(硬件 Memory Management Unit)转换成物理地址
【所以操作系统非常安全】缺页中断
需要用到页面内存中没有,产生缺页异常(一种特殊中断),由内核处理并加载【慢】
ZGC
算法叫做 Colored Pointer
GC信息记录在指针上,不是记录在头部, immediate memory use
不支持32位,不支持指针压缩
42位指针 寻址空间4T JDK13 -> 16T 目前为止最大16T 2^44
CPU如何区分一个立即数 和 一条指令?
总线内部分为:数据总线 地址总线 控制总线
地址总线目前:48位 四位为颜色指针
颜色指针本质上包含了地址映射的概念