目录

更多内容参考: https://sylvanassun.github.io/2017/10/29/2017-10-29-virtual_memory/

内核空间,用户空间

总物理内存分成内核空间(内核态)、用户空间(用户态),如图1。由于每个进程可以使用的虚拟内存就是总内存,所以也会包括内核区域,但是用户进程不能访问内核那块空间。

进程虚拟地址空间结构如下

补充:当java程序new了一个对象时heap 区使用的水位线(brk)就会上升。此时需要去申请新的物理内存。如果物理有内存可用,就使用。如果物理内存用完了,则将物理内存中某些页淘汰到磁盘(如果那个页对应的是文件,这直接flush到磁盘,如果那个页是程序中的临时数据,则flush到磁盘的swap file交换文件,交换文件的大小和页是保持一致的),然后复用那个内存页。

生产环境为了避免使用交换分区,最好只跑一个程序。这样只需要保证heap内存小于总内存就好了

每个进程在启动的时候会分配一个虚拟地址空间。对于64位系统,寻址空间一般是2^48 (256T)(如图2),64位太大了用不了。相当于每个进程逻辑上可以访问256T的内存。

check_address_size.jpg

共享内存

由于每个进程的虚拟空间都是共享通一个物理内存,所以每个进程的页表可以指向相同的物理内存,用以实现进程间通信,这中方式叫“共享内存”。