问题描述
关于堆大小的帖子和站点很多,但是都没有提到如何找出调用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楼
如何在没有反复试验的情况下,预先检查调用jvm可能的堆大小?
没有办法。
当然,没有一种方法可以根据您/我必须提供的信息类型给出可靠的答案。
(如果有办法,那么您可以确定Oracle会知道并且会告诉我们。)
问题在于等式中的“变量”太多,其中许多是“隐藏变量”。