电脑桌面
添加蚂蚁七词文库到电脑桌面
安装后可以在桌面快捷访问

Linux 系统上VIRT内存占用过多处理方法

来源:金蝶云社区作者:金蝶2024-09-2213

Linux 系统上VIRT内存占用过多处理方法

一、问题描述

top查看系统进程,java进程VIRT分配过多;

系统内存占用查询


二、问题分析

1.操作系统分析:
查询Red Hat Enterprise Linux 官方有文档说明,VIRT分配过多问题, 是操作系统上 glibc 版本引入的arena 新功能导致(从glibc2.10及之后),此功能对每个线程都分配一个本地arena来加速多线程的执行,即在一个多线程程序中,就会出现相当多的64MB的arena 被分配;且从glibc2.10之后版本都提供了许多功能和增强功能,其中glibc增强的动态内存分配(malloc)行为,可跨多个套接字和内核实现更高的可扩展性。这是通过为线程分配自己的内存池以及在某些情况下避免锁定来实现的。

VIRT高是因为分配了太多虚拟地址空间导致。一般来说不用太在意VIRT太高,因为你有16EB的空间可以使用。如果实在需要控制VIRT的使用,可设置环境变量MALLOC_ARENA_MAX值进行限制。


2.java 程序分析:
Java 程序由于自己维护堆的使用,导致调用 glibc 去管理内存的次数较少。特别是 Java 8 开始使用 metaspace 原空间取代永久代,而元空间是存放在操作系统本地内存中,因此线程一多,每个线程都要使用一点元空间,每个线程都分配一个 arena,每个都64MB,就会导致巨大的虚拟地址被分配。

可以控制台上-->实例页签--->参数设置,可看到具体实例最大堆分析内存值:

此值只是java内存中heap值:

JVM在执行Java程序时,会把它管理的内存划分为若干个的区域,每个区域都有自己的用途和创建销毁时间。如下图 所示,可以分为两大部分,线程私有区和共享区;因此实际java实例内存值为分配值 +1G内存值 。


三、控制方法
1.使用MALLOC_ARENA_MAX 进行控制;
对于MALLOC_ARENA_MAX控制不住的原因,如果 MALLOC_ARENA_MAX 设置为 n,当 n 个 thread arena 的内存空间全被占满的时候,线程新申请内存的时候优先创建新的arena,不受n的限制,

Linux 系统上VIRT内存占用过多处理方法

一、问题描述top查看系统进程,java进程VIRT分配过多;系统内存占用查询二、问题分析1.操作系统分析:查询Red Hat Enterprise Linux 官...
点击下载文档文档为doc格式

声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。

已经是第一篇
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息
QQ群
  • 答案:my7c点击这里加入QQ群
支持邮箱
微信
  • 微信