繁体   English   中英

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

[英]Estimating maximum safe JVM heap size in 64-bit Java

在分析一个有问题的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并不是一个好主意。

那么合理的数字多少? 12 GB? 8 GB?

我该如何估算呢?

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

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

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

理想的数字是“JVM最大堆+ JVM非堆开销+ OS +其他活动应用程序的工作集+缓冲区缓存工作集”加起来物理内存量。 但问题是,如果没有在客户机器上进行详细测量,那么这些组件(除最大堆大小外)都不会被固定......而应用程序正在运行实际问题。

我该如何估算呢?

最重要的是,你不能。 你能做的最好就是猜测......并保守。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM