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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...