前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【错误记录】启动 Java 程序报错 ( Could not reserve enough space for 2097152KB object heap )

【错误记录】启动 Java 程序报错 ( Could not reserve enough space for 2097152KB object heap )

作者头像
韩曙亮
发布2024-04-20 08:41:34
1940
发布2024-04-20 08:41:34
举报

总结 :

电脑上安装的 32 位的虚拟机 , 只能设置 1024MB 最大堆内存 , 建议安装 64 位的 JDK ;

查看电脑上虚拟机位数的方法 , 执行下面的命令 , 查看电脑的虚拟机位数 ;

代码语言:javascript
复制
java -d64 -version
java -d32 -version

执行 哪个 命令 , 成功打印出 Java 版本号 , 那么就是对应的位数 ;

下面就是执行失败的结果 :

代码语言:javascript
复制
Error: This Java instance does not support a 64-bit JVM.
Please install the desired version.

下面是执行成功的结果 :

代码语言:javascript
复制
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) Client VM (build 25.144-b01, mixed mode)

一、报错信息

执行

代码语言:javascript
复制
java -Xms512m -Xmx2048m -Dfile.encoding=UTF-8 -jar map.jar

命令后 , 报如下错误 :

代码语言:javascript
复制
D:\demo>java -Xms512m -Xmx2048m -Dfile.encoding=UTF-8 -jar map.jar
Error occurred during initialization of VM
Could not reserve enough space for 2097152KB object heap

报错截图如下 :

二、报错分析

1、参数分析

执行

代码语言:javascript
复制
java -Xms512m -Xmx2048m -Dfile.encoding=UTF-8 -jar map.jar

命令 , 设置的参数分析 :

  • " -Xms512m " 参数 是 设置 Java 虚拟机 的 初始堆内存 大小为 512M ;
  • " -Xmx2048m " 参数 是 设置 Java 虚拟机 的 最大堆内存 大小为 2048M , 该参数意味着 Java 虚拟机 会根据 应用程序 的需要 动态扩展 堆的大小 , 但不会超过 2048 MB ;

2、报错信息分析

执行后 , 报错

Error occurred during initialization of VM Could not reserve enough space for 2097152KB object heap

翻译 :

虚拟机初始化错误 无法为 2097152KB 的 对象堆 保留足够的空间

Java 虚拟机 在尝试为对象堆分配 2048M 的 内存空间时 出现错误 , 无法提供 2045M 的堆内存空间 ;

将 " -Xmx2048m " 参数 设置为 " -Xmx1024m " 参数 是可以成功运行的 , 设置最大堆内存为 2048m 就会报错 ;

3、最大堆内存的影响因素

java 命令的 -Xmx 参数 的设置范围 不是固定的 , 它取决于

  • 电脑配置 , 如 : 物理内存大小 ;
  • 操作系统限制 , 32 位 的操作系统 和 64 位 的操作系统 ;
  • Java 虚拟机位数 ;

4、电脑配置分析

当前 16G 内存 , 已使用 60% , 内存占用很多 , 还剩下 6.4G 内存 , 看起来应该够用 , 并不是电脑配置问题 ;

5、操作系统限制 - 32 / 64 位操作系统单个程序可用内存

在 32 位操作系统中 , 内存地址是由 32 位二进制数表示的 , 理论上可以表示2^32 个不同的内存地址 , 可以支持的最大内存是4GB ;

实际上 , 操作系统 和 其他系统级程序需要使用一部分内存 , 单个程序 可使用的内存 通常会低于 4GB ;

在 64 位操作系统中 , 内存地址是由 64 位二进制数表示的 , 理论上支持 2^64 个字节的内存地址 , 大约 1600 万 TB ;

64 位操作系统 中 单个应用的内存基本不受限制 ;

6、Java 虚拟机限制

在 32 位 的 Java 虚拟机 上 , 由于内存寻址的限制 , 理论上最大约 1.5GB 至2GB , 实际可用的内存可能更少 ;

在 64 位 的 Java 虚拟机 上 , 基本不受虚拟机的制约 ;

执行如下代码 , 打印出来的就是当前 JVM 的位数 ;

代码语言:javascript
复制
public class Test {
    public static void main(String[] args) {
        String model = System.getProperty("sun.arch.data.model");
        System.out.println(model);
    }
}

也可以在命令行中分别执行 :

代码语言:javascript
复制
java -d64 -version
java -d32 -version

查看 执行结果 :

  • 执行 java -d64 -version 命令 , 得到的结果如下 :
代码语言:javascript
复制
C:\Users\octop>java -d64 -version
Error: This Java instance does not support a 64-bit JVM.
Please install the desired version.
  • 执行 java -d32 -version 命令 , 得到的结果如下 :
代码语言:javascript
复制
C:\Users\octop>java -d32 -version
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) Client VM (build 25.144-b01, mixed mode)

结论就是 , 我的电脑上装的是 32 位的 Java 虚拟机 , 最大支持 1400M 的最大内存 , 设置 1410M 就会报错 ;

三、解决方案

解决方案就是下载 64 位的 JDK 安装替换即可 ;

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-04-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、报错信息
  • 二、报错分析
    • 1、参数分析
      • 2、报错信息分析
        • 3、最大堆内存的影响因素
          • 4、电脑配置分析
            • 5、操作系统限制 - 32 / 64 位操作系统单个程序可用内存
              • 6、Java 虚拟机限制
              • 三、解决方案
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档