JAVA写文件的基本流程
在不使用堆外内存的情况下,java在写文件时,先将字节写入JVM的堆内内存中;然后调用jvm的写文件函数,将字节写入jvm的堆外内存中,jvm再调用系统内核的写文件函数,将字节写入内核的heap中;然后内核将字节写入page cache中,将page cache状态改为dirty,根据page cache的回写机制在合适的时机将字节写入磁盘。
page cache 自动回写机制
page cache的回写时机由系统配置/etc/sysctl.conf 中的几个参数决定,分别是:
- dirty_background_bytes
默认值:0 表示不启用
当脏页所占的内存大小超过dirty_background_bytes时,内核的pdflush线程会从后台开始回写脏页,不会影响应用程序的后序IO操作。
- dirty_background_ratio
默认值 :10
参数意义:当脏页所占的百分比(相对于所有可用内存,即空闲内存页+可回收内存页)达到dirty_background_ratio时内核的pdflush线程从后台开始回写脏页,不会影响应用程序的后序IO操作。增大会使用更多内存用于缓冲,可以提高系统的读写性能。当需要持续、恒定的写入场合时,应该降低该数值。
注意:dirty_background_bytes参数和dirty_background_ratio参数是相对的,只能指定其中一个。当其中一个参数文件被写入时,会立即开始计算脏页限制,并且会将另一个参数的值清零。
- dirty_bytes
默认值:0 表示不启用
当脏页所占的内存数量达到dirty_bytes时,内核将脏页中的数据刷入磁盘并阻塞后序的IO操作。
注意:dirty_bytes参数和dirty_ratio参数是相对的,只能指定其中一个。当其中一个参数文件被写入时,会立即开始计算脏页限制,并且会将另一个参数的值清零
- dirty_ratio
默认值:20
参数意义:当脏页所占的百分比(相对于所有可用内存,即空闲内存页+可回收内存页)达到dirty_ratio时,内核将脏页中的数据刷入磁盘并阻塞后序的IO操作。
- dirty_background_ratio与dirty_r
本文来源gaodai.ma#com搞#代!码网_
atio比较
dirty_ratio是属于强制性的回写,也就是说当一个内存区的脏页达到这个比例时就会触发内核内存管理把脏页强制回写的流程,但dirty_background_ratio是属于软性的行为,因为这是透过pdflush内核线程进行的流程,可以在后台执行对这些脏页面回写,并不会因此影响到当下正在执行中的过程。 所以看Linux内核中预设的比例是脏页达到5%的比例时就会先透过pdflush内核线程进行回写,当脏页达到10%比例时,就等于是一个很严重的状况,此时就会在平衡脏页面流程中触发强制的回写,让系统可以回复到原本预设合理的状态。
- dirty_expire_centisecs
默认值:3000
参数意义:用来指定脏数据能存活的时间。指定的值是按100算做一秒计算。只有当超过这个值后,才会被内核进程pdflush写到磁盘。
- dirty_writeback_centisecs
默认值:500
参数意义:pdflush回写的频率,每次的唤醒的间隔,是以数字100算做1秒。如果将这项值设为500就相当5秒唤醒pdflush进程。如果将这项值设为0就表示完全禁止定期回写数据。
- drop_caches
向/proc/sys/vm/drop_caches文件中写入数值可以使内核释放page cache,dentries和inodes缓存所占的内存。
只释放pagecache:
echo 1 > /proc/sys/vm/drop_caches