首页 > 解决方案 > 带有-Xmx500m的JVM实际消耗1GB内存

问题描述

我试图在 VPS 上以“永远在线”模式长时间托管 Swing Java 应用程序,并愿意将其调整为 1GB 的形状(Ubuntu 作为主机操作系统)。

应用程序以“-Xmx500m -XX:+UseConcMarkSweepGC”开始,它应该适合(与所有其他补充人员一起)进入 1GB 的总 RAM 似乎是合理的,但是......在运行应用程序 2-3 天后top说 java 应用程序单独吃差不多 1GB(见 USED 列) - 它是指定的“-Xmx500m”的两倍:

KiB Mem :  1009136 total,    66084 free,   867128 used,    75924 buff/cache
KiB Swap:   716796 total,     9388 free,   707408 used.    28472 avail Mem

  PID    VIRT    RES   SWAP   USED    SHR S %CPU %MEM     TIME+ COMMAND
 2401 3076084 529648 467832 997480   1900 S 31.0 52.5 916:05.68 java
 2218  285544  37548  74720 112268   8800 S  6.9  3.7 269:12.60 Xvnc4
 2388  709104  11448   9744  21192   7760 S  6.9  1.1  24:45.88 mate-terminal
  883  643820  10932   2540  13472   5624 S  0.0  1.1   1:48.43 do-agent
 2327  544648   4092   5992  10084   2436 S  3.4  0.4   6:38.31 clock-applet

应用程序中的实际“堆使用量”约为 350MB(由应用程序本身显示)。

jstat -gc 2401据我所知,使用量仅为 630MB 左右。其他〜360MB在哪里?我错过了什么?是否可以通过一些 JVM 选项来减少内存使用?

S0C    S1C     S0U   S1U    EC       EU        OC         OU     
8512.0 8512.0  0.0   2161.2 68160.0  67668.5   426816.0   249483.9  

MC       MU       CCSC    CCSU     YGC   YGCT      FGC   FGCT    GCT
112464.0 108027.1 14160.0 13222.6  48701 1484.856  124   590.113 2074.968

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html

S0C - Current survivor space 0 - 8MB
S1C - Current survivor space 1 - 8MB
EU - Current eden space capacity - 68 MB
OC - Current old space capacity - 426 MB
MC - Metaspace capacity - 112 MB
CCSC - Compressed class space capacity - 14 MB
--> 636 MB

标签: java

解决方案


USEDRES+的总和SWAP
您的真实内存中只有 +500Mb,而交换中只有 +400Mb,所以这是正常行为。

是有关交换的手册top更多说明。


推荐阅读