2015-07-28 121 views
5

有大量关于堆大小的Posts和网站,但没有一个提到如何找出调用jvm时可以保留的最大可能堆大小。预留Java JVM最大堆大小

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

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

例如在64位计算机和Windows操作系统,具有24GB RAM上,约1.8 GB上可用的虚拟存储器:

在JVM(那些已经通过其在进程中执行的Java命令C#确定)用32位启动!根据其他网站和帖子,如:Maximum Java heap size of a 32-bit JVM on a 64-bit OS它应该在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

导致:

Could not reserve enough space for 1572864KB object heap

同样下降到1136米一路,这是尽可能最大!

因此我的问题: 如何检查堆栈大小可能调用jvm,没有试验的错误吗?

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

  1. 选择你检查了应用程序的堆需要约。并让用户死于一个错误,如果堆不可能
  2. 试验一个错误:降低堆并重新运行你的应用程序,直到发现有效的最大堆
  3. 使用这种秘密的方式来确定保证的最大堆大小和运行它顺利(如果是这样,请放在你的信任圈:))

我对你的答案绝对好奇!

+0

'只有1136米是可能的!'你使用的是32位JRE吗? –

+0

@FranMontero对不起,我忘记了这一点,看到更新回答 – gantners

+0

其实我在几周前发布了一个类似的问题XD http:// stackoverflow。com/questions/31533378 /无法运行-java-with-xmx-966m/31534282#comment51067983_31534282 –

回答

1

How to check upfront the heap size possible for calling the jvm, without trial and error?

有没有办法。

当然,没有一种方法可以根据您需要处理的信息的种类给出可靠答案。

(如果有一种方法,那么你可以肯定的是甲骨文会知道,并会告诉我们。)

的问题是,有太多的“变数”的公式中,许多其中的“隐藏变量”。

+0

好的,但最大可以改变一次到另一个?或者对于相同的JRE;,OS,RAM始终是相同的最大值? –

+0

是的,最大可能会有所不同。它也可能取决于应用程序,JVM设置,OS调整参数等。 –

+0

最大值可能因您要使用的堆内存量有多少而异,例如,线程堆栈,GUI组件,共享库,直接缓冲区。你甚至不知道什么是因为你的JVM启动了,以后你不会用完虚拟内存。 +1 –