本文主要是介绍java 虚拟内存占用很多,Java 进程占用 VIRT 虚拟内存超高的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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 ]
0000
这篇关于java 虚拟内存占用很多,Java 进程占用 VIRT 虚拟内存超高的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!