2021-2-25:对于 Java MMAP,如何查看文件映射脏页,如何统计MMAP的内存大小?
我们写一个测试程序:
public static void main(String[] args) throws Exception {
RandomAccessFile randomAccessFile = new RandomAccessFile("./FileMmapTest.txt", "rw");
FileChannel channel = randomAccessFile.getChannel();
MappedByteBuffer []mappedByteBuffers = new MappedByteBuffer[5];
//开5个相同文件的MappedByteBuffer,但是实际机器内存只有8G
mappedByteBuffers[0] = channel.map(FileChannel.MapMode.READ_WRITE, 0, 2 * 1024 * 1024 * 1024 - 1);
mappedByteBuffers[1] = channel.map(FileChannel.MapMode.READ_WRITE, 0, 2 * 1024 * 1024 * 1024 - 1);
mappedByteBuffers[2] = channel.map(FileChannel.MapMode.READ_WRITE, 0, 2 * 1024 * 1024 * 1024 - 1);
mappedByteBuffers[3] = channel.map(FileChannel.MapMode.READ_WRITE, 0, 2 * 1024 * 1024 * 1024 - 1);
mappedByteBuffers[4] = channel.map(FileChannel.MapMode.READ_WRITE, 0, 2 * 1024 * 1024 * 1024 - 1);
for (int j = 0; j < 2*1024*1024*1024 - 1; j++) {
mappedByteBuffers[0].put("a".getBytes());
}
TimeUnit.SECONDS.sleep(1);
byte []to = new byte[1];
for (int j = 0; j < 2*1024*1024*1024 - 1; j++) {
mappedByteBuffers[1].get(to);
mappedByteBuffers[2].get(to);
mappedByteBuffers[3].get(to);
mappedByteBuffers[4].get(to);
}
while(true) {
TimeUnit.SECONDS.sleep(1);
}
}
等到程序运行到最后的死循环的时候,我们来看top -c的结果:
KiB Mem : 7493092 total, 147876 free, 3891680 used, 3453536 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 2845100 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+
25458 zhangha+ 20 0 14.147g 8.840g 8.599g S 0.0 124 2:33.16 java
可以观察到非常有意思的现象,这个进程占用了124%的内存,实际上Swap为0。总占用也没到100%。这是为什么呢?
我们来看下这个进程的smaps文件,这里进程号是25485,我们映射的文件是FileMmapTest.txt:
$ grep -A 11 FileMmapTest.txt /proc/25458/smaps
7fa870000000-7fa8f0000000 rw-s 00000000 ca:01 25190272 /home/zhanghaoxin/FileMmapTest.txt
Size: 2097152 kB
Rss: 2097152 kB
Pss: 493463 kB
Shared_Clean: 2097152 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 0 kB
Referenced: 2014104 kB
Anonymous: 0 kB
AnonHugePages: 0 kB
Swap: 0 kB
--
7fa8f0000000-7fa970000000 rw-s 00000000 ca:01 25190272 /home/zhanghaoxin/FileMmapTest.txt
Size: 2097152 kB
Rss: 2097152 kB
Pss: 493463 kB
Shared_Clean: 2097152 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 0 kB
Referenced: 2014104 kB
Anonymous: 0 kB
AnonHugePages: 0 kB
Swap: 0 kB
--
7fa970000000-7fa9f0000000 rw-s 00000000 ca:01 25190272 /home/zhanghaoxin/FileMmapTest.txt
Size: 2097152 kB
Rss: 2097152 kB
Pss: 493463 kB
Shared_Clean: 2097152 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 0 kB
Referenced: 2014104 kB
Anonymous: 0 kB
AnonHugePages: 0 kB
Swap: 0 kB
--
7fa9f0000000-7faa70000000 rw-s 00000000 ca:01 25190272 /home/zhanghaoxin/FileMmapTest.txt
Size: 2097152 kB
Rss: 2097152 kB
Pss: 493463 kB
Shared_Clean: 2097152 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 0 kB
Referenced: 2014104 kB
Anonymous: 0 kB
AnonHugePages: 0 kB
Swap: 0 kB
--
7faa70000000-7faaf0000000 rw-s 00000000 ca:01 25190272 /home/zhanghaoxin/FileMmapTest.txt
Size: 2097152 kB
Rss: 616496 kB
Pss: 123299 kB
Shared_Clean: 616496 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 0 kB
Referenced: 616492 kB
Anonymous: 0 kB
AnonHugePages: 0 kB
Swap: 0 kB
其中比较重要的8个字段的含义分别如下:
- Size:表示该映射区域在虚拟内存空间中的大小。
- Rss:表示该映射区域当前在物理内存中占用了多少空间
- Pss:该虚拟内存区域平摊计算后使用的物理内存大小(有些内存会和其他进程共享,例如mmap进来的)。比如该区域所映射的物理内存部分同时也被另一个进程映射了,且该部分物理内存的大小为1000KB,那么该进程分摊其中一半的内存,即Pss=500KB。
- Shared_Clean:和其他进程共享的未被改写的page的大小
- Shared_Dirty: 和其他进程共享的被改写的page的大小
- Private_Clean:未被改写的私有页面的大小。
- Private_Dirty: 已被改写的私有页面的大小。
- Swap:表示非mmap内存(也叫anonymous memory,比如malloc动态分配出来的内存)由于物理内存不足被swap到交换空间的大小。
我们可以看到,把这五个MappedByteBuffer的Pss加起来正好是2097151,就是我们映射的大小。可以推断出,我们这五个MappedByteBuffer在linux中的实现就是对应同一块内存。
同时,top命令看到的内存并不准,top,命令统计的是RSS字段,其实对于MMAP来说,更准确的应该是统计PSS字段
微信搜索“我的编程喵”关注公众号,每日一刷,轻松提升技术,斩获各种offer:
2021-2-25:对于 Java MMAP,如何查看文件映射脏页,如何统计MMAP的内存大小?的更多相关文章
- mmap和普通文件读写的区别和比较 & mmap的注意点
参考 http://www.cnblogs.com/huxiao-tee/p/4660352.html 对linux文件系统不了解的朋友,请参阅我之前写的博文<从内核文件系统看文件读写过程> ...
- linux查看文件夹大小,备份文件夹zip压缩解压
linux查看文件夹大小,备份文件夹zip压缩解压 du -sh : 查看当前目录总共占的容量.而不单独列出各子项占用的容量 du -lh --max-depth=1 : 查看当前目录下一级子文件和子 ...
- Java使用RandomAccessFile读写文件
目录 转载自:http://blog.csdn.net/akon_vm/article/details/7429245 Java RandomAccessFile RandomAccessFile是用 ...
- Java网络编程和NIO详解8:浅析mmap和Direct Buffer
Java网络编程与NIO详解8:浅析mmap和Direct Buffer 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NI ...
- Java网络编程与NIO详解8:浅析mmap和Direct Buffer
微信公众号[黄小斜]作者是蚂蚁金服 JAVA 工程师,目前在蚂蚁财富负责后端开发工作,专注于 JAVA 后端技术栈,同时也懂点投资理财,坚持学习和写作,用大厂程序员的视角解读技术与互联网,我的世界里不 ...
- 25个Java机器学习工具和库
本列表总结了25个Java机器学习工具&库: 1. Weka集成了数据挖掘工作的机器学习算法.这些算法可以直接应用于一个数据集上或者你可以自己编写代码来调用.Weka包括一系列的工具,如数据预 ...
- Java-Runoob-高级教程-实例-环境设置实例:4.Java 实例 – 如何查看当前 Java 运行的版本?
ylbtech-Java-Runoob-高级教程-实例-环境设置实例:4.Java 实例 – 如何查看当前 Java 运行的版本? 1.返回顶部 1. Java 实例 - 如何查看当前 Java 运行 ...
- 25个Java机器学习工具&库--转载
本列表总结了25个Java机器学习工具&库: 1. Weka集成了数据挖掘工作的机器学习算法.这些算法可以直接应用于一个数据集上或者你可以自己编写代码来调用.Weka包括一系列的工具,如数据预 ...
- 转:25个Java机器学习工具和库
转自:http://www.cnblogs.com/data2value/p/5419864.html 本列表总结了25个Java机器学习工具&库: 1. Weka集成了数据挖掘工作的机器学习 ...
随机推荐
- postgres-网络传输安全-openssl
网络传输安全 默认情况下pg服务端和客户端之间的数据传输是明文传输,有一定的安全隐患.pg中可以使用ssl进行安全的tcp/ip连接,以密文的形式进行数据的安全传输. 这个特性要求在客户端和服务器都安 ...
- cassandra权威指南读书笔记--数据建模
没有join操作.有轻量级事务和批处理,但是没有外键等.反规范化.3.0支持物化视图,允许在一个表上创建数据的多个物化视图.使用cassandra要从查询入手,而不是先从数据模型开始.先对查询建模,然 ...
- F - Cheapest Palindrome
有一个长度为m的字符串,由n种小写字母组成.对应的n种字母在这个字符串加上或者减去都有相应的费用,现在要将这个字符串变成回文串,问最低消费是多少? Keeping track of all the c ...
- hdu 4352 XHXJ's LIS(数位dp+状压)
Problem Description #define xhxj (Xin Hang senior sister(学姐)) If you do not know xhxj, then carefull ...
- windows server 2016 安装有线网卡驱动
为自己的本本安装了server 2016系统,但是官网下载的有线网卡驱动一直安不上,解决方法如下: 1.到Intel官网下载一个叫PROWinx64的驱动程序,解压到任意文件夹.依次进入PRO1000 ...
- 8.PowerShell DSC之Push
前言 LCM的默认mode就是push,所以对于push模式,我们直接就三步走 以下是示例: 1.编写配置 Authoring Configuration WebsiteTest { # Import ...
- 国产网络测试仪MiniSMB - 利用Ctrl+c/Ctrl+v/Ctrl+a快速编辑数据流
国产网络测试仪MiniSMB(www.minismb.com)是复刻smartbits的IP网络性能测试工具,是一款专门用于测试智能路由器,网络交换机的性能和稳定性的软硬件相结合的工具.可以通过此以太 ...
- Kubernets二进制安装(19)之集群平滑升级
在实际生产环境中,部署好的集群稳定就行了,但是,如果需要使用到新的功能或当前版本出现了严重的漏洞,都建议做升级,本教程是将node节点从v1.15.10版本平滑升级到v1.15.12版本,如果升级到相 ...
- 使VS开发的程序在Win7系统运行时自动提升权限
软件开发时,总是会遇到在Win7系统上运行不起来或者异常的情况,这通常是用户的权限不够引起的. 下面提供一个可以使程序运行时,自动提升用户权限的方法. 1.右键点击启动项目,单击"属性&qu ...
- codeforces 1029E Tree with Small Distances【思维+贪心】 【非原创】
题目:戳这里 学习博客:戳这里 题意:给一个树加最少的边,使得1到所有点的距离小于等于2. 解题思路:分析样例3可以看出,如果一个点到1的距离大于2,那么建立1到该点的父亲节点的边将比直接与该点建边更 ...