mysql virt虚拟内存_Java进程VIRT虚拟内存
1. 现象
最近发现线上机器 java 8 进程的 VIRT 虚拟内存使用达到了 50G+,如下图所示:
2. 不管用的 -Xmx
首先第一想到的当然使用 java 的 -Xmx 去限制堆的使用。但是无论怎样设置,都没有什么效果。没办法,只好开始苦逼的研究。
3. 什么是 VIRT
现代操作系统里面分配虚拟地址空间操作不同于分配物理内存。在64位操作系统上,可用的最大虚拟地址空间有16EB,即大概180亿GB。那么在一台只有16G的物理内存的机器上,我也能要求获得4TB的地址空间以备将来使用。例如:
void *mem = mmap(0, 4ul * 1024ul * 1024ul * 1024ul * 1024ul,
PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE,
-1, 0);
当使用 mmap 并设置 MAP_NORESERVE 标志时,并不会要求实际的物理内存和swap空间存在。所以上述代码可以在top中看到使用了 4096g 的 VIRT 虚拟内存,这当然是不可能的,它只是表示使用了 4096GB 的地址空间而已。
4. 为什么会用这么多地址空间
那 Java 程序为什么会使用这么多的地址空间呢?使用“pmap -x”来查看一下:
…
00007ff638021000 65404 0 0 ----- [ anon ]
00007ff63c000000 132 36 36 rw--- [ anon ]
00007ff63c021000 65404 0 0 ----- [ anon ]
00007ff640000000 132 28 28 rw--- [ anon ]
00007ff640021000 65404 0 0 ----- [ anon ]
00007ff644000000 132 8 8 rw--- [ anon ]
00007ff644021000 65404 0 0 ----- [ anon ]
00007ff648000000 184 184 184 rw--- [ anon ]
00007ff64802e000 65352 0 0 ----- [ anon ]
00007ff64c000000 132 100 100 rw--- [ anon ]
00007ff64c021000 65404 0 0 ----- [ anon ]
00007ff650000000 132 56 56 rw--- [ anon ]
00007ff650021000 65404 0 0 ----- [ anon ]
00007ff654000000 132 16 16 rw--- [ anon ]
00007ff654021000 65404 0 0 ----- [ anon ]
…
发现有很多奇怪的64MB的内存映射,查资料发现这是 glibc 在版本 2.10 引入的 arena 新功能导致。CentOS 6/7 的 glibc 大都是 2.12/ 2.17 了,所以都会有这个问题。这个功能对每个线程都分配一个分配一个本地arena来加速多线程的执行。
在 glibc 的 arena.c 中使用的 mmap() 调用就和之前的示例代码类似:
p2 = (char *)mmap(aligned_heap_area, HEAP_MAX_SIZE, PROT_NONE,
MAP_NORESERVE | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0)
之后,只有很小的一部分地址被映射到了物理内存中:
mprotect(p2, size, PROT_READ | PROT_WRITE)
因此在一个多线程程序中,会有相当多的 64MB 的 arena 被分配。这个可以用环境变量 MALLOC_ARENA_MAX 来控制。在64位系统中的默认值为 128。
5. Java 的特殊性
Java 程序由于自己维护堆的使用,导致调用 glibc 去管理内存的次数较少。更糟的是 Java 8 开始使用 metaspace 原空间取代永久代,而元空间是存放在操作系统本地内存中,那线程一多,每个线程都要使用一点元空间,每个线程都分配一个 arena,每个都64MB,就会导致巨大的虚拟地址被分配。
6. 结束语
总结一下:
VIRT高是因为分配了太多地址空间导致。
一般来说不用太在意VIRT太高,因为你有16EB的空间可以使用。
如果你实在需要控制VIRT的使用,设置环境变量MALLOC_ARENA_MAX,例如hadoop推荐值为4,因为YARN使用VIRT值监控资源使用。
mysql virt虚拟内存_Java进程VIRT虚拟内存相关推荐
- 虚拟内存以及进程的虚拟内存分布(第六章)
在早期的计算机中,程序都是直接运行在物理内存上的,意思是运行时访问的地址都是物理地址,而这要求程序使用的内存空间不超过物理内存的大小. 在现代计算机操作系统中,为了提高CPU的利用率计算机同时运行多个 ...
- 详解进程的虚拟内存,物理内存,共享内存
目录 写在前面: 一.关于内存的两个概念 1.1 虚拟内存 1.2 驻留内存 二.详解top命令中VIRT.RES和SHR 2.1 top命令中ⅥRT.RES和SHR的含义 三.进程的smaps文 ...
- mysql top virt_linux top命令VIRT,RES,SHR,DATA的含义
VIRT:virtual memory usage 虚拟内存1.进程"需要的"虚拟内存大小,包括进程使用的库.代码.数据等 2.假如进程申请100m的内存,但实际只使用了10m,那 ...
- 虚拟内存与进程地址空间
文章目录 虚拟内存与进程地址空间 一.虚拟地址与物理地址的定义 二.虚拟地址的工作原理 1.分页映射 2.虚拟页的分类 3.页表 多级页表 4.地址映射的方式 地址映射示例 5.缺页 缺页中断的处理方 ...
- Linux虚拟内存和进程虚拟地址空间简述
后台开发经常会问此类问题,虽说难度不大,但是知道和不知道还是有区别的.以下的内容总结自<深入理解Linux内核>第一章,仅仅是简述,没有深入研究,毕竟内存管理这一块内容超级多,感兴趣的同学 ...
- 优化命令之vmstat——监控虚拟内存、进程、cpu
目录 一:vmstat概述 1.1物理内存和虚拟内存 1.2虚拟内存原理 二:vmstat命令 2.1vmstat格式 2.2vmstat参数 三:案例 3.1显示虚拟内存使用情况 3.2一秒内显示2 ...
- 【Linux】进程概念 —— 虚拟内存地址空间
目录 一.进程地址空间 1.进程地址空间分布图 2.验证上述进程地址空间 3.Linux vs Windows 二.了解虚拟内存地址空间 0.通过代码引出虚拟内存地址空间概念 1.什么是虚拟内存地址空 ...
- 僵尸和孤儿进程及虚拟内存
调研进程的调度算法. 根据系统的资源分配策略所规定的资源分配算法.对于不同的的系统和系统目标,通常采用不同的调度算法,例如,在批处理系统中,为了照顾为数众多的段作业,应采用短作业优先的调度算法:又如在 ...
- 实验五 显示进程的虚拟内存地址空间分布信息
实验五 显示进程的虚拟内存地址空间分布信息 目录 实验五 显示进程的虚拟内存地址空间分布信息 实验环境 一.实验目的 二.实验内容 三.实验步骤 四.实验总结 实验环境 操作系统版本:ubuntu-1 ...
- 服务器关闭虚拟内存好不好,服务器虚拟内存有必要开吗
服务器虚拟内存有必要开吗 内容精选 换一换 对于不同的硬件设备,通过在BIOS中设置一些高级选项,可以有效提升服务器性能.服务器上的SMMU一般用来完成设备的地址转换,并且可以实现设备隔离,在虚拟化中 ...
最新文章
- 生猛!PDF 版本 万赞 Java 手册开放下载!
- Expression Web 3 安装问题
- mysql查询每小时数据和上小时数据的差值
- 14c语言课程设计题目,2011级数据库课程设计任务书
- jquery插件编写学习
- XCTF WEB simple_js
- STM32F2xx DMA Controllers
- 2018年10月28日宁波dotnet社区活动回顾及下次活动预告
- RVC使用指南(一)-基本配置
- js实现螺旋矩阵算法
- 应届生去软通动力怎么样_超强干货:应届生如何找实习工作?
- 质性研究工具_MAXQDA在质性数据分析中的使用——免费的中文在线研讨会!
- java 程序路径_Java程序路径
- JAVA基础知识点大全之一
- ubuntu21.04 Thunderbird上配置163邮箱
- 2021-02-10微软漏洞通告
- 多张图片怎么同时修改dpi?教你一键批量修改图片dpi
- 计算机主题桌面更改不了,win7怎么更换电脑主题 win7电脑主题更换不了怎么办
- vue element-ui 项目使用双色主题(白天,黑夜模式)
- Qt5:输入控件 QPushButton/ QToolButton/ QRadioButton/ QCheckBox/ QTextEdit/ QComboBox/ QSpinBox/ QLabel