JVM无法识别我的可用内存

问题描述

我有一个具有4GB RAM的ubuntu服务器(20.04)。启动某些应用程序后,它具有2.5GB的可用RAM。当我尝试使用堆大小为1GB(-xms1g -Xmx1g)启动Java应用程序时,它不会启动并记录以下错误

没有足够的内存供Java运行时环境使用 继续。本机内存分配(mmap)无法映射1073741824 提交保留内存的字节。

如果我尝试将堆大小减小到512m或更小,它将启动,但是几分钟后,即使我有一半的可用内存,服务也会因类似的错误而停止。 看来JVM并未使用/识别所有可用内存。

感谢您的帮助。

解决方法

您可能会受到this issue的影响; (每张票证)有2种可能的解决方法:

  1. 禁用压缩的Oop(-XX:-UseCompressedOops),但性能会有所下降。这将指示JVM在没有Compressed Oops功能的情况下运行,并且不会尝试将Java Heap装入前4GB的堆中。
  2. 保留CompressedOops并使用JVM选项-XX:HeapBaseMinAddress = n设置Java Heap的基础,以指定Java Heap从其开始的地址,将其设置为更高的地址,以便有足够的空间用于原生mallocs