为了支持TB级内存,设计了基于页面 page的分页管理,类似于G1的分区Region
为了能够快速地并发标记和并发移动,对内存空间重新进行了划分,这就是ZGC 引入的颜色指针Color Pointers;
同时ZGC为了能更加高效地管理内存,设计了物理内存和虚拟内存两级内存管理
2.1 操作系统地址管理
程序试图访问一个虚拟内存页面时,这个请求会通过操作系统来访问真正的内存;也就是通过内存管理单元MMU把页码转换成页框码frame,加上虚拟地址提供的页内偏移量形成物理地址后去访问物理内存;如果没有记录,就判断该虚拟地址是否有效,如果是有效的,就从虚拟内存中将该地址指向的页面读入内存中的一个空闲页框中,并在页表中添加相对应的表项。
如果内存中没有空闲物理页框,就启动 “交换”,调用相应的内核操作函数,在物理页框中寻找一个当前不在使用的页面占据的页框,然后换成新的页面。
2.2 ZGC内存管理
1 实现两级内存管理;ZGC重新定义了虚拟内存和物理内存的映射关系。
2 ZGC 使用颜色指针Color Pointers来区别不同的虚拟视图,这些视图都会映射到操作系统的同一物理地址。
3 0~4TB : Java 堆空间(最大堆空间) 4~8TB 对应Marked0 视图, 8~12TB 对应Marked1 视图, 16~20TB 对应Remapped 这3个视图也是Java 堆空间的虚拟视图,这3个空间的切换是由垃圾回收的不同阶段触发的
4 ZGC 的低42位 用于描述真正的虚拟地址, 42~45位 用于描述元数据,其实就是颜色指针Color Pointers;46位不用
47~63位 固定为0
2.2.1 多视图映射 : 多个虚拟地址映射到一个物理内存地址
2.2.2 ZGC 多视图映射
使用mmap完成多视图映射