如何启动无限内存的JVM?

时间:2016-09-27 06:02:49

标签: java memory jvm

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

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

编辑:

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

4 个答案:

答案 0 :(得分:20)

如果设置了-XX:MaxRAMFraction=1

UseCGroupMemoryLimitForHeap会自动将最大堆大小配置为物理ram的100%或cgroups施加的限制。

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

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

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

JAVA_OPT_MAX_MEM=-Xmx3160m

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