珠海市网站建设制作设计平台,运城seo,百度怎么发布广告,手机建网站公司一、现象说明 最近发现线上机器java 7(openjdk)进程的 VIRT 虚拟内存使用达到了 50G#xff0c;如下所示#xff1a; PID USER PR NI VIRT RES SHR S %CPU %MEM TIME COMMAND
3130 tomcat 20 0 9128m 1.4g 6544 S…一、现象说明 最近发现线上机器java 7(openjdk)进程的 VIRT 虚拟内存使用达到了 50G如下所示 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME COMMAND
3130 tomcat 20 0 9128m 1.4g 6544 S 1.3 9.0 84:14.67 java
31480 tomcat 20 0 7244m 983m 5528 S 0.3 6.2 34:36.95 java
22142 tomcat 20 0 6787m 537m 13m S 0.7 3.4 6:26.70 java
22097 tomcat 20 0 7049m 515m 11m S 0.3 3.2 4:52.39 java
1975 root 20 0 600m 10m 1560 S 0.0 0.1 2:50.42 salt-minion根据现象猜测: 1. 可能出现内存不足使用了较多的swap内存 2. java jdk的版本导致 3. 由于是虚拟机可能出现物理主机内存不足导致虚拟机伪内存资源 二、问题排查 2.1 不管用 xms 首先第一想到的当然使用 java 的-Xmx去限制堆的使用。然而通过top查看,其实并没有使用多少物理内存。 2.2 通过vmstate查看分析 [rootbusys-12173 ~]# vmstat -a -S M
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free inact active si so bi bo in cs us sy id wa st
0 0 81 1604 340 3381 0 0 1 1 6 15 0 0 100 0 0从上面的信息可以看出来其实资源使用实际很少 2.3 排查虚拟机资源是否消耗 经过查看vmware发现上面的虚拟机资源使用并无异常。 三、确定问题原因 经过查阅资料偶然间发现这属于一个正常的现象为什么正常呢请看下面分析。 glibc 在版本 2.10 引入的 arena 新功能导致。CentOS 6/7 的 glibc 大都是 2.12/ 2.17 了所以都会有这个问题。这个功能对每个线程都分配一个分配一个本地arena来加速多线程的执行。Java 程序由于自己维护堆的使用导致调用 glibc 去管理内存的次数较少。更糟的是 Java 8 开始使用 metaspace 原空间取代永久代而元空间是存放在操作系统本地内存中那线程一多每个线程都要使用一点元空间每个线程都分配一个 arena每个都64MB就会导致巨大的虚拟地址被分配。 总结如下 VIRT高是因为分配了太多地址空间导致。一般来说不用太在意VIRT太高因为你有更多的空间可以使用。如果你实在需要控制VIRT的使用设置环境变量MALLOC_ARENA_MAX例如hadoop推荐值为4因为YARN使用VIRT值监控资源使用。参考链接https://www.ibm.com/developerworks/community/blogs/kevgrig/entry/linux_glibc_2_10_rhel_6_malloc_may_show_excessive_virtual_memory_usage?langen 转载于:https://www.cnblogs.com/yangxiaoyi/p/7350970.html