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

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 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,那么环境变量是可能会丢失的哦。

相关实践学习
利用Elasticsearch实现地理位置查询
本实验将分别介绍如何使用Elasticsearch7.10版本进行全文检索、多语言检索和地理位置查询三个Elasticsearch基础检索子场景的实现。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
2天前
|
网络协议 Java 应用服务中间件
解决java.net.ConnectException: Connection refused:connect报错
解决java.net.ConnectException: Connection refused:connect报错
|
6天前
|
存储 Ubuntu Java
【Linux】已解决:Ubuntu虚拟机安装Java/JDK
【Linux】已解决:Ubuntu虚拟机安装Java/JDK
13 1
|
12天前
|
Java
Error:Internal error: (java.lang.IllegalAccessError) class com.,idea2019.3版本,必须用application2.7.6或者以下
Error:Internal error: (java.lang.IllegalAccessError) class com.,idea2019.3版本,必须用application2.7.6或者以下
|
16天前
|
Unix Docker 容器
使用docker 启动naocs 报错出现:standard_init_linux.go:241: exec user process caused "exec format error"
```markdown Error in Docker container startup: "standard_init_linux.go:241: exec user process caused \"exec format error\"". Occurred at 2024-06-29 09:26:19.910, followed by a failed hook with a syslog delivery error at 09:27:20.193. Seeking solutions from experts. ```
|
20天前
|
Java Shell Nacos
centos7.x使用nacos2.1.0(解决JAVA_HOME、javac报错)
centos7.x使用nacos2.1.0(解决JAVA_HOME、javac报错)
22 1
|
20天前
|
Java Linux
Java执行Linux命令
Java执行Linux命令
25 2
|
2天前
|
easyexcel Java Apache
EasyExcel导入的时候报错Caused by: java.lang.NoClassDefFoundError: org/apache/poi/poifs/filesystem/File
EasyExcel导入的时候报错Caused by: java.lang.NoClassDefFoundError: org/apache/poi/poifs/filesystem/File
|
2天前
|
Java
idea启动java服务报错OutOfMemoryError: GC overhead limit exceeded解决方法
idea启动java服务报错OutOfMemoryError: GC overhead limit exceeded解决方法
|
10天前
|
存储 Java Linux
Java面试之Linux和docker
Java面试之Linux和docker
13 0
|
10天前
|
Java Linux Shell
Linux软件安装和部署Java代码
Linux软件安装和部署Java代码
13 0