当前位置: 首页 > 知识库问答 >
问题:

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

公孙志
2023-03-14

在分析一个有问题的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个答案

澹台举
2023-03-14

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

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

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

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

我怎么估计呢?

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

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

 类似资料:
  • 问题内容: 问题不在于32位操作系统的最大堆大小,因为32位操作系统的最大可寻址内存大小为4GB,而JVM的最大堆大小取决于可以保留多少连续可用内存。 我对了解在64位OS中运行的32位JVM的最大(理论上和实际可实现的)堆大小更感兴趣。基本上,我正在寻找类似于SO相关问题中的数字的答案。 至于为什么使用32位JVM而不是64位JVM,原因不是技术上的而是管理/官僚的-在生产环境中安装64位JVM

  • 问题内容: 我已经读到 32位Windows上的最大堆大小是〜1.5GB,这是由于JVM需要连续的内存。有人可以解释“连续内存”的概念吗,为什么Windows上最多只有1.5GB? 其次,那么64位Windows上的最大堆大小是什么?为什么与32位Windows上可用的最大堆大小不同? 问题答案: 32位/ 64位部分与Java无关 事实证明,32位系统中的内存位置由32位无符号整数引用。这最多允

  • 问题内容: 当然,在32位系统中可以设置的理论最大堆值是字节,但是通常(请参阅:了解最大JVM堆大小 -32 位vs64位),一个人不能使用全部4GB。 对于在64位计算机上的64位OS中运行的64位JVM,除了理论上的字节数限制或16艾字节之外,是否还有其他限制? 我知道由于种种原因(主要是垃圾回收),过大的堆可能不是 明智的选择 ,但是鉴于阅读了有关具有terrabytes RAM的服务器的信

  • 有很多关于堆大小的帖子和站点,但是没有一个提到在调用JVM时如何找出我可以保留的最大可能堆大小。 任务是用最大可用堆大小xmx=max动态启动我的jvm(这里不需要讨论这个任务的对象!)。 我们可以考虑读取当前可用或空闲的内存,并将该大小用于xms和XMX。但这不起作用。 调用Java程序时: Java-XMS1536M-XMX1536M myApp 导致: 选择您选中的应用程序大约需要的堆。并在

  • 问题内容: 在64位平台上,一个人可以为java分配的最大堆空间是多少?无限吗? 问题答案: 理论上是2 64,但是可能会有限制(显然) 根据此常见问题解答,它仅受本地系统上的内存和交换空间的限制: 在64位VM上,您具有64位可寻址性,因此可产生的最大Java堆大小仅受系统提供的物理内存和交换空间的数量限制。 另请参见为什么使用32位JVM无法获得更大的堆? 另外请记住,您需要通过命令行设置最大

  • 问题内容: 在64位计算机上,Java中的int大小是32位还是64位? 问题答案: 32位。这是Java语言的功能之一,整数的大小不会随基础计算机而变化。请参阅规范的相关部分。