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虚拟内存相关推荐

  1. 虚拟内存以及进程的虚拟内存分布(第六章)

    在早期的计算机中,程序都是直接运行在物理内存上的,意思是运行时访问的地址都是物理地址,而这要求程序使用的内存空间不超过物理内存的大小. 在现代计算机操作系统中,为了提高CPU的利用率计算机同时运行多个 ...

  2. 详解进程的虚拟内存,物理内存,共享内存

    ​ 目录 写在前面: 一.关于内存的两个概念 1.1 虚拟内存 1.2 驻留内存 二.详解top命令中VIRT.RES和SHR 2.1 top命令中ⅥRT.RES和SHR的含义 三.进程的smaps文 ...

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

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

  4. 虚拟内存与进程地址空间

    文章目录 虚拟内存与进程地址空间 一.虚拟地址与物理地址的定义 二.虚拟地址的工作原理 1.分页映射 2.虚拟页的分类 3.页表 多级页表 4.地址映射的方式 地址映射示例 5.缺页 缺页中断的处理方 ...

  5. Linux虚拟内存和进程虚拟地址空间简述

    后台开发经常会问此类问题,虽说难度不大,但是知道和不知道还是有区别的.以下的内容总结自<深入理解Linux内核>第一章,仅仅是简述,没有深入研究,毕竟内存管理这一块内容超级多,感兴趣的同学 ...

  6. 优化命令之vmstat——监控虚拟内存、进程、cpu

    目录 一:vmstat概述 1.1物理内存和虚拟内存 1.2虚拟内存原理 二:vmstat命令 2.1vmstat格式 2.2vmstat参数 三:案例 3.1显示虚拟内存使用情况 3.2一秒内显示2 ...

  7. 【Linux】进程概念 —— 虚拟内存地址空间

    目录 一.进程地址空间 1.进程地址空间分布图 2.验证上述进程地址空间 3.Linux vs Windows 二.了解虚拟内存地址空间 0.通过代码引出虚拟内存地址空间概念 1.什么是虚拟内存地址空 ...

  8. 僵尸和孤儿进程及虚拟内存

    调研进程的调度算法. 根据系统的资源分配策略所规定的资源分配算法.对于不同的的系统和系统目标,通常采用不同的调度算法,例如,在批处理系统中,为了照顾为数众多的段作业,应采用短作业优先的调度算法:又如在 ...

  9. 实验五 显示进程的虚拟内存地址空间分布信息

    实验五 显示进程的虚拟内存地址空间分布信息 目录 实验五 显示进程的虚拟内存地址空间分布信息 实验环境 一.实验目的 二.实验内容 三.实验步骤 四.实验总结 实验环境 操作系统版本:ubuntu-1 ...

  10. 服务器关闭虚拟内存好不好,服务器虚拟内存有必要开吗

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

最新文章

  1. 生猛!PDF 版本 万赞 Java 手册开放下载!
  2. Expression Web 3 安装问题
  3. mysql查询每小时数据和上小时数据的差值
  4. 14c语言课程设计题目,2011级数据库课程设计任务书
  5. jquery插件编写学习
  6. XCTF WEB simple_js
  7. STM32F2xx DMA Controllers
  8. 2018年10月28日宁波dotnet社区活动回顾及下次活动预告
  9. RVC使用指南(一)-基本配置
  10. js实现螺旋矩阵算法
  11. 应届生去软通动力怎么样_超强干货:应届生如何找实习工作?
  12. 质性研究工具_MAXQDA在质性数据分析中的使用——免费的中文在线研讨会!
  13. java 程序路径_Java程序路径
  14. JAVA基础知识点大全之一
  15. ubuntu21.04 Thunderbird上配置163邮箱
  16. 2021-02-10微软漏洞通告
  17. 多张图片怎么同时修改dpi?教你一键批量修改图片dpi
  18. 计算机主题桌面更改不了,win7怎么更换电脑主题 win7电脑主题更换不了怎么办
  19. vue element-ui 项目使用双色主题(白天,黑夜模式)
  20. Qt5:输入控件 QPushButton/ QToolButton/ QRadioButton/ QCheckBox/ QTextEdit/ QComboBox/ QSpinBox/ QLabel

热门文章

  1. 怎样在富文本编辑器插入图片
  2. laravel的Eloquent模型
  3. 白领巧学燕子飞可治颈椎疼
  4. python判断正数和负数教案_(完整版)正数和负数教学设计
  5. Python 网络爬虫及数据可视化
  6. 【毕业设计】大数据招聘数据分析可视化 - python
  7. 0920-TCP断线重连 reconnect
  8. Python爬取拉钩招聘网,用数据告诉你这类程序员最赚钱
  9. krait和kryo_高效的Java序列化(Kryo和FST)
  10. Java编写杨辉三角