我正尝试在 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
最佳答案
USED
是 RES
+ SWAP
的总和。
您的实际内存中只有 +500Mb,交换内存中只有 +400Mb,所以这是正常行为。
Here是top
和more explanations的手册关于交换。
关于java - 带有-Xmx500m 的JVM 实际上消耗了1GB 内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57110797/