提问者:小点点

在64位Java中估计最大安全JVM堆大小


在分析一个有问题的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,我建议他们将< code>-Xmx设置为16 GB并不是一个好主意。

那么什么是合理的数字?12 GB?8 GB?

我怎么估计呢?


共1个答案

匿名用户

显然,如果客户有16 GB的物理RAM,那么我告诉他们将-Xmx设置为16 GB不是一个好主意。

如果客户在他/她的机器上没有运行其他重要内容,那么将堆大小设置为16G并不一定是个坏主意。这取决于应用程序正在做什么。

那么什么是合理的数字?12 GB?8 GB?

理想的数字应该是“JVM最大堆JVM非堆开销OS其他活动应用程序的工作集缓冲区缓存工作集”加起来等于物理内存量。但问题是,如果不对客户的机器进行详细测量,这些组件(除了最大堆大小)都无法确定...而应用程序是在实际问题上运行的。

我怎么估计呢?

底线是你不能。你最多只能猜测...保守一点。

另一种方法是估计应用程序实际需要多少堆来解决它试图解决的问题。然后额外添加50%或100%,使GC空间高效工作。(然后调整...)