Linux|操作系统|Error: Could not create the Java Virtual Machine 报错的解决思路

本文涉及的产品
Elasticsearch Serverless通用抵扣包,测试体验金 200元
简介: Linux|操作系统|Error: Could not create the Java Virtual Machine 报错的解决思路

现在都流行kubernetes这样的云原生了,因此,很多Java微服务也都集成到类似kubernetes这样的环境下了,毫无疑问的,kubernetes会省去很多环境问题,而最近在部署一个二进制Java项目的时候,遇到了Error: Could not create the Java Virtual Machine 这样的报错

虽然很多年前也遇到过这样的问题,但基本都是很快解决掉了,而这次的问题是比较隐蔽的一个环境问题,感觉类似的问题还是做一个记录比较好,省的以后又忘掉了。

一,

具体报错

[root@node1 ~]# su - es -c "/data/es/bin/elasticsearch"
Unrecognized VM option 'UseConcMarkSweepGC'
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

没错,我说的这个Java项目其实就是二进制的elasticsearch,第一反应就是java的版本不对了

那么,这个报错Error: Could not create the Java Virtual Machine 单从字面理解,就是无法创建Java的虚拟机,也就是jvm, 这个很容易理解。

Unrecognized VM option 'UseConcMarkSweepGC' 这个单从字面理解,是Java的gc也就是内存回收出问题了,这个也很容易理解。

因此,排查方向有三个:

  • 服务器内存不足,通过free -mh 命令查看剩余内存是否满足java项目的启动
  • jdk版本过高或者过低,相对你的Java项目来说,通常是 java -version 查看java版本是否和环境变量设定一致
  • Java项目里的jvm参数配置过高,超出本机可分配内存数,例如,本机内存就4G,Xms设置6G。这无论如何是不可能启动Java项目的。

二,

问题解决思路

那么,我要说的是,这种报错,其实Unrecognized VM option 'UseConcMarkSweepGC' 是一个误导,90%的概率是Java的版本不对了,要么高,要么低

那么,如何判断是Java版本的问题呢?

由于启动elasticsearch是su - 过去的,也就是用的是es的环境变量,那么,此时如果有两个jdk,root使用的是openjdk8,es用户使用的是openjdk19,很显然,此时elasticsearch会使用openjdk19,而我的elasticsearch版本是6.3.2,很明显的,jdk的版本过高,自然就出这个报错了。

[root@node1 es]# tail -n 10 /etc/profile
PGDATA=/usr/local/pgsql/data
export PGDATA
PGHOME=/usr/local/pgsql
export PGHOME
PATH=$PATH:$PGHOME/bin:$PGDATA
export PATH PGDATA
export JAVA_HOME=/usr/local/jdk
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

es用户

[es@node1 ~]$ cat ~/.bash_profile 
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi
# User specific environment and startup programs
export PATH PGDATA
export JAVA_HOME=/home/es/jdk
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
PATH=$PATH:$HOME/.local/bin:$HOME/bin
export PATH

此时,es用户的环境变量将会覆盖全局变量(/etc/profile 这个文件的变量是全局变量,对于普通用户来说,自己的变量等级是更高的)

因此,清除es用户的环境变量即可,也就是统一一个jdk版本,.bash_profile 这样的文件的相关环境变量或者删除或者注释就可以了。

注意,普通用户的环境变量就一个.bash_profile,而全局环境变量是两个文件定义,一个是/etc/profile 一个是/etc/bashrc  /etc/bashrc的优先等级是比/etc/bashrc 高的哦~~~~!!!!

一个操作系统是可以安装多个不同版本的jdk,并且一个环境文件用jdk8,一个环境文件用jdk17 18 等等,但最后只会有一个变量生效。

如何证明两者的优先级?

两个文件同时写入同一个变量AAA,profile里的变量值是123456  bashrc里的变量是fuckman,那么,此时echo AAA 只会是fuckman而不会是12345,env里记录的也只会是fuckman哦!!!!!!!~~~~~~

[root@node1 ~]# tail -n 1 /etc/profile
export AAA=123456
[root@node1 ~]# tail -n 1 /etc/bashrc
export AAA=fuckman
[root@node1 es]# source /etc/profile
[root@node1 es]# source /etc/bashrc
[root@node1 ~]# env |grep AAA
AAA=fuckman
[root@node1 ~]# echo $AAA
fuckman

