初始堆大小无效。无法创建Java虚拟机

Posted

技术标签:

【中文标题】初始堆大小无效。无法创建Java虚拟机【英文标题】:Invalid initial heap size. Could not create the Java virtual machine 【发布时间】:2013-05-01 06:37:31 【问题描述】:

我遇到了下一个问题: 我正在尝试通过startup.bat手动启动Tomcat,但似乎没有显示任何结果,然后我尝试运行shutdown.bat,控制台显示下一个:

 D:\apache-tomcat-7.0.35\bin>startup.bat
Using CATALINA_BASE:   "D:\apache-tomcat-7.0.35"
Using CATALINA_HOME:   "D:\apache-tomcat-7.0.35"
Using CATALINA_TMPDIR: "D:\apache-tomcat-7.0.35\temp"
Using JRE_HOME:        "C:\Program Files\Java\jdk1.6.0_31"
Using CLASSPATH:       "D:\apache-tomcat-7.0.35\bin\bootstrap.jar;D:\apache-tomcat-7.0.35\bin\tomcat-juli.jar"
D:\apache-tomcat-7.0.35\bin>shutdown.bat
Using CATALINA_BASE:   "D:\apache-tomcat-7.0.35"
Using CATALINA_HOME:   "D:\apache-tomcat-7.0.35"
Using CATALINA_TMPDIR: "D:\apache-tomcat-7.0.35\temp"
Using JRE_HOME:        "C:\Program Files\Java\jdk1.6.0_31"
Using CLASSPATH:       "D:\apache-tomcat-7.0.35\bin\bootstrap.jar;D:\apache-tomcat-7.0.35\bin\tomcat-juli.jar"
Invalid initial heap size: -Xms256m -Xmx512m -XX:MaxPermSize=256m
Could not create the Java virtual machine.

catalina.bat 是原创的,我也检查了所有路径和选项(即 JAVA_HOME、JRE_HOME、CATALINA_BASE、CATALINA_HOME、CATALINA_TMPDIR)。 tomcat 版本是 7.0.35 java v 1.6

【问题讨论】:

你能分享定义这些变量的文件内容吗 'service.bat',是原始的,放在bin目录下 编辑控制台输出 已安装 4g 内存 :) 【参考方案1】:

这是你的问题 Invalid initial heap size: -Xms256m -Xmx512m -XX:MaxPermSize=256m

某些系统(可能是 Windows JRE)可以理解以小写字母给出的 XmsXmx 值。这里 256m 和 512m 分别表示 256MB 和 512MB。

某些机器(Ubuntu 上的 JDK 1.7)不理解 small m for MB 。因此,当我更改 Xms256m -Xmx512m ,to => Xms256M -Xmx512M 时,它开始工作了。

P.S -> 在 Ubuntu 15 (JDK) 上安装 IntelliJ 时出现此错误 1.7),我编辑了intelliJ的/bin/idea.vmoptions文件,它开始工作了。

Here is a list 错误设置 XmxXms 值 -

java -Xmx4056M -Xms4056M HelloWorld

问题:VM初始化时出错,对象堆+VM数据的大小超过了最大可表示大小

原因:-Xms 或 -Xmx 的值高于或接近物理内存的大小,因为我的机器有 4GB 内存。

java -Xmx1056M -Xms2056M HelloWorld

问题:VM 初始化期间发生错误,指定的最小和最大堆大小不兼容

原因:-Xms 的值高于-Xmx

java -Xms2056M HelloWorld

问题:VM 初始化时出错,无法为对象堆预留足够的空间

原因:只提供了-Xms,没有提供-Xmx。如果您有拼写错误并且您指定了两次 -Xmx 而不是 -Xmx,您也会收到此错误

java -Xms1024 M -Xmx1024M HelloWorld

问题:VM初始化时出错,初始堆太小

原因:如果你在 1024 和 M 之间有空间,那么 JVM 会假设 -Xms 的大小仅为 1024 字节,并打印错误,因为它太小而 JVM 无法启动

【讨论】:

【参考方案2】:

我在尝试运行 Cassandra 时遇到了这个问题。

卸载 Java 32 位并安装 Java 64 位为我解决了这个问题。

【讨论】:

【参考方案3】:

从here 获得了正确的参数(JAVA_OPTS)。我已将它们设置在 setenv.bat 中。

【讨论】:

【参考方案4】:

在 R 中为深度学习初始化 h2o 时,我遇到了同样的错误。删除了设置的最小内存大小之间的空间:

h2o.init(min_mem_size = "10 G") 我收到错误:

虚拟机初始化过程中发生错误 初始堆太小

删除 10 和 G 之间的空格后,它起作用了:

h2o.init(min_mem_size = "10G")

【讨论】:

工作感谢!我的问题是我忘了写字母 G【参考方案5】:

问题:您尝试初始化应用程序的最小和最大堆大小,但您似乎遇到了一些语法问题。您需要正确设置它。请注意,您支持的最小和最大尺寸点与您的应用程序正在运行的机器内存相关。

来自 Oracle Documentation

-Xms
The -Xms option sets the initial and minimum Java heap size.
The Java heap (the “heap”) is the part of the memory where blocks of memory
are allocated to objects and freed during garbage collection.

Note:   -Xms does not limit the total amount of memory that the JVM can use.
Format: -Xms<size>[g|G|m|M|k|K]


-Xmx
This option sets the maximum Java heap size.
The Java heap (the “heap”) is the part of the memory where blocks of memory 
are allocated to objects and freed during garbage collection.
Depending upon the kind of operating system you are running,
the maximum value you can set for the Java heap can vary.

Note:   -Xmx does not limit the total amount of memory that the JVM can use.
Operation
Format: -Xmx<size>[g|G|m|M|k|K]

示例

java cli java -Xs:64m -Xmx:1g -jar app.jar

关于 docker-compose.yml 示例(不同的语法):

version: '3'
services:
  jenkins:
    image: jenkins/jenkins:lts
    container_name: jenkins
    user: jenkins
    environment:
      - JAVA_OPTS=-Xms512m -Xmx2048m 
    ports:
      - "0.0.0.0:8080:8080"

【讨论】:

【参考方案6】:

在我的情况下,原因是在-javaagent 之前有-Xms 选项。以正确的顺序执行它java -javaagent:xxx -Xms256m 成功了。

【讨论】:

【参考方案7】:

即使系统中有可用的物理内存,您也可能会遇到此问题。 在大多数 32 位 Java 版本上,最大堆大小范围为 1.4G 到 1.6G。欲了解更多详情,请通过此link

如果你必须将超过 1.4G 的 JVM 初始化为 1.6G 的堆内存,那么你应该安装 64 位 java 版本。

【讨论】:

以上是关于初始堆大小无效。无法创建Java虚拟机的主要内容,如果未能解决你的问题,请参考以下文章

Java虚拟机五 堆的参数配置

了解java虚拟机—非堆相关参数设置

java虚拟机中的对象的创建

探秘Java虚拟机——内存管理与垃圾回收(转)

理解JAVA虚拟机(下)

Java 堆