mysql virt虚拟内存_JVM占用VIRT虚拟内存高问题研究
1. 现象
最近发现线上机器 java 8 进程的 VIRT 虚拟内存使用达到了 11G+,如下图所示:
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虚拟内存_JVM占用VIRT虚拟内存高问题研究相关推荐
- mysql top virt_linux top命令VIRT,RES,SHR,DATA的含义
VIRT:virtual memory usage 虚拟内存1.进程"需要的"虚拟内存大小,包括进程使用的库.代码.数据等 2.假如进程申请100m的内存,但实际只使用了10m,那 ...
- 计算机开机内存占用80%,虚拟内存导致!Win10电脑开机后内存占用高达80%以上的解决方法...
电脑使用一段时间都是正常的,电脑开机之后内存占用率基本在20-30%之间,不过现在开机后内存占用率飙升,内存基本占用80%以上,由于同时磁盘I/O也比较高,按照网上教程基本都是禁用superfetch ...
- Mysql占用CPU过高排查过程及可能优化方案
1.查看生产DB服务器top列表, 执行 top 命令 2.使用root用户登录mysql 执行 show full processlist 查看慢查询,反复执行,如果发现一直有select 查询语句 ...
- MySQL占用CPU过高
服务器MySQL占用CPU过高时,应排查的因素包括: 进程列表 排除高并发因素先要找到导致CPU过高的SQL mysql> SHOW PROCESSLIST; 查找负荷最重的SQL语句,优化该S ...
- 服务器虚拟内存设置一下,服务器虚拟内存设置一下
服务器虚拟内存设置一下 内容精选 换一换 对于不同的硬件设备,通过在BIOS中设置一些高级选项,可以有效提升服务器性能.服务器上的SMMU一般用来完成设备的地址转换,并且可以实现设备隔离,在虚拟化中很 ...
- compattelrunner.exe占用磁盘过高_Linux 系统 CPU 占用率太高?
在使用Linux 系统时,经常会遇到 CPU 占用率太高的问题.此篇文章教你如何解决,排查解决的思路是什么 CPU负载查看方法: 使用vmstat查看系统维度的CPU负载 使用top查看进程维度的CP ...
- 怎么检查服务器虚拟内存,服务器怎么查看虚拟内存
服务器怎么查看虚拟内存 内容精选 换一换 华为云帮助中心,为用户提供产品简介.价格说明.购买指南.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助您快速上手使用华为云服务. 开启弹性 ...
- linux 内存 virt,Linux 内存 virt res shr data swap 意义
virt res shr data 这几个很容易搞混了,写一下 首先解释下含义: virt : 程序占用的虚拟内存 man: The total amount of virtual memory u ...
- Linux 问题解决 :/lib/systemd/systemd-journald 占用内存过高
早上在用htop查看Linux系统状况时,发现/lib/systemd/systemd-journald占用了过高的内存. 然后我感觉是因为我的Java程序遇到问题阻塞了的原因,我先把JVM的内存du ...
- 解决win10一开机内存(8G)就占用70%多,查看任务管理器并没有占用内存很高的进程的问题
问题描述: 这几天电脑运行大内存的应用,会出现卡死现象,今早开机时发现内存占用高达70%(未运行任何程序),重启后内存占用还是很高.本人使用idea编程工具,运行代码时内存占用90%多,严重影响了日常 ...
最新文章
- 黄海广博士的机器学习个人笔记及深度学习笔记
- 深入探寻seajs的模块化与加载方式
- 从配置文件(*.config)读到内存中,手动修改配置文件后,内存中数据改变问题.
- ESP32烧录bin,乐鑫下载工具使用flash_download_tool
- FXForms,自动生成iOS表单
- java--方法重写与重载
- java api文档_JAVA浏览器控件JxBrowser v7.3上线!最新API文档打包带走
- SqlServer复制表结构:从另一张表中获取某些字段和类型并添加到一张已经存在的表中...
- 咸鱼ZTMR实例—PS2手柄
- MySQL JSON_EXTRACT()、JSON_UNQUOTE() 函数获取JSON串的值
- 前端高效开发必备——常用js框架和第三方插件
- ipad无线怎么重新连接到服务器,iPad不能连接无线怎么办 iPad不能连接无线解决方法【详解】...
- Vmware虚拟化概念原理
- 2021年全球最具吸引力的雇主:谷歌、微软、苹果占据前三名
- 【OGG】extract不抓取日志--running状态--不能stop和kill--自动abended
- Android Gradle排除依赖模块的某个类
- 信息化系统工程IPTV或OTT-TV节目系统解决方案
- 【金九银十】软件测试中的高频面试题梳理(内附答案)
- 小长假——纪念我们的英语学习
- jquerynbsp;form表单.seria…