在JVM中,以下计算正在使用的堆空间量。
usedMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
实际上,此值对Xmx
值很敏感。在“较小”的机器上,我认为倾向于使用较低的Xmx
值。然后似乎usedMemory
的高水位标记较少。在“较大”的机器上,我认为趋势是使用更高的Xmx
值。然后似乎推迟了垃圾收集,因此usedMemory
的高水位标记更大,即使具有相同的输入或数据或方案。然后,似乎使用的堆空间量实际上并没有告诉您有关所需的最小物理内存量的任何信息,因此它不会告诉您需要添加物理内存。
我假设,在使用中测量堆空间没有实际用途。我正在考虑从我的申请的某些部分删除该值的报告。这项措施是否有实际用途?
除此之外:暂时,我确定何时添加物理内存的方法如下:
我的Java应用程序有专用硬件,这意味着那里 将是一个(主要)应用程序。对于专用硬件,我倾向于 将
Xmx
设置为略小于物理内存。例如, 在一台64GB的机器上,我把它设置为63500M,剩下500M用于堆栈和 杂物。我确定机器需要更多内存的方法是 发出vmstat -Sm 8 2
,它会显示以兆字节为单位的统计信息 在8秒的采样期内。如果有使用交换空间, 由swpd
表中的vmstat
列表示,我接受了 意味着我需要更多的记忆。如果应用程序可以成功完成 在不使用交换空间的情况下,我推断使用swap运行是安全的 关闭,由sudo swapoff -a
配置。我怀疑离开交换 邀请更慢的垃圾收集因为垃圾收集会 涉及较慢设备上的交换空间。权衡更为频繁 垃圾收集(坏)的优点是它将完全 在记忆中(好)。