当前位置: 代码迷 >> java >> Java JVM最大堆大小可预先预留
  详细解决方案

Java JVM最大堆大小可预先预留

热度:81   发布时间:2023-08-04 09:31:36.0

关于堆大小的帖子和站点很多,但是都没有提到如何找出调用jvm时可以保留的最大堆大小。

任务是使用最大可用堆大小xmx = max动态启动我的jvm(无需在此处讨论此任务的对象!)。

有人会想到读取当前可用或空闲的内存,并将该大小用于xms和xmx。 但这不起作用。

例如,在64位计算机和Windows操作系统上,内存为24GB,可用虚拟内存为约1.8GB :(这些由c#确定,该c#在进程中执行Java命令)

jvm以32位启动! 根据其他网站和帖子,例如: 应在1.4GB以上。

[09.07.2015 08:39:39] Total physical memory MB:        24002
[09.07.2015 08:39:39] Available physical memory MB:    16115
[09.07.2015 08:39:39] Total virtual memory MB:         2047
[09.07.2015 08:39:39] Available virtual memory MB:     1810

通过以下方式调用Java程序:

java -Xms1536m -Xmx1536m myApp

导致:

无法为1572864KB对象堆保留足够的空间

一路下降到1136m,这是最大可能!

因此,我的问题是:如何在没有尝试错误的情况下预先检查调用jvm的可能的堆大小?

UDPATE:基于这些评论,我对所有Pro提出了另一个问题:你们如何运行Java应用程序?

  1. 选择您检查应用程序所需的堆。 如果无法进行堆操作,则让用户死于错误
  2. 尝试错误:降低堆大小并重新运行您的应用程序,直到找到有效的最大堆
  3. 使用这种秘密方法来确定保证的最大堆大小并平稳运行(如果这样,请放入您的信任圈:))

我绝对对您的回答感到好奇!

如何在没有反复试验的情况下,预先检查调用jvm可能的堆大小?

没有办法。

当然,没有一种方法可以根据您/我必须提供的信息类型给出可靠的答案。

(如果有办法,那么您可以确定Oracle会知道并且会告诉我们。)

问题在于等式中的“变量”太多,其中许多是“隐藏变量”。

  相关解决方案