現(xiàn)在都流行kubernetes這樣的云原生了,因此,很多Java微服務(wù)也都集成到類似kubernetes這樣的環(huán)境下了,毫無疑問的,kubernetes會省去很多環(huán)境問題,而最近在部署一個二進(jìn)制Java項目的時候,遇到了Error: Could not create the Java Virtual Machine?這樣的報錯
雖然很多年前也遇到過這樣的問題,但基本都是很快解決掉了,而這次的問題是比較隱蔽的一個環(huán)境問題,感覺類似的問題還是做一個記錄比較好,省的以后又忘掉了。
一,
具體報錯
[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項目其實就是二進(jìn)制的elasticsearch,第一反應(yīng)就是java的版本不對了
那么,這個報錯Error: Could not create the Java Virtual Machine??單從字面理解,就是無法創(chuàng)建Java的虛擬機(jī),也就是jvm,?這個很容易理解。
Unrecognized VM option 'UseConcMarkSweepGC'?這個單從字面理解,是Java的gc也就是內(nèi)存回收出問題了,這個也很容易理解。
因此,排查方向有三個:
- 服務(wù)器內(nèi)存不足,通過free -mh?命令查看剩余內(nèi)存是否滿足java項目的啟動
- jdk版本過高或者過低,相對你的Java項目來說,通常是?java -version?查看java版本是否和環(huán)境變量設(shè)定一致
- Java項目里的jvm參數(shù)配置過高,超出本機(jī)可分配內(nèi)存數(shù),例如,本機(jī)內(nèi)存就4G,Xms設(shè)置6G。這無論如何是不可能啟動Java項目的。
二,
問題解決思路
那么,我要說的是,這種報錯,其實Unrecognized VM option 'UseConcMarkSweepGC'?是一個誤導(dǎo),90%的概率是Java的版本不對了,要么高,要么低
那么,如何判斷是Java版本的問題呢?
由于啟動elasticsearch是su -?過去的,也就是用的是es的環(huán)境變量,那么,此時如果有兩個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用戶的環(huán)境變量將會覆蓋全局變量(/etc/profile?這個文件的變量是全局變量,對于普通用戶來說,自己的變量等級是更高的)
因此,清除es用戶的環(huán)境變量即可,也就是統(tǒng)一一個jdk版本,.bash_profile??這樣的文件的相關(guān)環(huán)境變量或者刪除或者注釋就可以了。
注意,普通用戶的環(huán)境變量就一個.bash_profile,而全局環(huán)境變量是兩個文件定義,一個是/etc/profile?一個是/etc/bashrc??/etc/bashrc的優(yōu)先等級是比/etc/bashrc?高的哦~~~~?。。。?/strong>
一個操作系統(tǒng)是可以安裝多個不同版本的jdk,并且一個環(huán)境文件用jdk8,一個環(huán)境文件用jdk17 18?等等,但最后只會有一個變量生效。
如何證明兩者的優(yōu)先級?
兩個文件同時寫入同一個變量AAA,profile里的變量值是123456? bashrc里的變量是fuckman,那么,此時echo?AAA?只會是fuckman而不會是12345,env里記錄的也只會是fuckman哦?。。。。。?!~~~~~~文章來源:http://www.zghlxwxcb.cn/news/detail-821933.html
[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
環(huán)境是非常重要的,不要隨意設(shè)置環(huán)境,建議是統(tǒng)一到/etc/profile?這一個文件里,bashrc?是和bash綁定的,shell要是換了,比如換成zsh,那么環(huán)境變量是可能會丟失的哦。文章來源地址http://www.zghlxwxcb.cn/news/detail-821933.html
到了這里,關(guān)于Linux|操作系統(tǒng)|Error: Could not create the Java Virtual Machine 報錯的解決思路的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!