为什么JVM当前的旧容量+新一代容量+元空间容量不等于物理内存

时间:2019-05-02 13:57:19

标签: java linux jvm

我已经运行了springboot示例项目来观察jvm内存,但是让我感到困惑的是jstat的结果:

OGC(当前的旧发电容量。kB)19848
NGC(当前新一代容量kB)9984
MC(元数据容量kB)35456

,但是RES(任务的当前使用的可用物理内存份额)最高的结果是127M 所以这是我的问题:

为什么OGC + MNC + MC =63.7578125‬M!= RES 127M

NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC 
5440.0  83968.0   9984.0  960.0  960.0   8064.0    10944.0   167936.0    19848.0    19848.0      0.0 1081344.0  35456.0      0.0 1048576.0   4480.0     80     2

top:
PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                              
18267 wks       20   0 2242.5m 127.8m  13.0m S  0.0 13.1   0:54.99 java    

1 个答案:

答案 0 :(得分:0)

该进程使用的内存包括;

  • JVM的代码。例如.so
  • JVM的工作区。
  • 您用于IO的任何本地内存。
  • 任何图形组件。
  • 线程堆栈空间。
  • 内存映射文件。

通过检查/proc/{pid}/smap可以看到更详细的细分,其中显示了所有内存区域以及驻留的内存量。不幸的是,它不了解Java内存布局,但是可以让您了解使用内存的位置。