在分析存在一些问题的 64 位 Java 应用程序的过程中,我注意到分析器本身 (YourKit) 正在使用真正巨大的内存量。我在 YourKit 启动脚本中得到的是:
JAVA_HEAP_LIMIT="-Xmx3072m -XX:PermSize=256m -XX:MaxPermSize=768m"
天真地,假设有一些开销,这会让我猜测 YourKit 将使用最大可能超过 4 GB 的东西。但是,我在 PS 中实际看到的是:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
dmoles 31379 4.4 68.2 14440032 8321396 ? Sl 11:47 10:42 java -Xmx3072m -XX:PermSize=256m -XX:MaxPermSize=768m -XX:+HeapDumpOnOutOfMemoryError -Dyjp.probe.table.length.limit=20000 -Xbootclasspath/a:/home/dmoles/Applications/yjp-9.5.6/bin/../lib/tools.jar -jar /home/dmoles/Applications/yjp-9.5.6/bin/../lib/yjp.jar
这是近 14 GB 的虚拟大小和近 8 GB 的常驻大小——几乎是 Java 堆的 3 倍。
现在,我的开发盒上有足够的内存来运行它,但是回到我试图诊断的原始内存问题:我怎么知道我必须使用多少 Java 堆?
显然,如果客户拥有 16 GB 的物理 RAM,我告诉他们设置-Xmx
为 16 GB 并不是一个好主意。
那么什么是合理的数字呢?12GB?8GB?
我如何估计它?