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. 磁盘管理 ——RAID1+0卷+LVM
  2. ASP.NET 实践:写入 Cookie
  3. 阿里云Linux的mysql安装,使用yum安装
  4. 华夏基金专访神策数据创始人兼 CEO 桑文锋,金融科技数字化趋势认知传递
  5. ROS Kinetic 与STM32通信,控制一盏LED灯
  6. Ecshop:后台添加新功能栏目以及管理权限设置
  7. MySQL初识-架构-安装-初始化-连接-管理工具-数据文件
  8. redis学习与入门~~~
  9. java 通过模板替换pdf_word模板替换方案 PDF 下载
  10. mysql amd.dll 后门_DLL后门清除完全篇
  11. 【Spark】Spark的一个案例 Encountered removing nulls from dataset or using handleInvalid = “keep“ or “skip“
  12. redis学习笔记---java操作redis,使用expire模拟指定时间段内限制ip访问的次数;
  13. Treeview动态添加用户控件 取值和传值(第二种样式)
  14. pubmed显示服务器不稳定,你的pubmed又不能显示影响因子了,因为 ……
  15. android 鼠标映射 专业版,安卓otg鼠标映射软件 安卓otg键盘映射
  16. 海思码率控制器各参数说明
  17. 错误:ctype-stubs_32.a: No such file or directory
  18. 代价敏感学习初探 - 有偏损失函数设计
  19. android 包命名不管你怎么命,千万不要用下面几个
  20. 弘辽科技:淘宝商家群是怎么划分层级的?

热门文章

  1. 【智能手环APP for Android 】01 百度地图展示行动轨迹
  2. 批量剔除consul无效服务
  3. 手机计算机藏应用,把隐私藏进计算器!这款功能强大的隐私保护软件,层层防护,怒赞...
  4. 网易邮箱客户端服务器设置
  5. EMV TLV 总结
  6. sigmastar—ISP图像调试(AWB矫正)
  7. python与大数据分析实验报告_Python与大数据分析.pptx
  8. 昆明oracle考试点,Oracle认证考试知识点:修改sid的步骤
  9. 程序员成长之旅——进程间通信(IPC)
  10. 信息系统安全实验(一):InterNIC、Nslookup、Sam spade、Nmap、Nessus的使用