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

标签 java memory-management 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,我告诉他们将 -Xmx 设置为 16 GB 并不是一个好主意。

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

我该如何估算?

最佳答案

Clearly, if the customer has, say, 16 GB physical RAM, it's not a great idea for me to tell them to set -Xmx to 16 GB.

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

So what is a reasonable number? 12 GB? 8 GB?

理想的数字是“JVM 最大堆 + JVM 非堆开销 + 操作系统 + 其他 Activity 应用程序的工作集 + 缓冲区缓存工作集”加起来就是物理内存量。但问题是,如果不在客户的机器上进行详细测量,就无法确定这些组件中的任何一个(最大堆大小除外)......当应用程序运行在实际问题上时。

And how do I estimate it?

底线是你不能。您能做的最好的事情就是猜测……并保持保守。

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

关于java - 估计 64 位 Java 中的最大安全 JVM 堆大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10219301/

相关文章:

java - 找出由两个 3 位数字的乘积组成的最大回文

mysql - 为什么即使有足够的 RAM 来映射页面,MySQL 服务器仍使用交换空间?

c - 在 C 中为 ffmpeg 动态生成参数列表

java - 查找 JVM 中上下文切换或唤醒线程所花费的 CPU 时间

linux - 主机内存不足,使用稳定的JVM

scala - 从专业类中获取 ClassTag

java - 如何比较两个 list<t> 对象?

java - Java 中的线程

java - Java 中的接口(interface)派生

c++ - 将一个 vector 复制到其他 C++ 时出错