我的计算机有64GB的内存,在Eclipse中我设置了默认的VM参数,如下所示:
-Xms512m -Xmx9g
我认为9GB是我的Java应用程序可以使用的最大大小。但是,在我启动应用程序一段时间之后,我可以从系统监视器看到我的Java应用程序进程使用了近16GB的内存。它如何大于我设置为9GB的VM参数?
答案 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