如何启动无限内存的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上,您可以使用free
和awk
命令来计算内联值,如下所示:
JAVA_OPT_MAX_MEM=$(free -m | awk '/Mem:/ {printf "-Xmx%dm", 0.80*$2}')
示例结果(在具有3950m可用内存的计算机上):
JAVA_OPT_MAX_MEM=-Xmx3160m
计算出的选项是报告总内存的80%。