有大量关于堆大小的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应用程序?
- 选择你检查了应用程序的堆需要约。并让用户死于一个错误,如果堆不可能
- 试验一个错误:降低堆并重新运行你的应用程序,直到发现有效的最大堆
- 使用这种秘密的方式来确定保证的最大堆大小和运行它顺利(如果是这样,请放在你的信任圈:))
我对你的答案绝对好奇!
'只有1136米是可能的!'你使用的是32位JRE吗? –
@FranMontero对不起,我忘记了这一点,看到更新回答 – gantners
其实我在几周前发布了一个类似的问题XD http:// stackoverflow。com/questions/31533378 /无法运行-java-with-xmx-966m/31534282#comment51067983_31534282 –