Java中内存主机和内存参数xms和xmx之间的关系

10

我有以下主机的内存细节:

$free -m
             total       used       free     shared    buffers     cached
Mem:          7872       7579        292         17        483       3983
-/+ buffers/cache:       3112       4759 
Swap:         2047         14       2033

我有一个使用参数-Xms200m -Xmx200m运行的Java应用程序,请问为什么VCZ是3800076而RSS是241304(这比Java参数更多)。

来自ps -aux命令:

66345     6773  0.2  2.9 3800076 241304 ?      Sl   Apr1  12:06 /apps/myapps/myapp1/java/bin/java -Xms200m -Xmx200m

那是哪个版本的Java? - RealSkeptic
在主机中使用Java 8 - Weslor
1个回答

18

Java进程使用的内存(从操作系统的角度看)不仅限于Java堆。还有许多应该被计算在内的内存区域:

  • Metaspace(类元数据所在的位置);
  • Code Cache(JIT编译方法和所有生成代码的存储);
  • 直接字节缓冲区;
  • 内存映射文件,包括JVM映射的文件,例如classpath上的所有JAR文件;
  • 线程堆栈;
  • JVM代码本身以及Java运行时加载的所有动态库;
  • 其他内部JVM结构。

使用NativeMemoryTracking JDK功能获取JVM使用的内存区域的详细分解:

java -XX:NativeMemoryTracking=detail -XX:+UnlockDiagnosticVMOptions -XX:+PrintNMTStatistics

2
请您添加对 https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html 的引用。然后我会点赞 :-P - Petro Semeniuk
这使得规划虚拟机以部署JVM应用程序变得困难。过去设置mx、mss、permgen值为低于物理内存大小的特定值即可确保安全。现在,我有几个JVM的mx为12g,然而它们的VSS是两倍于该大小并且超过了盒子上可用的总内存 - 这是一场等待发生的灾难,我想。 - Vladimir Dyuzhev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接