我有 16G RAM 的机器。我运行带有参数的 java 应用程序-Xms9G -Xmx9G。当我运行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 在 virtual 中。
Address Kbytes RSS Dirty Mode Mapping
0000000580000000 9452384 4074228 4074228 rw--- [ anon ]
在使用 监视HPCUR时,我观察到当HPCUR 达到约 3gjvmtop时触发了 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 阈值增加。
我对这种行为有几个问题。
是否只使用了 RES 中存在的堆,而不使用 VIRT?
如果我分配了 9G min heap ( -Xms),那么最初为什么只分配了 3.9g RES。这与保持低 -Xms 不一样吗?那么保留 -Xms=-Xmx 有什么意义呢?
在什么基础上决定RES中应该有多少堆?在某处读到它由操作系统管理,但有任何粗略的逻辑吗?
有什么方法可以确保实际使用分配的堆?
函数式编程
桃花长相依
相关分类