Java并发编程:虚拟内存之页面抖动

112 阅读2分钟

src=http___i0.hdslb.com_bfs_article_807aa46619617caf3a3ea976300b575abae0676c.png&refer=http___i0.hdslb.webp 本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、前言

       通过《Java并发编程:虚拟内存之LRU算法实现》,我们已经了解了Linux中的LRU算法(即最近最少使用算法)的实现逻辑。本文将为大家继续讲解虚拟内存的页面抖动页面持久化逻辑。

二、页面抖动

       从前文中我们了解到,当物理内存资源不足时,就会通过某种内存淘汰策略选出要淘汰的内存页,然后以页面置换的方式,将被淘汰的页面置换掉。
       但是在一些特殊情况下,操作系统会出现频繁置换内存页的情况,这种情况就被称之为页面抖动
       页面抖动的情况常见于某个应用程序频繁访问的内存页数目大于物理内存所能分配的页面数目,当应用程序运行时,由于物理内存所能支持的页面数目不够,于是就出现了频繁置换内存页的情况。
       页面抖动会大量消耗操作系统内核的时间,降低系统性能。

三、页面持久化

       Linux为了提高系统性能,当应用程序修改数据时,一般情况下,都是修改内存页中的数据,并不会直接将数据写入到磁盘,以此来降低系统IO请求。
       那么,Linux是怎么将内存页中的数据持久化到磁盘的?

内存页持久化流程

       当应用程序修改了内存页中的数据以后,Linux会给这个内存页添加一个脏页标识,表示这个页面被修改过了,然后Linux内核会通过线程来将这些脏页写入到磁盘,最后再去掉这些内存页脏页标识

内存页持久化时机

       Linux会在以下三种情况对脏页进行持久化:
              1. 当物理内存资源不足时,Linux要进行内存页置换。在置换之前,如果这个页面是脏页,Linux会先将其数据持久化到磁盘;
              2. 当内存中的空闲页面低于阈值时,Linux也会进行刷脏;
              3. 当脏页在内存中存活的时候超过指定期限以后,Linux也会进行刷脏。

四、后言

       既然看到这里了,感觉有所收获的朋友,不妨来个大大的点赞吧~~~