如何启动没有堆最大内存限制的JVM?这样它可以占用尽可能多的内存吗?
我搜索了是否有这样的选项,但我似乎只找到-Xmx和-Xms选项。
编辑:
假设我有一台4GB内存的服务器,它只运行我的应用程序。而且,假设我有另一台32GB RAM的服务器。我不想以4GB的内存限制启动我的应用程序,因为第二台机器应该能够处理更多的对象
答案 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上,您可以使用free
和awk
命令来计算内联值,如下所示:
JAVA_OPT_MAX_MEM=$(free -m | awk '/Mem:/ {printf "-Xmx%dm", 0.80*$2}')
示例结果(在具有3950m可用内存的计算机上):
JAVA_OPT_MAX_MEM=-Xmx3160m
计算出的选项是报告的总内存的80%。