环境是非常重要的,不要随意设置环境,建议是统一到/etc/profile 这一个文件里,bashrc 是和bash绑定的,shell要是换了,比如换成zsh,那么环境变量是可能会丢失的哦。

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
目录
相关文章
|
9天前
|
分布式计算 Java Hadoop
java使用hbase、hadoop报错举例
java使用hbase、hadoop报错举例
50 6
|
25天前
|
Java API 开发工具
【Azure Developer】Java代码实现获取Azure 资源的指标数据却报错 "invalid time interval input"
在使用 Java 调用虚拟机 API 获取指标数据时,因本地时区设置非 UTC,导致时间格式解析错误。解决方法是在代码中手动指定时区为 UTC,使用 `ZoneOffset.ofHours(0)` 并结合 `withOffsetSameInstant` 方法进行时区转换,从而避免因时区差异引发的时间格式问题。
125 3
|
2月前
|
Android开发
复杂项目即时通讯从android 5升级android x后遗症之解决报错#79 java.io.EOFException Unexpected end of ZLIB input stream-优雅草卓伊凡|bigniu
复杂项目即时通讯从android 5升级android x后遗症之解决报错#79 java.io.EOFException Unexpected end of ZLIB input stream-优雅草卓伊凡|bigniu
131 4
复杂项目即时通讯从android 5升级android x后遗症之解决报错#79 java.io.EOFException Unexpected end of ZLIB input stream-优雅草卓伊凡|bigniu
|
2月前
|
Java Linux Apache
Apache NetBeans 27 (macOS, Linux, Windows) - Java 等多语言开源跨平台 IDE
Apache NetBeans 27 (macOS, Linux, Windows) - Java 等多语言开源跨平台 IDE
141 5
Apache NetBeans 27 (macOS, Linux, Windows) - Java 等多语言开源跨平台 IDE
|
2月前
|
Web App开发 缓存 Rust
|
2月前
|
Ubuntu Unix Linux
操作系统的最强入门科普(Unix/Linux篇)
下期文章,小枣君会重点聊聊Windows和macOS那条线。敬请关注! 如果大家觉得文章不错,还请帮忙多多转发!谢谢!
|
3月前
|
Java Shell Maven
【Azure Container App】构建Java应用镜像时候遇无法编译错误:ERROR [build 10/10] RUN ./mvnw.cmd dependency:go-offline -B -Dproduction package
在部署Java应用到Azure Container App时,构建镜像过程中出现错误:“./mvnw.cmd: No such file or directory”。尽管项目根目录包含mvnw和mvnw.cmd文件,但依然报错。问题出现在Dockerfile构建阶段执行`./mvnw dependency:go-offline`命令时,系统提示找不到可执行文件。经过排查,确认是mvnw文件内容异常所致。最终通过重新生成mvnw文件解决该问题,镜像成功构建。
|
4月前
|
Java Linux 开发者
linux 查看java的安装路径
本指南详细介绍Java环境的安装验证与配置方法,包括检查Java版本、确认环境变量JAVA_HOME是否正确配置,以及通过which和readlink命令手动定位Java安装路径。同时提供系统级环境变量配置步骤,并给出多版本管理建议。适用于Linux系统用户,特别是需要在服务器或Docker容器中部署Java环境的开发者。注意操作时需具备相应权限,确保路径设置准确无误。
|
5月前
|
Java
Java 中 Exception 和 Error 的区别
在 Java 中,`Exception` 和 `Error` 都是 `Throwable` 的子类,用于表示程序运行时的异常情况。`Exception` 表示可被捕获和处理的异常,分为受检异常(Checked)和非受检异常(Unchecked),通常用于程序级别的错误处理。而 `Error` 表示严重的系统级问题,如内存不足或 JVM 错误,一般不建议捕获和处理。编写程序时应重点关注 `Exception` 的处理,确保程序稳定性。
118 0
|
6月前
|
监控 数据可视化 Java
调试技巧 - 用Linux命令排查Java问题
总的来说,使用Linux命令来排查Java问题,需要一定的实践经验和理论知识。然而,只要我们愿意花时间深入了解这些工具,我们就能够熟练地使用它们来分析和解决问题。此外,这些工具只是帮助我们定位问题,真正解决问题需要我们对Java和JVM有深入的理解,并能够读懂和分析代码。
366 13