我在大约8GB的虚拟机上给了tomcat大约3Gb的内存, -Xms3072M -Xmx3072M -Xmn1024M。
启动tomcat并在终端中键入
“ ps -eo pmem,vsize,pid,cmd |排序-k 1 -nr |头-10”
对于第一个也是唯一的Java进程,我得到的答案是19.4% (19.4 7052620 12748 / usr / bin / java ...) 我的问题是这19.4%是没有堆的tomcat的ram内存吗? 这是我在网上找到的等式:
最大内存= [-Xmx] + [-XX:MaxPermSize] +线程数* [-Xss](https://plumbr.io/blog/memory-leaks/why-does-my-java-process-consume-more-memory-than-xmx)
因为8GB的19.4%是2 GB,而我的堆是3 GB。这是没有堆的ram内存吗?
答案 0 :(得分:0)
您没有命名操作系统,尽管很明显它是* NIX类型的操作系统。
ps
显示的内存是真实的已分配内存。它将包括已分配给您的进程的所有“本机”,堆和mmap
ed内存。如果您的进程还很年轻(即运行了很长时间),那么它还不会使用太多的堆。
即使没有实际分配物理内存,许多操作系统(最著名的是Linux)也将允许malloc to return success。由于JVM在启动时立即分配了-Xms
设置,因此您可能希望进程的内存大小至少为 3072MiB,但是如果实际上并未使用该内存,则ps
的尺寸可能会比您预期的小。
如果您确实在使用Linux,请查看https://serverfault.com/questions/48582并进行一些Web搜索,以确切了解Linux内核如何分配内存。另外,如果您正在使用Linux,请考虑在问题中添加linux
标签。
如果您不是使用Linux,则可能需要阅读有关OS如何分配内存的信息。如果您的操作系统使用“过量使用”策略,则其行为将如上所述。