在分析一款存在问题的64位Java应用程序时,我注意到分析器本身(YourKit)使用了非常大量的内存。在YourKit启动脚本中,我有以下内容:
JAVA_HEAP_LIMIT="-Xmx3072m -XX:PermSize=256m -XX:MaxPermSize=768m"
粗略地估计,考虑到一些开销,我的猜测是YourKit将使用最多略高于4GB的内存。然而,实际在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并不是一个好主意。
那么什么是合理的数字?12 GB?8 GB?
我如何估算它?