如何启动无限内存的JVM?

如何启动没有堆最大内存限制的JVM? 这样它可以占用尽可能多的内存吗?

我搜索了是否有这样的选项,但我似乎只找到-Xmx和-Xms选项。

编辑:

假设我有一台4GB内存的服务器,它只运行我的应用程序。 而且,假设我有另一台32GB RAM的服务器。 我不想以4GB的内存限制启动我的应用程序,因为第二台机器应该能够处理更多的对象

你不能(或者至少,我不知道支持它的JVM实现)。 JVM需要在启动时知道它可以分配多少内存,以确保它可以在虚拟内存中保留连续范围。 这允许 – 以及其他 – 用于在存储器管理中更简单的推理。

如果虚拟内存将在运行时扩展,则可能导致虚拟内存碎片碎片化,从而使跟踪和引用内存更加困难。

-XX:MaxRAMFraction=1将自动配置最大堆大小为物理RAM的100%或cgroups施加的限制。

OpenJDK 10还将支持基于百分比的选项MaxRAMPercentage允许更细粒度的选择JDK-8186248 。 为非堆数据结构留出一些备用容量以避免交换非常重要。

JVM在内存有限的物理计算机上运行。 因此,只要内存受到定义的限制,JVM就不能拥有无限的内存。 但是,您可以在-Xmx选项中提供非常大的限制。

问题是,为什么你需要无限的记忆,更正确的问题是你真正需要多少记忆?

在Linux上,您可以使用freeawk命令来计算内联值,如下所示:

 JAVA_OPT_MAX_MEM=$(free -m | awk '/Mem:/ {printf "-Xmx%dm", 0.80*$2}') 

示例结果(在具有3950m可用内存的计算机上):

 JAVA_OPT_MAX_MEM=-Xmx3160m 

计算出的选项是报告总内存的80%。