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虚拟内存高问题研究相关推荐

  1. mysql top virt_linux top命令VIRT,RES,SHR,DATA的含义

    VIRT:virtual memory usage 虚拟内存1.进程"需要的"虚拟内存大小,包括进程使用的库.代码.数据等 2.假如进程申请100m的内存,但实际只使用了10m,那 ...

  2. 计算机开机内存占用80%,虚拟内存导致!Win10电脑开机后内存占用高达80%以上的解决方法...

    电脑使用一段时间都是正常的,电脑开机之后内存占用率基本在20-30%之间,不过现在开机后内存占用率飙升,内存基本占用80%以上,由于同时磁盘I/O也比较高,按照网上教程基本都是禁用superfetch ...

  3. Mysql占用CPU过高排查过程及可能优化方案

    1.查看生产DB服务器top列表, 执行 top 命令 2.使用root用户登录mysql 执行 show full processlist 查看慢查询,反复执行,如果发现一直有select 查询语句 ...

  4. MySQL占用CPU过高

    服务器MySQL占用CPU过高时,应排查的因素包括: 进程列表 排除高并发因素先要找到导致CPU过高的SQL mysql> SHOW PROCESSLIST; 查找负荷最重的SQL语句,优化该S ...

  5. 服务器虚拟内存设置一下,服务器虚拟内存设置一下

    服务器虚拟内存设置一下 内容精选 换一换 对于不同的硬件设备,通过在BIOS中设置一些高级选项,可以有效提升服务器性能.服务器上的SMMU一般用来完成设备的地址转换,并且可以实现设备隔离,在虚拟化中很 ...

  6. compattelrunner.exe占用磁盘过高_Linux 系统 CPU 占用率太高?

    在使用Linux 系统时,经常会遇到 CPU 占用率太高的问题.此篇文章教你如何解决,排查解决的思路是什么 CPU负载查看方法: 使用vmstat查看系统维度的CPU负载 使用top查看进程维度的CP ...

  7. 怎么检查服务器虚拟内存,服务器怎么查看虚拟内存

    服务器怎么查看虚拟内存 内容精选 换一换 华为云帮助中心,为用户提供产品简介.价格说明.购买指南.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助您快速上手使用华为云服务. 开启弹性 ...

  8. linux 内存 virt,Linux 内存 virt res shr data swap 意义

    virt  res shr data 这几个很容易搞混了,写一下 首先解释下含义: virt : 程序占用的虚拟内存 man: The total amount of virtual memory u ...

  9. Linux 问题解决 :/lib/systemd/systemd-journald 占用内存过高

    早上在用htop查看Linux系统状况时,发现/lib/systemd/systemd-journald占用了过高的内存. 然后我感觉是因为我的Java程序遇到问题阻塞了的原因,我先把JVM的内存du ...

  10. 解决win10一开机内存(8G)就占用70%多,查看任务管理器并没有占用内存很高的进程的问题

    问题描述: 这几天电脑运行大内存的应用,会出现卡死现象,今早开机时发现内存占用高达70%(未运行任何程序),重启后内存占用还是很高.本人使用idea编程工具,运行代码时内存占用90%多,严重影响了日常 ...

最新文章

  1. 黄海广博士的机器学习个人笔记及深度学习笔记
  2. 深入探寻seajs的模块化与加载方式
  3. 从配置文件(*.config)读到内存中,手动修改配置文件后,内存中数据改变问题.
  4. ESP32烧录bin,乐鑫下载工具使用flash_download_tool
  5. FXForms,自动生成iOS表单
  6. java--方法重写与重载
  7. java api文档_JAVA浏览器控件JxBrowser v7.3上线!最新API文档打包带走
  8. SqlServer复制表结构:从另一张表中获取某些字段和类型并添加到一张已经存在的表中...
  9. 咸鱼ZTMR实例—PS2手柄
  10. MySQL JSON_EXTRACT()、JSON_UNQUOTE() 函数获取JSON串的值
  11. 前端高效开发必备——常用js框架和第三方插件
  12. ipad无线怎么重新连接到服务器,iPad不能连接无线怎么办 iPad不能连接无线解决方法【详解】...
  13. Vmware虚拟化概念原理
  14. 2021年全球最具吸引力的雇主:谷歌、微软、苹果占据前三名
  15. 【OGG】extract不抓取日志--running状态--不能stop和kill--自动abended
  16. Android Gradle排除依赖模块的某个类
  17. 信息化系统工程IPTV或OTT-TV节目系统解决方案
  18. 【金九银十】软件测试中的高频面试题梳理(内附答案)
  19. 小长假——纪念我们的英语学习
  20. jquerynbsp;form表单.seria…

热门文章

  1. Java总结IO之总集篇
  2. HTML+CSS项目练习(8)-发光文字动画
  3. 阿里云oss使用cdn,节省oss下行流量
  4. Jenkins的windows10 从节点经常性掉线问题解决
  5. Gspay 和 95epay
  6. 随机游走 推荐系统论文阅读
  7. 单片机c语言程序编写步骤,Proteus运行Keil编写的51单片机C语言步骤
  8. 记一次 黑软件 kthreaddi 攻防战
  9. 表白神器!程序员七夕情人节源码合集
  10. 计算机知识练习中公,计算机考试题库:计算机基础练习题(14)