问题描述
我有一个具有4GB RAM的Ubuntu服务器(20.04)。启动某些应用程序后,它具有2.5GB的可用RAM。当我尝试使用堆大小为1GB(-Xms1g -Xmx1g)启动Java应用程序时,它不会启动并记录以下错误
没有足够的内存供Java运行时环境使用 继续。本机内存分配(mmap)无法映射1073741824 提交保留内存的字节。
如果我尝试将堆大小减小到512m或更小,它将启动,但是几分钟后,即使我有一半的可用内存,服务也会因类似的错误而停止。 看来JVM并未使用/识别所有可用内存。
感谢您的帮助。
解决方法
您可能会受到this issue的影响; (每张票证)有2种可能的解决方法:
- 禁用压缩的Oop(-XX:-UseCompressedOops),但性能会有所下降。这将指示JVM在没有Compressed Oops功能的情况下运行,并且不会尝试将Java Heap装入前4GB的堆中。
- 保留CompressedOops并使用JVM选项-XX:HeapBaseMinAddress = n设置Java Heap的基础,以指定Java Heap从其开始的地址,将其设置为更高的地址,以便有足够的空间用于原生mallocs