2 回答
TA贡献1807条经验 获得超9个赞
VIRT
表示虚拟内存 - 这是进程的整个保留地址空间。RSS
是常驻集大小——在物理 RAM 中分配的虚拟地址空间部分。对于任何地址范围(不仅是堆)RSS
是 的子集VIRT
,可能是完整的或空的。似乎您已经探索过pmap
- 对于每个虚拟地址范围,它显示了物理分配内存 (RSS) 的确切数量。操作系统在第一次访问时延迟分配物理页面。这就是为什么在相应的页面被读取或写入之前,即使已提交的内存也不是 RSS 的一部分。堆的大部分不在 RSS 中这一事实意味着堆的这一部分从未被触及过。另请参阅此问题。
有一个 JVM 选项
-XX:+AlwaysPreTouch
可以强制接触堆的每一页,从而使其成为 RSS 的一部分。尝试java -Xms9G -Xmx9G -XX:+AlwaysPreTouch
。
TA贡献1860条经验 获得超8个赞
是的 HEAP 是 RES(只要它适合主内存)
This answer表明这
-Xms
是对GC的提示,在什么时候需要进行完整的垃圾收集。使用我的本地 JVM 进行测试,我可以确认它不会立即保留内存。您获得的是您的 JVM 不会阻塞大量未使用的内存,但会更快地达到您的下限,因为 GC 运行较少。1 的回答:RES 总是包含所有的 HEAP
我的理解是您的选择将实现您的意图。您的应用程序将占用 9GB 内存,然后更频繁地启动垃圾收集。如果您需要更多优化,还有其他选项,例如
MinHeapFreeRatio
和 取决于所使用的垃圾收集器的选项。
您是否打印了 GC 日志并验证是否有问题?如果您看到在达到 9G 之前应用程序启动时运行了很多 GC,我会进一步查看。如果在达到 9G 之前几乎没有运行任何 GC,我会说一切都很好。
添加回答
举报