为什么JVM的实际内存占用量比我的Xmx大得多?

时间:2017-06-17 18:54:44

标签: java memory-management jvm heap-memory

我的计算机有64GB的内存,在Eclipse中我设置了默认的VM参数,如下所示:

-Xms512m -Xmx9g

我认为9GB是我的Java应用程序可以使用的最大大小。但是,在我启动应用程序一段时间之后,我可以从系统监视器看到我的Java应用程序进程使用了​​近16GB的内存。它如何大于我设置为9GB的VM参数?

1 个答案:

答案 0 :(得分:1)

-Xmx设置用于Java对象的JVM'堆'内存的最大大小(组织成几个'代':Eden,Survivor,Tenured / Old)。 外部堆JVM还分配:

  • 加载的类和JITted代码(根据需要)

  • 线程堆栈

  • NIO'直接'缓冲

  • 本机代码:JVM本身(包括它使用的系统库),以及JNI或JNA加载/访问的代码

  • 由本机代码管理的数据

第一组通过java 8中的java 7和Metaspace进入CodeCache和PermGen;虽然不在堆中,但它们通过MemoryPoolMXBean报告,如堆空间,并且可以通过不同的选项进行调整,例如-XX:MaxPermSize -XX:MaxMetaspaceSize。其余的组不能从Java报告AFAIK。堆栈大小可以使用-Xss设置(但对于所有线程都是全局的)。

另请参阅What is the difference between Java Non Heap Memory and Stack Memory? Are they Same if not what is the difference between them?Java: non-heap-memory analyzes