我有16G RAM的机器。我运行带有参数-Xms9G -Xmx9G
的Java应用程序。
当我运行top
命令时,我看到我的Java进程正在使用 13.8g VIRT ,但是仅使用 4.6g RES 。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5019 root 20 0 13.8g 4.7g 18m S 0.7 30.7 3:28.39 java
在运行pmap
命令时,我看到只有〜3.9g 堆作为 RES 存在,其余 5.7g位于虚拟< / strong>。
Address Kbytes RSS Dirty Mode Mapping
0000000580000000 9452384 4074228 4074228 rw--- [ anon ]
使用jvmtop
监视 HPCUR 时,我观察到 HPCUR达到约3g 时会触发GC。
PID MAIN-CLASS HPCUR HPMAX NHCUR NHMAX CPU GC VM USERNAME #T DL
5019 .1-SNAPSHOT.jar 408m 9216m 192m n/a 0.25% 0.00% O8U20 webapp 823
我观察到该进程的 RES逐渐增加,RES中的堆内存(通过pmap)也逐渐增加。结果,GC阈值增加。
我对此行为有几个疑问。
-Xms
),那么最初为什么只分配3.9g RES。这与保持-Xms低不一样吗?那么,保持-Xms = -Xmx的意义是什么?答案 0 :(得分:2)
VIRT
表示虚拟内存-这是进程的整个保留地址空间。 RSS
是驻留集大小-物理RAM中分配的虚拟地址空间的一部分。对于任何地址范围(不仅是堆),RSS
是VIRT
的子集,可能是完整的也可能是空的。似乎您已经探索过pmap
-对于每个虚拟地址范围,它都显示了物理分配的内存(RSS)的确切数量。-XX:+AlwaysPreTouch
可以强制接触堆的每个页面,从而使其成为RSS的一部分。尝试java -Xms9G -Xmx9G -XX:+AlwaysPreTouch
。答案 1 :(得分:-1)
dd.mm.yyyy hh24:mi:ss
是GC的提示,在什么时候需要进行完整的垃圾回收。使用本地JVM进行测试,我可以确认它不会立即保留内存。您得到的是,您的JVM不会阻塞大量未使用的内存,但是随着GC的运行减少,JVM将更快地达到下界。-Xms
,如果您需要更多优化,则取决于gargbage collector used的选项。您是否打印了GC日志并验证是否有问题?如果您看到在达到9G之前在应用程序启动时运行了很多GC,那么我会进一步检查。如果在达到9G之前几乎没有运行任何GC,我会说一切都很好。